如果你正在构建一个生产应用程序,你并不总是希望让你项目的依赖项自动更新,即使您只指定了一个 PATCH 更新,由于有数百个互操作包,因此有可能出现未经测试的更新会毁掉你的项目,那么你一样要试试 save-exact。在开发过程中以及使用应用程序时,可以安全地允许补丁或次要更新。
我们先来看一个最简单的测试,例如我在项目依赖了两个包:
"devDependencies": {
"@babel/cli": "^7.10.5",
"@babel/plugin-transform-runtime": "^7.11.0"
}
当删除 node_modules 文件夹并运行时 npm install,已安装软件包的版本可能会在更高版本可用时更新,原因是安装的依赖产生了滑动,这可能会破坏应用程序,不同版本的的特效可能存在不一致的场景,这其实是非常危险的。
图片
图片
^ 会匹配最新的大版本依赖包,比如 ^1.2.3 会匹配所有 1.x.x 的包,包括 1.3.0,但是不包括 2.0.0。
save-exact
使用 save-exact 后,保存到 package.json 的依赖项将使用精确的版本进行配置,而不是使用 npm 的默认 semver 范围运算符。
使用
在项目中可以通过 .npmrc / .yarnrc 来对 save-exact 进行配置。
#.npmrc
save-exact=true
#.yarnrc
save-prefix ~
当我们再次安装使用 yarn add react 时,你会发现不会有滑动版本。
图片
.npmrc / .yarnrc 的配置是项目级别的。你也可以针对某一个依赖使用 save-exact。例如:
yarn add react --save-exact
图片
这样也能达到同样的效果。并且你还可以通过设置用户级别的 npm config 来达到效果。
npm config set save-exact true
不过这里需要注意的是,它们是有优先级的。
配置优先级
除了命令行 save-exact,当我们在使用 npmrc 配置时,按照依赖会检查配置,其实就是检查 .npmrc 的配置,在我们的电脑中存在多个 .npmrc 的配置。
1.项目中的 .npmrc
图片
项目下 .npmrc 文件的优先级最高,可以给每个项目配置不同的镜像,项目之间的配置互不影响。 在项目的根目录下新建 .npmrc 文件,在里面以 key=value 的格式进行配置。
save-exact=true
2.用户配置的 .npmrc(~/.npmrc)
图片
可以通过 npm config get userconfig 命令获取用户配置的 .npmrc 文件在哪里。
图片
可以通过 npm config set 命令设置用户级别的 .npmrc 配置。
npm config set registry https://registry.npm.taobao.org
如果想删除可以直接编辑文件,或者使用 npm config delete registry 命令来进行删除。
3.全局配置的 .npmrc
图片
可以通过 npm config get prefix 命令获取全局配置的 .npmrc 文件的前缀地址,
图片
记住是前缀地址,不是完整地址。完整地址是{$prefix}/etc/npmrc。 但是如果你从来没有全局配置过,就不会存在这个文件。 也可以通过命令行来进行全局 .npmrc 文件的配置。
npm config set registry https://registry.npm.taobao.org -g
4.npm 内置的 .npmrc
npm 内置 .npmrc 配置文件和 npm 同级,所以可以通过获取 npm 的路径,来找到 npm 内置的 .npmrc 文件。 可以通过 which npm 来获取 npm 的路径,也就找到了 npm 内置的 .npmrc 文件。
图片
npm install 执行之后,首先,检查并获取 npm 配置,这里的优先级为:项目级的 .npmrc 文件 > 用户级的 .npmrc 文件> 全局级的 .npmrc 文件 > npm 内置的 .npmrc 文件。
当我们在执行安装命令之后,如果命令行中不包含 save-exact,然后检查并获取 npm 配置中的 save-exact,这里的优先级为:项目级的 .npmrc 文件 > 用户级的 .npmrc 文件> 全局级的 .npmrc 文件 > npm 内置的 .npmrc 文件。
总结
使用 save-exact 可以在项目安装依赖时,保存到 package.json 的依赖项将使用精确的版本进行配置,而不是使用 npm 的默认 semver 范围运算符。在开发过程中以及使用应用程序时,可以安全地允许补丁或次要更新。
参考
https://docs.npmjs.com/cli/v10/commands/npm-install#save-exact
https://teamtreehouse.com/community/why-install-npm-packages-as-saveexact
https://stackoverflow.com/questions/58638817/what-is-the-purpose-of-using-save-exact