npm 常用命令

官方文档:https://docs.npmjs.com/cli/v7/commands

install 安装

安装一个 node 工具包。安装之前,npm 会先检查node_modules目录之中是否已经存在指定模块。如果存在就不再安装,即使远程仓库已经有了一个新版本也是。如果要重新安装可以带上参数-f。如果node_modules不存在指定模块,则向 registry 查询模块压缩包的网址,然后下载压缩包并放至缓存目录,最后解压压缩包到当前项目的node_modules目录。

  • 别名:npm inpm add
  • 参数:[-P|--save-prod|-D|--save-dev|-O|--save-optional] [-E|--save-exact] [-B|--save-bundle] [--no-save] [--dry-run]

语法

1
npm install <name>|[<@scope>/]<name>|[<@scope>/]<name>@<tag>|[<@scope>/]<name>@<version>|[<@scope>/]<name>@<version range>|<git-host>:<git-user>/<repo-name>|<git repo url>|<tarball file>|<tarball url>|<folder>

参数说明

  • -P, --save-prod:安装包将出现在你的 dependencies 中。这是默认值,除非存在-D-O
  • -D, --save-dev:安装包将出现在你的 devDependencies 中。
  • -O, --save-optional:安装包将出现在你的 optionalDependencies 中。
  • --no-save:不保存在依赖中。
  • -f, --force强制重新安装。

如:

1
npm i moo-css-base -P

并且,当使用上述任何选项将依赖包保存到 package.json 时,有两个可选参数:

  • -E, --save-exact:保存的依赖包将配置为精确的版本,而不是使用 NPM 的默认 semver range 运算符。
  • -B, --save-bundle:保存依赖包的同时将添加你的 bundleDependencies 列表。

当然,如果有 npm-shrinkwrap.jsonpackage-lock.json 的话,也会更新它们。

<scope>是可选的,作用是将从与指定作用域关联的注册表下载包。如果没有与给定范围关联的注册表,则假定为默认注册表。

注意:如果你没有在 scope 名字里写入@符号,NPM 将把它解释为一个 Github 存储库,参见下面。作用域名称后面还必须跟一个斜杠。

如:

1
2
3
4
5
6
7
npm install sax
npm install githubname/reponame
npm install @myorg/privatepackage
npm install node-tap --save-dev
npm install dtrace-provider --save-optional
npm install readable-stream --save-exact
npm install ansi-regex --save-bundle

全局模式:-g--global

生产模式:--production

如果通过--production参数或 NODE_ENV 环境变量设置为 production 时,npm 将不会安装 devDependencies 的安装包列表。

注意:在项目中安装 dependency 时--production参数无效。

–cache-min

--cache-min参数指定一个时间(单位为分钟),只有超过这个时间的模块,才会从 registry 下载。如

1
npm install --cache-min 9999999 <package-name>

要永久,可设置为Infinity

模块安装过程

    1. 发出npm install命令
    1. npm 向 registry 查询模块压缩包的网址
    1. 下载压缩包,存放在~/.npm目录
    1. 解压压缩包到当前项目的node_modules目录

注意,一个模块安装以后,本地其实保存了两份。一份是~/.npm目录下的压缩包,另一份是node_modules目录下解压后的代码。但是,运行npm install的时候,只会检查node_modules目录,而不会检查~/.npm目录。

*cache 机制

npm installnpm update命令,从 registry 下载压缩包之后,都存放在本地的缓存目录。

这个缓存目录,在 Linux 或 Mac 默认是用户主目录下的.npm目录,在 Windows 默认是%AppData%/npm-cache。通过配置命令,可以查看这个目录的具体位置。

1
npm config get cache

update 更新

缓存目录

执行 npm installnpm update 命令后,从 registry 下载的压缩包都存放在本地的缓存目录。

在 Linux 或 Mac 上,这个缓存目录默认是在用户主目录下的.npm目录。
在 windows 下默认是%AppData%/npm-cache目录。

通过配置命令可以查看这个目录的位置:

1
npm config get cache

清除缓存目录

直接删文件夹或

1
npm cache clean

设置缓存时间

npm 提供了一个参数--cache-min,用于从缓存目录安装模块,该参数指定一个时间,单位为分钟。只有超过这个时间的模块才会从 registry 下载。如

1
npm instatll --cache-min 9999 fundcharts

run-script 运行任意包脚本

别名:npm run

语法:

1
npm run-script <script name>

run-script 将从包的“scripts”对象运行任意命令。如果没有提供“命令”,它将列出可用的脚本。run[-script]被用作 test、start、restart 和 stop 等命令,不过也可以直接调用。当包中的脚本打印出来时,它们被分为生命周期(测试、启动、重新启动)和直接运行脚本。

npm@2.0.0开始,在执行脚本时可以使用自定义参数。getopt 使用特殊选项–来分隔选项的结尾。NPM 将把后面的所有参数直接传递给脚本如:

1
npm run test -- --grep="pattern"

参数将只传递到 NPM 运行后指定的脚本,而不传递到任何前脚本或后脚本。

env 脚本是一个特殊的内置命令,可用于列出运行时脚本可用的环境变量。如果在包中定义了“env”命令,它将优先于内置命令。

除了 shell 预先存在的路径之外,npm run 还将 node_modules/.bin 添加到提供给脚本的路径中。本地安装的依赖项提供的任何二进制文件都可以不使用 node_modules/.bin 前缀。例如,如果您的包中有一个 devdependency on tap,那么您应该编写

1
"scripts": {"test": "tap test/\*.js"}

来代替

1
"scripts": {"test": "node_modules/.bin/tap test/\*.js"}

来运行你的 test 脚本。

运行脚本的实际 shell 依赖于平台。默认情况下,在类 Unix 系统上,它是/bin/sh 命令,在 Windows 上是 cmd.exe/bin/sh 引用的实际 shell 也取决于系统。从`npm@5.1.0`开始,可以使用脚本 shell 配置自定义 shell。

脚本从模块的根目录运行,无论调用 NPM RUN 时当前的工作目录是什么。如果希望脚本根据所处的子目录使用不同的行为,则可以使用 init_cwd 环境变量,该变量保存运行 npm run 时所处的完整路径。

npm run 将 node 环境变量设置为执行 npm 的节点可执行文件。此外,如果传递了--scripts prepend 节点路径,则节点所在的目录将添加到路径中。如果传递了--scripts prepend node path=auto(这是 NPM v3 中的默认值),则只有在路径中找不到该节点可执行文件时才会执行此操作。

参数:

  • --silent:防止显示 NPM 出错时输出。
  • --if-present:来避免在未定义脚本时使用非零退出代码退出。这样可以在不破坏执行链的情况下运行可能未定义的脚本。

list 查看安装

语法

1
npm list

查看当前各包安装的实际版本。

package-lock.json

package.json 文件只能锁定大版本,也就是版本号的第一位,并不能锁定后面的小版。package-lock.json 是在 npm install时候生成一份文件,用以记录当前状态下实际安装的各个 npm package 的具体来源和版本号。

安装包前置

包下载的前置知识
一个包的版本号基本由三位数字构成 x.x.x, 它们分别是 Major(主版本号), Minor(次版本号), Patch(修订号)。

  • *: 升级 Major + Minor + Patch;
  • ^: 升级 Minor + Patch;
  • ~: 升级 Patch;
    比如 ^4.3.1 表示 4.x.x 的最新版, ~4.3.1 表示 4.3.x 的最新版

prune 清理模块

使用情景:开发工程中可能使用了某些三方模块(node_modules 目录下),后来又不用了,prune 则可以清除这些不再需要的文件。

语法

1
npm prune

prune 原理是根据 package.json 里的依赖项来判断是否删除。

ci 用“干净”状态安装项目

npm 在v5.7.1起支持。

语法

1
npm ci

npm ci 相比 npm install 下的区别:

  • 1.项目必须含一个 package-lock.jsonnpm-shrinkwrap.json 文件
  • 2.如果 package-lock 中的依赖于 package.json 中不匹配的话,执行命令会报错并退出执行
  • 3.如果 node_modules 已经存在,它将在执行前删除
  • 4.它永远不会改写 package.jsonpackage-lock.json

audit 漏洞扫描

npm 6.x 新增的功能,audit 命令将对项目中配置的依赖项的描述提交给默认注册表,并要求提供已知漏洞的报告。

注意:发送到报告会获取 package-lock.json / npm-shrinkwrap.json 的有用信息,所以必须确保这两个文件有一个存在。

返回的报告包含有关如何对这些信息采取行动的说明。如果未发现漏洞,该命令将以 0 退出代码退出。

报告提交内容

  • npm 版本
  • node 版本
  • 平台
  • node 控制台变量
  • package-lock.json / npm-shrinkwrap.json 的净化版本

修复

您还可以通过运行npm audit fix使 npm 自动修复漏洞。但请注意,某些漏洞无法自动修复,需要手动干预或检查。还要注意,由于npm audit fix在后台运行了完整的 npm 安装,因此适用于安装程序的所有配置也将适用于npm install——因此npm audit fix --package-lock-only这样的事情将按预期工作。

默认情况下,如果发现任何漏洞,audit 命令将以非零代码退出。在 CI 环境中,包括--audit-level参数以指定将导致命令失败的最低漏洞级别,可能很有用。

关闭扫描

单项目:安装时增加--no-audit参数,如npm install example-package-name --no-audit
所有:在用户和全局 npmrc 配置文件中将 audit 设置设置为 false:npm set audit false


其他 npm 执行

1.npm run XXX

执行:

  • 1.npm 会先在当前目录的 node_modules/.bin 查找要执行的程序,如果找到则运行;
  • 2.没有找到则从全局的 node_modules/.bin 中查找,即 nom i -g 的模块包;
  • 3.如果全局目录中还是没找到,那么就从 path 环境变量中查找有没有其他同名的可执行程序。

*npm scripts hook

生命周期 scripts

  • prepublish:在打包和发布包之前运行,在npm install没有任何参数的本地运行。
  • prepare:在打包和发布包之前运行,在本地npm install没有任何参数,以及安装 git 依赖项时运行。这是在之后运行 prepublish,但是之前 prepublishOnly
    prepublishOnly:仅在准备和打包之前运行npm publish
  • prepack:前运行压缩包(npm packnpm publish并安装 git 的依赖时)
  • postpack:在生成压缩包并移动到其最终目的地之后运行。
  • publish postpublish:发布包后运行
  • preinstall:包安装之前运行
  • install postinstall:包安装后运行。默认:node-gyp rebuild,如果 binding.gyp 包的根目录中有一个文件而您尚未定义自己的脚本 install 或 preinstall 脚本,npm 将默认 install 使用 node-gyp 进行编译。
  • preuninstall uninstall:在包卸载之前运行。
  • postuninstall:在包卸载之后运行。
  • preversion:在碰撞包版本之前运行。
  • version:碰撞包版本之后,但提交之前运行。
  • postversion:碰撞包版本之后,提交之后运行。