Maurice Wu
Published on

是用 npm 的一点心得

registry

npm 默认的 registry 地址是 https://registry.npmjs.org, 鉴于国内的环境,通常我们都会设置为淘宝的源。根据其文档介绍,该源10分钟就会从 registry.npmjs.org 更新镜像。

npm config get regstiry
# https://registry.npmjs.org
# 设置淘宝源
npm config set registry https://registry.npm.taobao.org

npm install

过程

  1. 命令行执行 npm install
  2. 执行 previous install, 向 regsitry 确认最新可用版本
  3. 下载压缩包,存放在~/.npm目录(Default: ~/.npm on Posix, or %AppData%/npm-cache on Windows.)%AppData%一般是C:\用户\AppData
  4. 解压压缩包到当前项目的 node_modules 目录

关于semantic version

npm 社区推荐开发者使用 semantic version 来控制他们的包版本。

code statusstageruleexample
第一次初始化new product1.0.0
向后兼容bug修复patch release第三位递增1.0.1
向后兼容增加新特性minor release第二位递增1.1.1
破坏性升级major release第一位递增2.1.1

执行 npm install 的时候,会根据 package.json 指定的 version 来确认符合的可用版本。

version 版本号一般会在 semantic version 的基础上增加一些计算规则。如:

{
  "lodash": "^4.2.1",
  "js-cookie": "~1.2.3"
}
  1. 在版本号前面加上运算符
版本号规则
^2.2.1在同一个major版本下,尽可能使用最新的版本
~2.3.1在同一个minor 版本下,尽可能使用最新的版本
>2.1
1.1.1 - 3.2.1等价于>=1.1.1 <= 3.2.1
1.2.x使用最新的patch release ,等价于~1.2.1
  1. 版本号后面加上 prerelease-tag
版本号规则
1.2.1-alpha.11.2.1版本的alpha版本1
>= 1.2.3-beta.2在1.2.3版本中,beta号大于2的。例如1.2.3-beta.4符合,而2.3.4-beta.4不符合

安装 package-lock.json 中的指定版本

当我们使用 CI/CD 的时候,我们希望服务器安装的依赖包的版本跟我们本地开发时是一致的。 这时候 package-lock.json 就派上用场了。

package.json 指定了我们项目的依赖版本,package-lock.json 不仅指定了项目的依赖版本,还指定了依赖的依赖的(内嵌依赖)版本。 当我们执行 npm install 之后,就会在项目根目录下生成这个文件。

npm ci

yarn.lock

当我们使用 yarn 安装依赖包的时候,同样也会生成一个 yarn.lock 的文件。它在之后的安装过程中起作用。

  • 如果 yarn.lock 中记录的所有依赖版本都满足 package.json 的版本条件,那么就用 yarn.lock 中记录的版本, 此时,yarn 不会向 registry 检查新版本

  • 如果不满足,那么 yarn 会向 registry 询问符合 package.json 指定的可用版本,下载并且更新 yarn.lock

由此可见,执行yarn install的时候,就是根据yarn.lock中指定的版本号进行安装的

使用yarn 的时候,可以指定--pure-lockfile或者是--frozen-lockfile来达到同一目的。

yarn install --pure-lockfile
# 不生成yarn.lock
yarn install --frozen-lockfile
# 如果yarn.lock中记录的版本号不满足package.json所需要的版本范围,则安装失败。

--production

npm install --production
# 只安装 dependencies 中的包

从cache安装

从上面 npm install 的过程中,我们可以知道 npm 会将下载的依赖包缓存在硬盘中,但是这并不意味着 npm 会使用他们。即使 resolve 的版本已经在缓存中,npm 还是会通过网络再次下载这个包。幸运的是,我们可以通过--prefer-offline 显式地要求 npm 询问 registry 之后确认的版本在缓存中可以找到,就优先使用缓存中包。

npm install --prefer-offline

试想如果你的CI服务器每次执行脚本的时候都要从 registry 重新下载,这得浪费很多时间,为什么不使用 cache呢?

需要提醒的是,yarn install 的时候是优先使用符合指定版本范围的cache中的包的。

参考

npm 模块安装机制简介

Offline installation of npm packages

npm 版本range