包
- Node.js 中的第三方模块又叫做包 ,第三方模块和包指的是同一个概念
- 包是基于内置模块封装出来的,提供了更高级、更方便的 API,极大的提高了开发效率。
- 包和内置模块之间的关系,类似于 jQuery 和 浏览器内置 API 之间的关系
npm
Node Package Manager(简称 npm 包管理工具)
在项目组安装包 :
npm install 包的完整名称
简写
npm i 包的完整名称
安装指定版本的包,可以在包名之后,通过 @ 符号指定具体的版本
装包后多了哪些文件:
在项目文件夹下多一个叫做 node_modules 的文件夹和 package-lock.json 的配置文件
- node_modules 文件夹用来存放所有已安装到项目中的包。require() 导入第三方包时,就是从这个目录中查找并加载包。
- package-lock.json 配置文件用来记录 node_modules 目录下的每一个包的下载信息,例如包的名字、版本号、下载地址等。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YBplKGFt-1650368557835)(C:\Users\1301338853\AppData\Roaming\Typora\typora-user-images\image-20220419093852596.png)]
版本号提升的规则:只要前面的版本号增长了,则后面的版本号归零
包管理配置文件
npm 规定,在项目根目录中,必须提供一个叫做 package.json 的包管理配置文件。用来记录与项目有关的一些配置信息
- 项目的名称、版本号、描述等
- 项目中都用到了哪些包
- 哪些包只在开发期间会用到
- 那些包在开发和部署时都需要用到
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pfoOEw1v-1650368557836)(C:\Users\1301338853\AppData\Roaming\Typora\typora-user-images\image-20220419095028144.png)]
注意:今后在项目开发中,一定要把 node_modules 文件夹,添加到 .gitignore 忽略文件中
package.json 文件中,有一个 dependencies 节点,专门用来记录您使用 npm install 命令安装了哪些包
一次性安装所有的包
在剔除了node_moudle 文件的项目之后 需要把原有项目的包下载下来
npm i
卸载包
npm uninstall
注意:npm uninstall 命令执行成功后,会把卸载的包,自动从 package.json 的 dependencies 中移除掉
devDependencies节点
- 如果某些包只在项目开发阶段会用到,在项目上线之后不会用到,则建议把这些包记录到 devDependencies 节点中。
- 与之对应的,如果某些包在开发和项目上线之后都需要用到,则建议把这些包记录到 dependencies 节点中
npm i 包名 --save-dev
简写
npm i 包名 -D 安装指定的包并记录到devDependencies 节点中
淘宝npm镜像服务器
镜像(Mirroring)是一种文件存储形式,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像
切换npm 下包镜像资源
下包的镜像源,指的就是下包的服务器地址
# 查看当前的下包镜像源 npm config get registry # 将下包的镜像源切换为淘宝的镜像源 npm config set registry=http://registry.npm.taobao.org/ # 查看镜像源是否下载成功 npm config get registry
nrm
为了更方便的切换下包的镜像源,我们可以安装 nrm 这个小工具,利用 nrm 提供的终端命令,可以快速查看和切换下包的镜像源
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hcJJimuj-1650368557837)(C:\Users\1301338853\AppData\Roaming\Typora\typora-user-images\image-20220419103531688.png)]
包的分类
使用 npm 包管理工具下载的包,共分为两大类:
-
项目包 被安装到项目的 node_modules 目录中的包,都是项目包
-
开发依赖包 被记录到 devDependencies 节点中的包
-
核心依赖包 被记录到 dependencies 节点中的包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lPDvJSVV-1650368557838)(C:\Users\1301338853\AppData\Roaming\Typora\typora-user-images\image-20220419104522814.png)]
-
-
**全局包 执行 npm i 命令时,如果提供了 -g 参数,则为全局包 **
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rBfRE6qV-1650368557839)(C:\Users\1301338853\AppData\Roaming\Typora\typora-user-images\image-20220419104709160.png)]
包的规范结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eLxke2kg-1650368557840)(C:\Users\1301338853\AppData\Roaming\Typora\typora-user-images\image-20220419105753385.png)]
模块的加载机制
优先从内存中加载
- 模块在第一次加载后会被缓存。 这也意味着多次调用 require() 不会导致模块的代码被执行多次。
- 注意:不论是内置模块、用户自定义模块、还是第三方模块,它们都会优先从缓存中加载,从而提高模块的加载效率
1.内置模块的加载机制
- 内置模块是由 Node.js 官方提供的模块,内置模块的加载优先级最高
2.自定义模块的加载机制
- 使用 require() 加载自定义模块时,必须指定以 ./ 或 …/ 开头的路径标识符
3. 第三方模块的加载机制
- 如果传递给 require() 的模块标识符不是一个内置模块,也没有以 ‘./’ 或 ‘…/’ 开头,则 Node.js 会从当前模块的父目录开始,尝试从 /node_modules 文件夹中加载第三方模块
- 如果没有找到对应的第三方模块,则移动到再上一层父目录中,进行加载,直到文件系统的根目录
目录作为模块
当把目录作为模块标识符,传递给 require() 进行加载的时候,有三种加载方式
- 在被加载的目录下查找一个叫做 package.json 的文件,并寻找 main 属性,作为 require() 加载的入口
- 如果目录里没有 package.json 文件,或者 main 入口不存在或无法解析,则 Node.js 将会试图加载目录下的 index.js 文件
- 如果以上两步都失败了,则 Node.js 会在终端打印错误消息,报告模块的缺失:Error: Cannot find module ‘xxx’
require() 加载的入口** - 如果目录里没有 package.json 文件,或者 main 入口不存在或无法解析,则 Node.js 将会试图加载目录下的 index.js 文件
- 如果以上两步都失败了,则 Node.js 会在终端打印错误消息,报告模块的缺失:Error: Cannot find module ‘xxx’