1. 包的来源
不同于NodeJs中内置模块与自定义模块, 包是由第三方个人或团队开发出来的, 免费共所有人使用。
注意: Node.js中的包都是免费且开源的, 不需要付费即可免费下载使用。
2. 为什么需要包
由于Node.js的内置模块仅提供了一些底层的API, 导致在基于内置模块进行项目开发时, 包是基于内置模块封装出来的, 提供了更高级、更方便的api, 极大的提高了开发效率。
包和内置模块之间的关系, 类似与jquery和浏览器内置api之间的关系。
3. 从哪里下载包
国外有一家IT公司, 叫做npm.inc,这家公司旗下有非常有名的网站:
- https://www.npmjs.com。它是全球最大的包共享平台,
- 从https://www.npmjs.com网站搜索自己所需要的包
从https://registry.npmjs.org服务器上下载自己所需要的包
4. 下载包
下载包使用的命令npm install packageName或者npm i packageName
初次装包完成之后, 在项目文件夹多一个叫做node_modules的文件夹和package-lock.json的配置文件。
其中: node_modules文件用来存放所有已经安装到项目中的包,require()导入的第三方时, 就是从这个目录中查找并加载包
package-lock.json配置文件用来记录node_modules目录下的每一个包的下载信息, 例如:包的名字、版本、下载地址等等。
包的语义化规范版本:
包的版本号是以“点分十进制”形式进行定义的, 总共有三位数字, 例如:2.24.0, 其中每一位数字所代表的含义如下:第一位数字: 大版本
- 第二位数字: 功能版本
- 第三位数字: Bug修复版本
版本号提升的规则: 只需要前面的版本号增长, 则后面的版本号归零。
5. 快速创建package.json
npm包管理工具提供了一个快捷命令,可以在执行命令时所处的目录中, 快速创建package.json这个包管理配置文件:
npm init -y
5.1 nrm
为了更方便的切换镜像源, 我们可以安装nrm这个工具, 利用nrm提供的中断命令, 可以快速的查看和切换下包的镜像源。
- 下载nrm: npm i nrm -g
- 查看所有可用的镜像源: nrm ls
-
5.2 包的分类
项目包: 哪些被安装到项目的node_modules目录中的包, 都是项目包。
项目包又分为两类, 分别是: 开发依赖包:被记录到devDependencies节点中的包, 只是在开发期间会用到;
- 核心依赖包: 被记录到dependencies节点中的包, 在开发期间和项目上线之后都会用到
- npm i 包名 -D 开发依赖包
- npm i 包名 核心依赖包
全局包:
在执行npm install命令时, 如果提供-g参数,则会把包安装为全举包。
i5ting_top是一个可以把md文档转为html页面的小工具。
- 全局安装:npm i i5ting_top -g
全局卸载:npm uninstall i5ting_top -g
5.3 规范的包结构
一个规范的包, 它组成结构, 必须符合以下3个要求:
包必须以单独的目录而存在
- 包的顶级目录下要求必须包含package.json这个包管理配置文件
package.json中必须包含name,version,main这三个属性, 分别代表名字、版本号、包的入口。
6. 开发属于自己的包
6.1 初始化基本结构
初始化包的基本结构
新建文件夹, 作为包的根目录
在文件夹中新建以下三个文件夹package.json(包管理配置文件)
- index.js(包的入口文件)
-
6.2 注册npm账号
6.3 发布包
npm 账号注册完之后, 可以在终端执行npm login命令, 一次输入用户名、密码、邮箱后, 即可登录。
6.4 删除已发布的包
7. 模块的加载机制
7.1 优先从缓存中加载
模块在第一次加载后会被缓存。 这也以为着多次调用require()不会导致米快的代码会被执行多次。
注意: 不论是内置模块, 用户自定义模块还是第三方模块, 他们都会有限从缓存中加载, 从而提高模块的加载效率。7.2 自定义模块的加载机制
加载自定义模块时,路径要以 ./ 或 ../ 开头,否则会作为内置模块或第三方模块加载。
导入自定义模块时,若省略文件扩展名,则 Node.js 会按顺序尝试加载文件: 按确切的文件名加载
- 补全 .js 扩展名加载
- 补全 .json 扩展名加载
- 补全 .node 扩展名加载
-
7.3第三方模块的加载机制
若导入第三方模块, Node.js 会从当前模块的父目录开始,尝试从 /node_modules 文件夹中加载第三方模块。
- 如果没有找到对应的第三方模块,则移动到再上一层父目录中,进行加载,直到文件系统的根目录。
例如,假设在 C:\Users\bruce\project\foo.js 文件里调用了 require(‘tools’),则 Node.js 会按以下顺序查找:
- C:\Users\bruce\project\node_modules\tools
- C:\Users\bruce\node_modules\tools
- C:\Users\node_modules\tools
- C:\node_modules\tools