npm 使用
npm (Node Packaged Modules) is node's official package manager. You can also see all the versions of node and corresponding npm here.
Overview

Acronym
-g
--global 缩写为 -g,表示安装之后的包将位于系统预设的全局目录之下。
-S
--save 缩写为 -S,表示安装的包将写入 package.json 里面的 dependencies。
-D
--save-dev 缩写为 -D,表示将安装的包将写入 packege.json 里面的 devDependencies。
-E
--save-exact 缩写为 -E,表示安装的包的版本是精确指定的。比如 npm install react -E 后 dependencies 中 react 版本为:
"react": "16.13.1"
以下缩写则不是很常用,仅供参考:
-O
--save-optional 缩写为 -O,表示将安装的包将写入 packege.json 里面的 optionalDependencies。
-B
--save-bundle 缩写为 -B,表示将安装的包将写入 packege.json 里面的 bundleDependencies。
npm outdated
例如在 node 项目中运行 npm outdated 命令,如下图所示:

wanted 就是 dependencies 或 devDependencies 字段中指定的版本号应当升级的版本,可以看出上面列表 less 用的是 ^,所以 wanted 会提示更新次要版本号。
npm install
Install package
这个是 npm 中最常用的命令:
npm install packageName
可以简写为:
npm i packageName
这个命令会将 package 安装在当前目录下 node_modules 目录内,可执行命令(如果有)安装在 node_modules/.bin 目录下。全局安装使用 -g 选项:
npm install -g packageName # npm i -g packageName
具体安装在 usr 还是 ~ 下面,还需要看 node/npm 的安装方式,推荐将 node 安装在 ~ 下面,可以使用 nvm 和 n 来安装 node。
如果想指定具体的安装位置,可以使用以下方法:
- 在命令中添加
--prefix标记 (e.g.npm i -g packageName --prefix ~/.node_modules)。 - 使用
npm_config_prefix环境变量。 - 使用用户配置文件
~/.npmrc。
第一个方法已不被推荐因为你需要记住位置并且每次操作都需要添加参数。第二个方法只是添加下列行到你的 shell 配置文件 (e.g. .bash_profile, .zshrc)。
PATH="$HOME/.node_modules/bin:$PATH"
export npm_config_prefix=~/.node_modules
不要忘记source一下 shell 配置文件。
第三个方法你可以使用命令:
npm config edit
你可以找到 prefix 选项并且设置一个期望的位置:
prefix=~/.node_modules
不要忘记删除行前面的; 否则会被当作注释。你现在可以添加可执行命令的位置到你的 shell 配置文件。
export PATH="$HOME/.node_modules/bin:$PATH"
同样,也不要忘记source一下 shell 配置文件。
Install local package
在 npm@5 之前的版本,如果将本地目录作为依赖来安装,将会把文件目录作为副本拷贝到 node_modules 中。而在 npm@5 中,将改为使用创建 symlinks 的方式来实现(使用本地 tarball 包除外),而不再执行文件拷贝。这将会提升安装速度:
npm install ../packages/mylib
npm install file://packages/mylib
有关新的 file:// 规范描述可以参考官方的 file-specifiers。
Update package
除了安装包,npm i 也可以用于升级包,比如 npm i packageName 将会把 node_modules 中相应的包升级到 wanted 版本,同时也会自动更新 package.json 和 package-lock.json 。
npm i 和 npm i packageName 的行为是不一样的,npm i 会优先去 lockfile 里面找对应的版本,即使有 wanted 的更新版本也不会去下载安装,除非没有 lockfile。
npm --prefix [path] [command]
To run an npm script from another directory, use --prefix, similar to "yarn --cwd"
npm --prefix ./client install
npm ci
该命令类似于 npm i ,但它旨在用于自动化环境,如测试平台,持续集成和部署。
优点:
- 通过跳过某些面向用户的功能,它可以比
npm i快得多。 - 可以避免
npm i增量安装而引起的本地和线上不一致等问题。
例如配置 Travis 以使用 npm ci 而不是 npm i:
# .travis.yml
install:
- npm ci
# keep the npm cache around to speed up installs
cache:
directories:
- '$HOME/.npm'
总之,使用 npm i 和使用的主要区别 npm ci 是:
- 使用
npm ci时该项目必须有一个package-lock.json或npm-shrinkwrap.json。 npm ci永远不会写入package.json或任何 lockfile,安装基本上是冻结的。- 如果 lockfile 中的依赖项与其中的依赖项不匹配
package.json,npm ci则将退出并显示错误,而不是更新 lockfile。 - 如果
node_modules已经存在,它将在npm ci开始安装之前自动删除。 npm ci只能一次安装整个项目,使用此命令无法添加单个依赖包。
yarn 没有这个命令,但有一个比较类似的命令:yarn install --frozen-lockfile
npm update
更新包有两种方式 npm i packageName<@version> 或者 npm update packageName
可以简写为:
npm up packageName
npm i的方式不加版本号和up的效果是一样的,只更新到wanted版本,有新版的改动都会更新 package.json 和 lock 文件。npm i可以加版本号更新到最新版,比如^2.3.0更新到最新版^3.0.0之后,package.json 和 lock 文件都会更新,且以插入号的方式来更新 package.json 文件。但是up命令无论加不加版本号它只会更新到 wanted 版本。
关于 up 命令方面的基础知识
npm update packageName # alias up
对于全局环境安装的包 ( -g )
npm up -g packageName
更新单个全局包,比如yarn
npm up -g yarn
全局安装的包可能需要管理员权限,取决于 node 的安装目录是否是 ~。
更新所有包有时你只希望更新所有包,去掉包名将试图更新所有包。
npm up
或者添加 -g 标记更新全局环境安装的包
npm up -g
npm uninstall
删除使用 -g 标记安装的包只须:
npm uninstall packageName
可以简写为:
npm un packageName
# or
npm r packageName
对于全局安装的包 加上 -g 即可:
npm r -g packageName
全局安装的包可能需要管理员权限,取决于 node 的安装目录是否是 ~。
npm list
若要显示已安装的包的树形视图执行:
npm list -g
可以简写 为:
npm ls packageName
# or
npm ll packageName
# or
npm la packageName
若只要显示第一层结构的包(你自己安装的包),可以执行:
npm ls -g --depth=0
npm cache
npm install或npm update命令,从 registry 下载压缩包之后,都存放在本地的缓存目录。
npm config get cache
npm 的缓存目录是通过 cache 变量指定的,一般默认是在~/.npm 文件夹,可以执行下面的命令查看
npm config get cache
在 npm@5 以前,每个缓存的模块在 ~/.npm 文件夹中以模块名的形式直接存储,例如 koa 模块存储在~/.npm/koa 文件夹中。而 npm@5 版本开始,数据存储在 ~/.npm/_cacache 中,并且不是以模块名直接存放。
npm@5 版本开始,数据存储在 ~/.npm/_cacache 中,并且不是以模块名直接存放。
npm cache add
npm cache 提供了三个命令,分别是npm cache add, npm cache clean, npm cache verify。
npm cache add
官方解释说这个命令主要是 npm 内部使用,但是也可以用来手动给一个指定的 package 添加缓存。
This command is primarily intended to be used internally by npm, but it can provide a way to add data to the local installation cache explicitly.
npm cache clean --force
npm cache clean --force
删除缓存目录下的所有数据。npm@5 重写了整个缓存系统,缓存将由 npm 来全局维护不用用户操心,这点也是在向 yarn 看齐。升级新版后,用户基本没有手动操作 npm cache 的场景。npm cache clean 将必须带上 --force 参数才能执行,并且会收到警告。
npm 的缓存是使用 pacote 模块进行下载和管理,基于 cacache 缓存存储。由于 npm 会维护缓存数据的完整性,一旦数据发生错误,就回重新获取。因此不推荐手动清理缓存,除非需要释放磁盘空间,这也是要强制加上--force 参数的原因。
npm cache verify
验证缓存数据的有效性和完整性,清理垃圾数据。
npm cache verify
offline/online
npm 提供了离线安装模式,使用 --offline, --prefer-offline, --prefer-online 可以指定离线模式。
--prefer-offline / --prefer-online
离线优先/网络优先模式。
- 如果设置为
--prefer-offline则优先使用缓存数据,如果没有匹配的缓存数据,则从远程仓库下载。 - 如果设置为
--prefer-online则优先使用网络数据,忽略缓存数据,这种模式可以及时获取最新的模块。
--offline
完全离线模式,安装过程不需要网络,直接使用匹配的缓存数据,一旦缓存数据不存在,则安装失败。
npm config
npm config set <key> <value>
npm config get [<key>]
npm config delete <key>
npm config list [--json]
npm config edit
npm set <key> <value>
npm get [<key>]
比如更换仓库:
npm config set registry https://registry.npmjs.org/
便于记忆可以用 edit 命令再进行编辑:
npm config edit