pnpm今天(5月2日)正式发布v7版本。官方发文说明最大的改动是默认开启 side-effects-cache=true 选项,这个变化是什么呢,下面我们就来聊一聊。
side-effects-cache
一句话说,side-effects-cache开启会让 preinstall 和 postinstall 两个脚本或 hook 执行的结果缓存,这样做会大大减少(非首次)pnpm install 执行的时间。另外,pnpm 本来也以缓存下载结果,加速包下载而著称,这个更新可谓顺理成章。
我们都知道,pnpm 通过硬连接和软连接两种技术缓存重复下载的包,并且避免了幽灵依赖的问题,那么 side-effects-cache 是怎么做到的呢?我们大概可以从这个 Github Issue 里推测出。
My only idea how to do this is to build the package in the node_modules folder into which it is installed. Then cache the created files in some build cache. The build cache has to be node version specific and dependency set specific (the package can be potentially installed with different sets of packages and the result of postinstall might depend on that).
—— zkochan
这是 pnpm 作者的回复,大意是说,将 postinstall 执行的结构储存在某个构建缓存中,这个缓存的内容是由 node-version 以及依赖的包共同决定的,如果 node 的版本和依赖包没有变动,那么 postinstall 的结果也不必改变。
其他改动
其他的改动可以从这个Major Changes 列表中看到,这里简单总结一下。
- pnmp 7 不再支持 Node.js 12
filter必须通过glob语法
也就是说,--filter=./apps 将会报错,正确的写法是 --filter=./apps/**。
pnpx变成仅仅是pnpm dlx的别名
如果你想要执行一个命令行脚本,可以直接使用 pnpm <cmd>,比如 pnpm eslint;如果你想要安装并执行,则执行 pnpm dlx <cmd>。
pnpm install -g pkg行为变动
这个命令不再会向全局的 Node.js 或 npm 文件夹里安装 pkg,除非提前通过 PNPM_HOME 环境变量来指定。
- 不会再把类型包(
@type)默认提升到根目录的 node_modules
这个改动是和这个 Issue 有关。
-
任何以
prettier开头命名的包都会默认提升到根目录的 node_modules -
全局 store 位置的替换:
~/.pnpm-storeto<pnpm home directory>/store -
有一些配置选项将会被移除,见 Github Commit
-
scripts传参去除--
也就是说,自定义脚本的写法可能会发生变动,
"scripts": {
// 修改前
"dev": "pnpm run cmd -- --watch",
// 修改后
"dev": "pnpm run cmd --watch"
}
现在 watch 这个参数将会直接传递给 cmd,而不需要添加 -- 多此一举。
最后,更多的改动可以去发布页面查看。
后记
这次更新某种程度上来说并没有什么 breaking change,对于需要升级的用户,可能需要更改一些脚本的写法(比如 filter),以及注意 monorepo 情况下包的默认提升情况等等。