node的第三方模块又叫包
安装的三方包的方式 npm install 包的名称或 npm i 包的名称,初次装包完成会出现一个叫node_modules的文件夹和package.json的配置文件,package-lock.json配置文件用来记录node_modules目录下的每一个包的下载信息,例如包的名字、版本号、下载地址等。(nodejs使用npm安装包速度很慢,是因为默认从国外的https://registry.npmjs.org/服务器进行下载,此时网络数据的传输需要进过漫长的海底光缆,因此下包速度会很慢,可以切换使用国内镜像源npm install -g cnpm --registry=https://registry.npm.taobao.org)
安装指定版本的包
默认情况下,使用npm install命令安装包的时候,会自动安装最新版本的包,如果需要安装指定版本的包,可以在包名之后,通过@符号指定具体的版本,例如:
npm i moment@2.22.2
包的语义化版本规范
包的版本号是以“点分十进制”形式进行定义的,总共有三位数字,例如2.24.0
第一位数字:大版本 第二位数字:功能版本 第三位数字:bug修复版本
版本号提升的规则:只要前面的版本号增长了,则后面的版本号归零。
包管理配置文件
npm规定,在项目根目录中,必须提供一个叫做package.json的包管理配置文件。用来记录与项目有关的一些配置信息。例如:
项目的名称、版本号、描述等;项目都用到了哪些包;哪些包只在开发期间会用到;哪些包在开发和部署时都需要用到
在项目根目录中,创建一个叫做package.json的配置文件,即可用来记录项目中安装了哪些包。从而方便剔除node_modules目录之后,在团队成员之间共享项目的源代码。
注意:在项目开发中,一定要把node_modules文件夹,添加到.gitignore忽略文件中。
快速创建package.json
npm包管理工具提供了一个快捷命令,可以在执行命令时所处的目录中,快速创建package.json这个包管理配置文件:
//作用:在执行命令所处的目录中,快速新建package.json文件
npm init -y
一次性安装所有的包
可以运行npm install命令(或npm i)一次性安装所有的依赖包:
//执行npm install命令时,npm包管理工具先读取package.json中的dependencies节点,读取到记录的所有依赖包名称和版本号之后,npm包管理工具会把这些包一次性下载到项目中。
npm install
卸载包
可以运行npm uninstall命令,来卸载指定的包
npm uninstall moment
devDependencies节点
如果某些包只在项目开发阶段会用到,在项目上线之后不会用到,则建议把这些包记录到devDependencies节点中。与之对应的,如果某些包在开发和项目上线之后都需要用到,则建议把这些包记录到dependencies节点中。
//安装指定的包,并记录到devDependencies节点中
npm i 包名 -D
//完整写法
npm install 包名 --save-dev
包的分类
使用npm包管理工具下载的包,共分为两大类,分别是:项目包和全局包
项目包:被安装到项目的node_modules目录中的包,都是项目包。
项目包又分为两类,分别是:
开发依赖包(被记录到devDependencies节点中的包,只在开发期间会用到)
核心依赖包(被记录到dependencies节点中的包,在开发期间和项目上线之后都会用到)
npm i 包名 -D //开发依赖包(会被记录到devDependencies节点下)
npm i 包名 //核心依赖包(会被记录到dependencies节点下)
全局包:在执行npm install命令时,如果提供了-g参数,则会把包安装为全局包
全局包会被安装到C:\Users\用户\AppData\Roaming\npm\node_modules目录下。
npm i 包名 -g //全局安装指定的包
npm uninstall 包名 -g //卸载全局安装的包
规范的包结构
一个规范的包,它的组成结构,必须符合以下3点要求:
包必须以单独的目录而存在
包的顶级目录下要必须包含package.json这个包管理配置文件
package.json中必须包含name,version,main这三个属性,分别代表包的名字、版本号、包的入口
模块的加载机制
模块在第一次加载后会被缓存。这也意味着多次调用require()不会导致模块的代码被执行多次。
注意:不论是内置模块、用户自定义模块还是第三方模块,它们都会优先从缓存中加载,从而提高模块的加载效率。
内置模块的加载机制
内置模块是有nodejs官方提供的模块,内置模块的加载优先级最高。
自定义模块的加载机制
使用require()加载自定义模块时,必须指定以./或../开头的路径标识符。在加载自定义模块时,如果没有指定./或../这样的路径标识符,则node会把它当做内置模块或第三方模块进行加载。
同时,在使用require()导入自定义模块时,如果省略了文件的扩展名,则nodejs会按顺序分别尝试加载如下的文件:
按照确切的文件名进行加载
补全.js扩展名进行加载
补全.json扩展名进行加载
补全.node扩展名进行加载
加载失败,终端报错
第三方模块的加载机制
如果传递给require()的模块标识符不是一个内置模块,也没有以./或../开头,则nodejs会从当前模块的父目录开始,尝试从/node_modules文件夹中加载第三方模块。
如果没有找到对应的第三方模块,则移动到再上一层父目录中进行加载,直到文件系统的根目录。
目录作为模块
当把目录作为模块标识符,传递给require()进行加载的时候,有三种加载方式:
在被加载的目录下查找一个叫做package.json的文件,并寻找main属性,作为require()加载的入口
如果目录里没有package.json文件,或者main入口不存在或无法解析,则nodejs将会试图加载目录下的index.js文件。
如果以上两步都失败了,则nodejs会在终端打印错误消息,报告模块的缺失:Error:Cannot find module 'xxx'
node发布/取消发布包
npm publish(确保有npm账号)
npm unpublish(取消发布)
npm unpublish --force (强制取消)
取消之后再次发布版本号要递增
网友评论