【node】模块化与包(二)

news2024/11/20 13:36:01

1、模块化的基本概念

模块化是指解决一个复杂的问题时,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元。

(1)模块化的优点

遵循固定规则,把大文件拆分成对立并相互依赖的多个小模块

好处:

  • 提高代码的复用性;
  • 提高代码的可维护性;
  • 可以按需加载;

 (2)模块化规范

用什么语法格式引用模块,用什么语法格式向外暴露成员

2、CommonJS规定内容

CommonJS规定了模块特性和各模块之间如何相互依赖。

① 每个模块内部,module变量代表当前模块。

② module变量是一个对象,它的exports属性(module.exports)是对外的接口。

③ 加载某个模块其实是加载该模块的module.exports属性,用require()方法用于加载模块。

3、Node.js中模块三大分类

  • 内置模块(内置模块是由Node.js官方提供的,例如path,fs,http)
  • 自定义模块(用户创建的每个JS文件都是自定义模块)
  • 第三方模块(由第三方开发的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要下载)

 (1)require()方法可以加载需要的内置模块、用户自定义模块、第三方模块进行使用。

const http = require('http');

使用require()方法加载其他模块时,会执行被加载模块中代码。

在使用require()加载用户自定义模块期间,可以省略.js的后缀名。

(2)模块作用域

在自定义模块中的变量以及方法等成员,只能在当前模块内被访问,这种模块级别的访问限制叫做模块作用域。(防止全局变量污染问题)

  (3) 向外共享模块作用域中的成员

       ① module对象 :每个JS自定义模块中都有一个module对象,里面存储了当前模块有关信息。

         ② module.exports 对象: 在自定义模块中,将模块内的成员共享出去,供外界使用。(外界用require方法导入的自定义模块时,就是module.export所指对象)

// 文件一 module.js
module.exports.username = 'sss'

module.exports.sayHello = function(){
    console.log('Hello!')
}

// 文件二
const m = require('./module');
console.log(m);

// 文件二引用文件一结果 m打印结果
// { username: 'sss', sayHello: [Function (anonymous)] }

使用require()方法导入模块时,导入的结果永远module.exports指向的对象为准

        ③ exports对象 : 默认情况下 exports和module.exports指向同一个对象。最终共享的结果还是以module.exports指向的对象为准

1、require() 模块,永远都是module.export所指对象

4、npm包管理

(1)包的概念

Node.js中第三方模块叫做包。

包是由第三方个人或者团队开发出来的,基于内置模块封装出来的,免费共所有人使用,目的提高开发效率。

http://www.npmjs.com/

(2)常用指令

查看npm版本: npm -v

安装包:npm install 包完整名称/ npm i 包完整名称

安装指定版本的包(无需卸载):npm i 包名称@版本号

卸载:npm uninstall 包名称

版本号是点分十进制:第一位大版本,第二位功能版本,第三位bug修复版本,只要前面版本号增长了,后面版本就会归零。

(3)包的导入

// 导入需要的包,名称就是装包的名称
const moment = require(moment)

安装完成包后,项目文件夹多了node_modules和package-lock.json配置文件

node_modules:所有已安装到项目里的包

package-lock.json:包下载信息
(4)包管理配置文件(package-lock.json)

因为第三方包过大,共享时剔除node_modules

创建package.json: npm init -y(路径项目文件夹不能有中文空格)

dependencies:记录npm哪些包,开发和上线之后都用

devDependencies节点:开发用,上线后不用 npm i 包名称 -D

(5)使用cnpm与nrm

解决下包慢的问题:淘宝NPM镜像服务器

切换npm下包镜像源

// 查看当前下包镜像源
npm config get registry
// 更换为淘宝镜像
// https://registry.npm.taobao.org/已经过期了
npm config set registry=npm config set registry https://registry.npmmirror.com
// 检查是否下载成功
npm config get registry

nrm:快速查看和切换下包的镜像源

// 通过npm包管理器,将nrm安装为全局可用的工具
npm i nrm -g
// 查看所有可用镜像源
nrm ls
// 将下包镜像源切换为淘宝镜像
nrm use taobao

5、规范的包结构

包的分类:项目包、全局包

项目包分为开发依赖包与核心依赖包,开发依赖包只在开发期间用到,核心依赖包在开发期间与项目上线都会用到

全局包:安装到node_modules中 安装时 npm i 包名称 -g

安装i5ting_toc:npm install -g i5ting_toc

// 调用i5ting_toc,实现md文件转换html功能
i5ting_toc -f 要转换md文件路径 -o

 包的规范

一个规范的包,它的组成结构,必须符合以下3点要求:
① 包必须以单独的目录而存在;
② 包的顶级目录下要必须包含 package.json 这个包管理配置文件;
③ package.json 中必须包含 name,version,main 这三个属性,分别代表包的名字、版本号、包的入口,

6、发布包

以test-tools举例

(1)初始化包的基本结构

        ① 新建 test-tools 文件夹,作为包的根目录
        ② 在 test-tools 文件夹中,新建如下三个文件:
                package.json (包管理配置文件)
                index.js (包的入口文件)
                README.md(包的说明文档)

(2) 初始化package.json

{
"name": "test-tools",
"version": "1.0.0",
"main": "index.js",
"description":"提供了xxxx的功能",
"keywords". ["xx1", "xx2", "xx3"],
"license": "IsC"
}

 (3) 设计入口文件(main属性设计的入口文件)

// index.js
function xx1(){
    ...
    return
}

function xx2(){
    ...
    return
}
...

// 向外暴露需要成员
module.exports ={
    xx1;
}

(4) 模块化拆分

① 将不同功能拆分到不同js中去

② 在index.js中导入两个模块

③ 在index.js中,使用module.exports把对应方法共享出去

(5)把包发布到npm上

编写说明文档README.md是包的说明文档,markdown格式

安装方式、导入方式、功能模块的说明、开源协议

① 注册npm账号

② 终端登录npm账号(先切换官方服务器,不能用淘宝服务器)。上传包。

// 登录
npm login
// 把包发布到npm上,包名不能重复
npm publish

 ③ 如果要删除已发布包(72h 以内),删除后24小时不能重复发布

npm unpublish 包名称 --force

7、模块加载机制

(1)优先从缓存中加载:模块第一次加载后会缓存,多次调用require不会执行多次

(2)内置模块加载优先级最高

(3)自定义模块必须以./或者../开头路径标识符,扩展名加载顺序:确切文件名加载-.js-.json-.node-加载失败

(4)第三方模块加载机制,不是内置模块,也没有相对路径开头,从当前目录开始,尝试从node_modules文件中加载第三方模块,直到文件系统根目录为止

(5)目录作为模块,先寻找package.json,找main属性作为入口,如果没有或者入口不能解析,则从加载目录下找寻index.js文件,如果还是找不到,则报错:Error:Cannot find module 'xxx'


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1514150.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python使用FastAPI提供图片缩略图生成接口

使用pillow的thumbnail生成缩略图时,会保持原图的宽高比;使用的opencv的resize则不会 具体代码如下: #!/usr/bin/env python import re import sys from enum import Enum from io import BytesIO from pathlib import Path from typing im…

蓝桥杯 2022 dp 背包

蓝桥杯 2022 dp 背包 题目链接&#xff1a; https://www.lanqiao.cn/problems/2186/learning/?subject_code1&group_code4&match_num13&match_flow2&origincup 题目&#xff1a; 代码&#xff1a; #include<bits/stdc.h> using namespace std;#defi…

王道机试C++第6章 数学问题和22年蓝桥杯省赛选择题Day34

6.1 进制转换 二进制数&#xff08;十转二&#xff09; 习题描述 大家都知道&#xff0c;数据在计算机里中存储是以二进制的形式存储的。 有一天&#xff0c;小明学了C语言之后&#xff0c;他想知道一个类型为unsigned int 类型的数字&#xff0c;存储在计算机中的二进制串是…

多数问题求解之蒙特卡洛与分治法

多数问题&#xff08;Majority Problem&#xff09;是一个有多种求解方法的经典问题&#xff0c;其问题定义如下&#xff1a; 给定一个大小为 n n n的数组&#xff0c;找出其中出现次数超过 n / 2 n/2 n/2的元素 例如&#xff1a;当输入数组为 [ 5 , 3 , 5 , 2 , 3 , 5 , 5 ] […

JavaEE:网络编程

网络编程&#xff1a;通过代码完成基于网络的跨主机通信 跨主机通信方式&#xff1a; 1.TCP/IP网络 2.蓝牙通信 3.近场通信NFC 4.毫米波通信&#xff1a;功率高&#xff0c;带宽高&#xff0c;抗干扰能力差 其中TCP/IP网络是日常编程中最常涉及到的&#xff0c;最通用的跨主机通…

深度学习进阶:揭秘强化学习原理,实战应用全解析!

作为机器学习领域的一大分支&#xff0c;强化学习以其独特的学习方式吸引了众多研究者和实践者的目光。强化学习&#xff0c;顾名思义&#xff0c;是通过不断地强化与环境的交互来优化决策策略。在这个过程中&#xff0c;智能体通过试错&#xff0c;根据环境给出的奖励信号来调…

Linux:导出环境变量命令export

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的内建命令export命令用于创建一个环境变量&#xff0c;或将一个普通变量导出为环境变量&#xff0c;并且在这个过程中&#xff0c;可以给该环境变量赋值。 下面…

产品测试方案:视频接入平台并发性能测试方案和报告(即150路视频并发流媒体服务器模块的性能测试方案和报告)

目 录 一、测试目的&#xff1a; 二、测试方案&#xff1a; 2.1、测试思路 2.2、拓扑图 三、测试环境 3.1 服务器配置 3.2 网络摄像机列表 3.3 测试软件 四、测试流程 4.1 H.264并发测试&#xff1a; 4.1.1老版本srsout3.10并发测试 4.1.2 新版本srsout…

反无人机电子护栏:原理、算法及简单实现

随着无人机技术的快速发展&#xff0c;其在航拍、农业、物流等领域的应用日益广泛。然而&#xff0c;无人机的不规范使用也带来了安全隐患&#xff0c;如侵犯隐私、干扰航空秩序等。为了有效管理无人机&#xff0c;反无人机电子护栏技术应运而生。 目录 一、反无人机电子护栏…

代码随想录算法训练营Day46 ||leetCode 139.单词拆分 || 322. 零钱兑换 || 279.完全平方数

139.单词拆分 class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordSet(wordDict.begin(), wordDict.end());vector<bool> dp(s.size() 1, false);dp[0] true;for (int i 1; i < s.size(); …

【Linux】-Linux下的软件商店yum工具介绍(linux和windows互传文件仅仅一个拖拽搞定!!!!)

目录 1.Linux 软件包管理器yum 1.1快速认识yum 1.2 yumz下载方式&#xff08;如何使用yum进行下载&#xff0c;注意下载一定要是root用户或者白名单用户&#xff08;可提权&#xff09;&#xff09; 1.2.1下载小工具rzsz 1.2.2 rzsz使用 1.2.2查看软件包 1.3软件的卸载 2.yum生…

Grapher教程—重建长江中下游降雨量时间变化序列

各位朋友好&#xff01;非常激动&#xff01;新学了一个科研绘图软件&#xff0c;它的大名叫“Grapher”&#xff0c;也许在科研界早已如雷贯耳&#xff0c;但在我这&#xff0c;还得是第一次遇见你&#xff01;来看看小编在老师的指导下鼓捣了三节课搞出来的图。 就问大家&…

6.Java并发编程—深入剖析Java Executors:探索创建线程的5种神奇方式

Executors快速创建线程池的方法 Java通过Executors 工厂提供了5种创建线程池的方法&#xff0c;具体方法如下 方法名描述newSingleThreadExecutor()创建一个单线程的线程池&#xff0c;该线程池中只有一个工作线程。所有任务按照提交的顺序依次执行&#xff0c;保证任务的顺序性…

Mybatis-Plus实现常规增删改操作

文章目录 3.1 MP实现插入操作3.1.1 BaseMapper定义操作方法3.1.2 代码测试 3.2 MP主键字段注解-TableId3.2.1 注解TableId介绍3.2.2 MP主键生成策略介绍3.2.3 MP常用主键生成策略3.2.4 雪花算法(了解) 3.3 普通列注解-TableField3.3.1 注解TableField作用3.3.2 代码示例 3.4.MP…

自适应差分进化算法(SaDE)和差分进化算法(DE)优化BP神经网络

自适应差分进化算法(SaDE)和差分进化算法(DE)优化BP神经网络 自适应差分进化算法(SaDE)和差分进化算法(DE)可以用于优化神经网络中的参数&#xff0c;包括神经网络的权重和偏置。在优化BP神经网络中&#xff0c;DE和SaDE可以帮助找到更好的权重和偏置的组合&#xff0c;以提高…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的交通标志识别系统详解(深度学习模型+UI界面代码+训练数据集)

摘要&#xff1a;本篇博客详细介绍了利用深度学习构建交通标志识别系统的过程&#xff0c;并提供了完整的实现代码。该系统采用了先进的YOLOv8算法&#xff0c;并与YOLOv7、YOLOv6、YOLOv5等早期版本进行了性能评估对比&#xff0c;分析了性能指标如mAP、F1 Score等。文章深入探…

4、设计模式之建造者模式(Builder)

一、什么是建造者模式 建造者模式是一种创建型设计模式&#xff0c;也叫生成器模式。 定义&#xff1a;封装一个复杂对象构造过程&#xff0c;并允许按步骤构造。 解释&#xff1a;就是将复杂对象的创建过程拆分成多个简单对象的创建过程&#xff0c;并将这些简单对象组合起来…

吴恩达机器学习-可选实验室:逻辑回归,决策边界(Logistic Regression,Decision Boundary))

文章目录 目标数据集图数据逻辑回归模型复习逻辑回归和决策边界绘图决策边界恭喜 目标 在本实验中&#xff0c;你将:绘制逻辑回归模型的决策边界。这会让你更好地理解模型的预测。 import numpy as np %matplotlib widget import matplotlib.pyplot as plt from lab_utils_co…

Python逆向:pyc字节码转py文件

一、 工具准备 反编译工具&#xff1a;pycdc.exe 十六进制编辑器&#xff1a;010editor 二、字节码文件转换 在CTF中&#xff0c;有时候会得到一串十六进制文件&#xff0c;通过010editor使用查看后&#xff0c;怀疑可能是python的字节码文件。 三、逆向反编译 将010editor得到…

【网络工程师进阶之路】BFD技术

个人名片&#xff1a;&#x1faaa; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&a…