抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

摘要:本文主要学习了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的版本:

bash
1
2
3
momashanhe@localhost momashanhe $ npm -v
9.3.1
momashanhe@localhost momashanhe $

使用npm config list命令查看Node和NPM的版本信息及其他信息。

2.2 包管理

2.2.1 初始化包

创建包对应的目录,使用npm init命令初始化包:

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
momashanhe@localhost momashanhe $ npm init
...
Press ^C at any time to quit.
package name: (momashanhe)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
...
momashanhe@localhost momashanhe $

支持交互式的创建package.json文件,该文件是包的配置文件,每个包都必须存在:

package.json
1
2
3
4
5
6
7
8
9
10
11
{
"name": "momashanhe",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}

文件内容说明如下:

  • name是包名,默认是目录名。
  • version是包版本,默认从1.0.0开始。
  • description是包的描述,说明包有什么功能。
  • main是包的入口文件,默认是目录下的index.js文件。
  • scripts是脚本配置,用于执行脚本。
  • author是包的作者。
  • license是包的开源证书。

注意事项:

  • 包名不能使用中文和大写。
  • 版本要求x.x.x的格式,并且全为数字。
  • 可以手动创建package.json文件,只要有这个文件就可以将该目录作为包。
  • 可以使用npm init -ynpm 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 使用包

使用包的方式同使用模块一样:

js
1
require('模块');

导入模块后就能使用暴露的资源了,在导入时遵循以下流程:
20250308102018-流程

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属性:

package.json
1
2
3
4
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node index.js"
},

即可通过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服务上,方便自己和其他开发者使用:

  1. 创建包目录并完成初始化,起一个有意义的包名,否则会被NPM识别为垃圾包,不允许发布。
  2. 在包中创建index.js文件,编写代码,使用module.exports暴露数据。
  3. 访问NPM官网注册账号,并使用邮箱激活账号。
  4. 确保正在使用的镜像源是官方的镜像源,否则无法发布到NPM服务器。
  5. 使用npm login命令登录到NPM服务器,填写用户名和密码,以及邮箱收到的验证码。
  6. 使用npm publish命令将包发布到NPM服务器。

2.6 更新服务包

后续可以对自己发布的包进行更新,操作步骤如下:

  1. 更新包中的代码。
  2. 测试代码功能是否正常可用。
  3. 更新package.json文件中的版本,参考版本更新规则。
  4. 使用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执行命令的原理:

  1. 查找本地目录中是否有指定的命令,如果有就直接使用,如果没有就继续查找。
  2. 查找全局目录中是否有指定的命令,如果有就直接使用,如果没有就继续查找。
  3. 查找远程仓库中是否有指定的命令,如果有就临时安装,如果没有就返回错误。

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命令查看镜像源:

bash
1
2
3
4
5
6
7
8
9
momashanhe@localhost momashanhe $ nrm ls
npm ---------- https://registry.npmjs.org/
yarn --------- https://registry.yarnpkg.com/
tencent ------ https://mirrors.tencent.com/npm/
cnpm --------- https://r.cnpmjs.org/
taobao ------- https://registry.npmmirror.com/
npmMirror ---- https://skimdb.npmjs.com/registry/
huawei ------- https://repo.huaweicloud.com/repository/npm/
momashanhe@localhost momashanhe $

4.2.2 切换镜像源

使用nrm use taobao命令切换到淘宝的镜像源,淘宝是国内的镜像源,可以提高下载包的速度:

bash
1
2
3
momashanhe@localhost momashanhe $ nrm use taobao
SUCCESS The registry has been changed to 'taobao'.
momashanhe@localhost momashanhe $

再次查看镜像源列表,正在使用的镜像源会在前面添加*符号进行提示:

bash
1
2
3
4
5
6
7
8
9
momashanhe@localhost momashanhe $ nrm ls
npm ---------- https://registry.npmjs.org/
yarn --------- https://registry.yarnpkg.com/
tencent ------ https://mirrors.tencent.com/npm/
cnpm --------- https://r.cnpmjs.org/
* taobao ------- https://registry.npmmirror.com/
npmMirror ---- https://skimdb.npmjs.com/registry/
huawei ------- https://repo.huaweicloud.com/repository/npm/
momashanhe@localhost momashanhe $

需要注意的是,淘宝的镜像源是只读的,只能下载和安装包,不能上传包。如果想要上传包,还需要切换回原来的镜像源进行上传。

5 NVM

5.1 下载安装

NVM主要用于管理Node和NPM版本的工具,用来切换不同版本的Node和NPM以便适配不同的软件开发工具。

NVM仅支持Linux系统和Mac系统,如果想在Windows系统使用,需要使用和NVM类似的nvm-windows软件。

GitHub下载地址:nvm-windows

下载nvm-setup.exe并安装即可。

重新打开命令行,输入命令查询版本:

bash
1
2
3
momashanhe@localhost momashanhe $ nvm -v
1.1.12
momashanhe@localhost momashanhe $

在安装NVM后,会将Node的原安装目录迁移到NVM的安装目录,并在Node的原安装目录的父级目录创建一个指向新安装目录的链接。

使用nvm root命令可以查看NVM下载安装Node的目录,在该目录下有Node的原安装目录。

5.2 常用命令

5.2.1 查看已安装

使用nvm list命令查看已安装的Node列表:

bash
1
2
3
momashanhe@localhost momashanhe $ nvm list
* 18.14.0 (Currently using 64-bit executable)
momashanhe@localhost momashanhe $

5.2.2 查看可安装

使用nvm list available命令查看可以安装的Node列表:

bash
1
2
3
4
5
6
7
8
9
10
11
12
momashanhe@localhost momashanhe $ nvm list available
| CURRENT | LTS | OLD STABLE | OLD UNSTABLE |
|--------------|--------------|--------------|--------------|
| 23.6.0 | 22.11.0 | 0.12.14 | 0.11.12 |
| 23.5.0 | 20.18.3 | 0.12.13 | 0.11.11 |
| 23.4.0 | 20.18.2 | 0.12.12 | 0.11.10 |
| 23.3.0 | 20.18.1 | 0.12.11 | 0.11.9 |
| 23.2.0 | 20.18.0 | 0.12.10 | 0.11.8 |
| 23.1.0 | 20.17.0 | 0.12.9 | 0.11.7 |
| 23.0.0 | 20.16.0 | 0.12.8 | 0.11.6 |
...
momashanhe@localhost momashanhe $

5.2.3 安装Node

使用nvm install 版本命令安装指定版本的Node:

bash
1
2
3
4
5
6
7
momashanhe@localhost momashanhe $ nvm install 23.1.0
Downloading node.js version 23.1.0 (64-bit)...
Extracting node and npm...
Complete
npm v10.9.0 installed successfully.
...
momashanhe@localhost momashanhe $

5.2.4 切换Node

使用nvm use 版本命令切换指定版本的Node:

bash
1
2
3
momashanhe@localhost momashanhe $ nvm use 23.1.0
Now using node v23.1.0 (64-bit)
momashanhe@localhost momashanhe $

5.2.5 卸载Node

使用nvm uninstall 版本命令卸载指定版本的Node:

bash
1
2
3
momashanhe@localhost momashanhe $ nvm uninstall 23.1.0
Uninstalling node v23.1.0... done
momashanhe@localhost momashanhe $

6 Yarn

6.1 下载安装

Yarn是由Facebook、Google、Exponent和Tilde联合推出了一个新的JS包管理工具,目的是为了弥补NPM的一些缺陷。

官网地址:https://yarnpkg.com/

Yarn的优点:

  • 并行安装:使用NPM安装软件包时采用顺序执行。使用Yarn安装软件包时采用并行执行,提高了性能。
  • 离线模式:使用NPM再次安装已经安装过的软件包时需要从网络下载。使用Yarn再次安装已经安装过的软件包时直接从缓存中获取,节省了时间。
  • 输出简洁:使用NPM打印的输出信息比较冗长,不容易识别报错的信息。使用Yarn打印的输出信息比较简洁,只打印出必要的信息,更加易读。

使用NPM命令安装Yarn到全局:

bash
1
2
3
momashanhe@localhost momashanhe $ npm install yarn -g
added 1 package in 949ms
momashanhe@localhost momashanhe $

6.2 常用命令

6.2.1 查看版本和配置信息

使用yarn -v命令查看NPM的版本:

bash
1
2
3
momashanhe@localhost momashanhe $ yarn -v
1.22.22
momashanhe@localhost momashanhe $

使用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删除服务包。

评论