摘要:本文主要学习了Node的管理工具,包括NPM和NVM,以及NRM,还介绍了Yarn管理工具,并比较了NPM和Yarn的区别。
环境
Windows 10 企业版 LTSC 21H2
Node 18.14.0
NPM 9.3.1
NVM 1.1.12
1 概述
1.1 NPM(Node Package Manager)
NPM是Node的默认包管理工具,用于安装、更新、卸载和管理JS包。它还支持依赖管理、脚本运行等功能,并且是Node安装时自带的一部分。
包是特殊的模块,将根目录包含package.json
文件的模块称为包,并且包通常由多个模块组成。
1.2 NRM(NPM Registry Manager)
NRM是NPM的镜像源管理工具,用于快速切换NPM的镜像源。由于NPM默认的镜像源在国外,访问速度可能较慢,NRM可以帮助开发者切换到国内镜像源,从而提高包的下载速度。
1.3 NVM(Node Version Manager)
NVM是Node版本管理工具,用于在同一台机器上安装、管理和切换多个Node版本。它解决了不同项目对不同Node版本的需求,避免版本冲突。
2 NPM
2.1 查看版本和配置信息
在安装Node时会自动安装NPM工具。
使用npm -v
命令查看NPM的版本:
1 | momashanhe@localhost momashanhe $ npm -v |
使用npm config list
命令查看Node和NPM的版本信息及其他信息。
2.2 包管理
2.2.1 初始化包
创建包对应的目录,使用npm init
命令初始化包:
1 | momashanhe@localhost momashanhe $ npm init |
支持交互式的创建package.json
文件,该文件是包的配置文件,每个包都必须存在:
1 | { |
文件内容说明如下:
- name是包名,默认是目录名。
- version是包版本,默认从
1.0.0
开始。 - description是包的描述,说明包有什么功能。
- main是包的入口文件,默认是目录下的
index.js
文件。 - scripts是脚本配置,用于执行脚本。
- author是包的作者。
- license是包的开源证书。
注意事项:
- 包名不能使用中文和大写。
- 版本要求
x.x.x
的格式,并且全为数字。 - 可以手动创建
package.json
文件,只要有这个文件就可以将该目录作为包。 - 可以使用
npm init -y
或npm init --yes
跳过交互快速创建package.json
文件,使用这种方式要求目录不能使用中文和大写。
2.2.2 搜索包
搜索包的方式有两种:
- 在命令行使用
npm search 关键字
搜索包含指定关键字的包。 - 在NPM网站搜索:https://www.npmjs.com/
也可以使用npm view 包名 versions
命令搜索包版本。
2.2.3 下载并安装包
下载和安装包需要在包目录中执行,需要有package.json
文件。
使用npm install 包名
命令下载并安装包,也可以使用npm add 包名
命令。
支持多个包同时下载和安装,只需要将多个包名用空格分开即可。
在下载并安装后,会在当前包目录下增加两个资源:
- node_modules用于存放下载的包。
- package-lock.json用于锁定包依赖的精确版本,确保在不同环境中安装依赖时结果完全一致。
依赖指的是当前包安装的其他包,可以认为当前包依赖了其他包,将其他包看做是当前包的依赖包。
在安装指定包时,安装命令会在node_modules
目录先安装指定包的依赖包,然后再安装指定包。
如果需要指定包的版本,可以使用npm install 包名@版本
命令下载并安装指定版本的包。
默认使用国外的镜像源,使用npm get registry
命令查看当前使用的镜像源。
使用npm config set registry https://registry.npmmirror.com/
命令设置为淘宝镜像源可以加速下载。
使用npm config set registry https://registry.npmjs.org/
命令设置为默认的官方镜像源。
2.2.4 使用包
使用包的方式同使用模块一样:
1 | require('模块'); |
导入模块后就能使用暴露的资源了,在导入时遵循以下流程:
2.2.5 根据环境安装
在安装包时可以将包安装到不同的环境:
- 生产环境:默认安装的环境就是生产环境,支持在生产环境和开发环境使用,可以使用
npm install 包名 -S
命令指定,其中的-S
是--save
的简写。 - 开发环境:开发环境的包仅支持在开发环境使用,在生产环境会被忽略,需要使用
npm install 包名 -D
命令指定,其中的-D
是--save-dev
的简写。
在package.json
文件中存储的位置也不一样:
- 生产环境:包信息存储在
dependencies
属性中。 - 开发环境:包信息存储在
devDependencies
属性中。
2.2.6 根据作用范围安装
在安装包时可以选择安装位置:
- 本地安装:将包安装到当前包的
node_modules
目录,默认安装到本地。 - 全局安装:将包安装到全局的
node_modules
目录,使用npm install 包名 -g
命令安装到全局,其中的-g
是--global
的简写。
查看安装列表:
- 本地安装:使用
npm list
命令可以查看安装在本地的包有哪些。 - 全局安装:使用
npm list -g
命令可以查看安装在全局的包有哪些。
查看安装目录:
- 本地目录:使用
npm root
命令可以查看本地的node_modules
目录。 - 全局目录:使用
npm root -g
命令可以查看全局的node_modules
目录。
全局安装的包可以在任何目录执行,本地安装的包只能在本地目录中执行。
全局安装的包版本由NPM管理,不会在项目的package.json
文件中体现。这意味着全局安装的包可能在不同项目之间共享,但也可能因为版本冲突而导致问题。
2.2.7 删除包
删除包需要在包目录中执行,需要有package.json
文件。
使用npm uninstall 包名
命令删除依赖包,也可以使用npm remove 包名
命令。
使用npm uninstall 包名 -g
命令删除全局依赖包。
2.2.8 重新安装包
在上传提交项目代码到Git仓库时,不会提交node_modules
目录,因为该目录占用的磁盘空间比较大,并且该目录可以重新生成。
当下载项目后,就需要执行npm install
命令重新安装依赖包,重新生成node_modules
目录。
2.3 命令别名
通过配置命令别名可以更简单的执行命令,只需要配置package.json
文件中的scripts
属性:
1 | "scripts": { |
即可通过npm run 别名
命令执行,其作用和别名对应的命令一样。
注意:
- 最后一个别名后面不需要有逗号,非最后一个别名后面必须要有逗号。
- 别名对应的命令有自动向上查找的功能,只要上级目录是包目录并且有对应的资源就能执行。
- 当别名是
start
时,可以直接通过npm start
命令执行,这是其他命令别名没有的执行方式,所以常用start
别名启动项目。 - 对于新项目,可以通过
scripts
属性查看项目的一些命令。
2.4 版本管理
在使用NPM管理包的版本时,使用的是x.x.x
格式:
- 第一个数字是主版本,当进行了不兼容的API修改时,需要更新主版本。
- 第二个数字是次版本,当添加了向下兼容的新功能时,应该更新次版本。
- 第三个数字是补丁版本,当进行了向下兼容的问题修正时,应该更新补丁版本。
除了常规的版本外,NPM还支持使用特定的符号来指定版本范围或选择策略:
- 使用
^1.2.3
表示只允许安装主版本相同的其他版本,仅允许安装1.x.x
的任何版本。 - 使用
~1.2.3
表示只允许安装次版本相同的其他版本,仅允许安装1.2.x
的任何版本。 - 使用
*
表示允许安装任意版本的版本,这是不推荐的,因为可能导致安装到不兼容的版本。 - 使用
>1.2.3
表示只允许安装指定版本之后的其他版本。 - 使用
<1.2.3
表示只允许安装指定版本之前的其他版本。
精确控制版本:
- 在NPM的5版本之前,如果需要记录包的精确版本,需要使用
npm shrinkwrap
命令生成npm-shrinkwrap.json
文件用于记录包的精确版本。 - 在NPM的5版本中,加入了新特性,在初始化包时会创建
package-lock.json
文件,每次安装包时都会记录包的精确版本。
2.5 发布服务包
可以将自己开发的工具包发布到NPM服务上,方便自己和其他开发者使用:
- 创建包目录并完成初始化,起一个有意义的包名,否则会被NPM识别为垃圾包,不允许发布。
- 在包中创建
index.js
文件,编写代码,使用module.exports
暴露数据。 - 访问NPM官网注册账号,并使用邮箱激活账号。
- 确保正在使用的镜像源是官方的镜像源,否则无法发布到NPM服务器。
- 使用
npm login
命令登录到NPM服务器,填写用户名和密码,以及邮箱收到的验证码。 - 使用
npm publish
命令将包发布到NPM服务器。
2.6 更新服务包
后续可以对自己发布的包进行更新,操作步骤如下:
- 更新包中的代码。
- 测试代码功能是否正常可用。
- 更新
package.json
文件中的版本,参考版本更新规则。 - 使用
npm publish
命令将包发布到NPM服务器。
2.7 删除服务包
NPM官方建议如果是为了鼓励用户升级,或者不想维护了,可以考虑使用deprecate
命令。
如果在发布后72小时内,需要满足条件:
- 没有其他包依赖。
- 只有一个维护者。
如果在发布后超过了72小时,需要满足条件:
- 没有其他包依赖。
- 只有一个维护者。
- 每周小于300下载量。
某些条件可能随时间发生变化,建议参考官方文档:https://docs.npmjs.com/policies/unpublish
删除服务包有两种方式,一种是在NPM官网上删除包,一种是通过命令行的方式。
通过命令行删除:
- 删除指定版本:使用
npm unpublish 包名@版本
删除指定版本的包。 - 删除全部版本:使用
npm unpublish 包名 -f
命令删除全部版本的包,其中的-f
是--force
的简写。
如果使用了2FA验证,还需要在命令后面增加--otp=2FA验证码
参数,只要2FA验证码正确后才能删除。
注意:
- 删除是不可逆的,一旦删除将无法撤销。
- 即使删除了包的某个版本,在以后发布版本的时候,也不能发布该版本,必须发布新版本。
- 如果删除包的所有版本,则要等到24小时后才能重新发布该包。
3 NPX
3.1 作用
对于只在某个项目中使用的包,如果也将其安装到全局目录,势必会造成全局目录的混乱和冗余。
如果将包安装到本地目录,在使用包里的命令时就不能在命令行直接执行,需要指明所在的目录才能执行。
使用NPX的主要目的就是为了解决在将包安装到本地目录后,调用包里的命令时不能在命令行直接执行的问题。
在安装了NPX以后,对于安装在本地目录的包,也可以在命令行通过NPX直接执行包里的命令。
另外,如果既没有在全局安装,也没用在本地安装,在通过NPX使用的时候,会自动从远程下载,并将包进行临时安装,在使用后会自动删除临时安装的包。
3.2 下载安装
从NPM的5.2.0版本开始,安装NPM的时候会同时将NPX自动安装,不需要手动安装。
也可以使用npm install npx -g
命令手动安装。
3.3 原理
使用NPX执行命令的原理:
- 查找本地目录中是否有指定的命令,如果有就直接使用,如果没有就继续查找。
- 查找全局目录中是否有指定的命令,如果有就直接使用,如果没有就继续查找。
- 查找远程仓库中是否有指定的命令,如果有就临时安装,如果没有就返回错误。
3.4 使用
使用npx 命令
执行指定命令。
使用npx --no-install 命令
执行指定命令,如果本地目录没有就返回作错误,不从远程仓库安装。
使用npx --ignore-existing 命令
执行指定命令,强制从远程仓库安装,忽略本地目录中安装的包。
使用npx -p 命令1 -p 命令2
安装多个命令。
4 NRM
4.1 下载安装
除了在NPM使用命令修改配置切换镜像源,还可以使用NRM切换,更推荐使用这种方式。
NRM依赖NPM,可以管理NPM使用的镜像源。
使用npm install nrm -g
命令将NRM安装到全局目录。
4.2 常用命令
4.2.1 查看镜像源
安装后可以使用nrm ls
命令查看镜像源:
1 | momashanhe@localhost momashanhe $ nrm ls |
4.2.2 切换镜像源
使用nrm use taobao
命令切换到淘宝的镜像源,淘宝是国内的镜像源,可以提高下载包的速度:
1 | momashanhe@localhost momashanhe $ nrm use taobao |
再次查看镜像源列表,正在使用的镜像源会在前面添加*
符号进行提示:
1 | momashanhe@localhost momashanhe $ nrm ls |
需要注意的是,淘宝的镜像源是只读的,只能下载和安装包,不能上传包。如果想要上传包,还需要切换回原来的镜像源进行上传。
5 NVM
5.1 下载安装
NVM主要用于管理Node和NPM版本的工具,用来切换不同版本的Node和NPM以便适配不同的软件开发工具。
NVM仅支持Linux系统和Mac系统,如果想在Windows系统使用,需要使用和NVM类似的nvm-windows
软件。
GitHub下载地址:nvm-windows
下载nvm-setup.exe
并安装即可。
重新打开命令行,输入命令查询版本:
1 | momashanhe@localhost momashanhe $ nvm -v |
在安装NVM后,会将Node的原安装目录迁移到NVM的安装目录,并在Node的原安装目录的父级目录创建一个指向新安装目录的链接。
使用nvm root
命令可以查看NVM下载安装Node的目录,在该目录下有Node的原安装目录。
5.2 常用命令
5.2.1 查看已安装
使用nvm list
命令查看已安装的Node列表:
1 | momashanhe@localhost momashanhe $ nvm list |
5.2.2 查看可安装
使用nvm list available
命令查看可以安装的Node列表:
1 | momashanhe@localhost momashanhe $ nvm list available |
5.2.3 安装Node
使用nvm install 版本
命令安装指定版本的Node:
1 | momashanhe@localhost momashanhe $ nvm install 23.1.0 |
5.2.4 切换Node
使用nvm use 版本
命令切换指定版本的Node:
1 | momashanhe@localhost momashanhe $ nvm use 23.1.0 |
5.2.5 卸载Node
使用nvm uninstall 版本
命令卸载指定版本的Node:
1 | momashanhe@localhost momashanhe $ nvm uninstall 23.1.0 |
6 Yarn
6.1 下载安装
Yarn是由Facebook、Google、Exponent和Tilde联合推出了一个新的JS包管理工具,目的是为了弥补NPM的一些缺陷。
官网地址:https://yarnpkg.com/
Yarn的优点:
- 并行安装:使用NPM安装软件包时采用顺序执行。使用Yarn安装软件包时采用并行执行,提高了性能。
- 离线模式:使用NPM再次安装已经安装过的软件包时需要从网络下载。使用Yarn再次安装已经安装过的软件包时直接从缓存中获取,节省了时间。
- 输出简洁:使用NPM打印的输出信息比较冗长,不容易识别报错的信息。使用Yarn打印的输出信息比较简洁,只打印出必要的信息,更加易读。
使用NPM命令安装Yarn到全局:
1 | momashanhe@localhost momashanhe $ npm install yarn -g |
6.2 常用命令
6.2.1 查看版本和配置信息
使用yarn -v
命令查看NPM的版本:
1 | momashanhe@localhost momashanhe $ yarn -v |
使用yarn config list
命令查看配置信息。
6.2.2 初始化包
使用yarn init
命令或yarn init -y
命令初始化包。
6.2.3 下载并安装包
使用yarn add 包名
命令下载并安装包,默认安装到生产环境。
使用yarn add 包名 -S
命令下载并安装包,安装到生产环境,支持开发环境和生产环境使用。
使用yarn add 包名 -D
命令下载并安装包,安装到开发环境,仅支持开发环境使用。
使用yarn global add 包名
命令安装到全局。
使用yarn list
命令可以查看安装在本地的包有哪些。
使用yarn global list
命令可以查看安装在全局的包有哪些。
使用yarn bin
命令可以查看本地的bin目录。
使用yarn global bin
命令可以查看全局的bin目录。
需要将全局的bin目录配置到环境变量,这样才能使用全局安装的包附带的命令。
默认使用国外的镜像源,使用yarn config get registry
命令查看当前使用的镜像源。
使用yarn config set registry https://registry.npmmirror.com/
命令设置为淘宝镜像源可以加速下载。
使用yarn config set registry https://registry.yarnpkg.com
命令设置为默认的官方镜像源。
6.2.4 删除包
使用yarn remove 包名
命令删除依赖包。
使用yarn global remove 包名
命令删除全局依赖包。
6.2.5 重新安装包
使用yarn
命令重新安装依赖包,重新生成node_modules
目录。
6.2.6 命令别名
在package.json
文件中配置好命令别名后,使用yarn 别名
命令执行,不需要使用run
参数。
6.2.7 发布服务包
使用yarn login
命令登录到NPM服务器,填写用户名和密码,以及邮箱收到的验证码。
使用yarn publish
命令将包发布到NPM服务器。
6.2.8 更新服务包
使用yarn publish
命令将包发布到NPM服务器。
6.2.9 删除服务包
Yarn不支持删除服务包,建议使用NPM删除服务包。
条