pnpm
由于node_modules困境问题,引申出来了pnpm
先看下面两张图
npm结构(两个都是npm结构,左侧是npm3之前,右侧是npm3以及之后)
左侧是纯拓扑结构,一层嵌套一层;右侧是进行优化后的结构
pnpm结构(硬链接和软链接)
优缺点
优点
- 显式地将node_modules里面的各种依赖写入,极大避免了业务里错误的引入隐士依赖的问题,所以是可以解决phantom dependency(所有package.json里面的包,都会在node_modules里面有准确对应)
- 解决相同package,不同版本的问题,pnpm是将不同版本放在同一层级里通过软链选择加载版本,而yarn则是放在不同层级,依赖递归查找算法来选择版本
- 安装速度快,巧妙利用硬链接和软链接,可以看这个链接的跑数:https://pnpm.io/benchmarks
- 整个node_modules的包体积也会减少,我们支撑系统,808.5M–>253.3M,减少68.7%
- pnpm不仅仅能保证一个项目里的所有package的每个版本是唯一的,甚至能保证你使得你不同的项目之间也可以公用唯一的版本(只需要公用store即可),这样可以极大的节省了磁盘空间
缺点
- 想要从一个现有项目升级pnpm,可能会报很多错误,因为需要进行显式声明
- 目前可能会有一些未知问题,比如因为是使用链接来进行标记,可能会有一些问题需要考虑(目前我还没有太好地理解这句话)
实际方案
1、下载pnpm
npm install -g pnpm
2、将现有项目切换成pnpm
这个命令会根据你当前的package-lock.json,生成一份pnpm-lock.yaml文件
pnpm import
3、删除现有的package-lock.json,也可以不删除,但是需要注意在日常维护中同步更新package-lock.json和pnpm-lock文件,目前测试的是我们的包管理工具会先走package-lock.json,所以建议直接删除(不排除可以通过配置,让我们的工具只走pnpm-lock文件)
4、重新下载包,只需要在想要使用npm的时候,切换成pnpm命令即可
pnpm install
issues:https://github.com/pnpm/pnpm/issues/3215
翻译: require(‘regenerator-runtime’)可能会作为babel的预置env转换的一部分添加到文件中。在安装了npm的环境中,这个包将被安装为一个传递依赖项,并放置在扁平的node_modules目录中,这样您的代码就会看到它。 在这个意义上,PNPM更严格,您只能访问您声明为依赖项的包,因此您不能访问regnerator-runtime。 您可以将其作为依赖项添加到包中,看看包的“生产运行时”设置是如何要求该包可用的。或者你也可以提升这个包,这样PNPM就会把这个包链接到你的模块根目录,这样你的项目(或者任何monorepo设置中的兄弟项目)就可以访问它。解决:
推荐解决方案:
跟进提示,显式下载每一个需要的包
尝试了多种方案无果,根据作者提示,下载了一个包(这种方案是一个万能方案,但是不建议使用,最好还是根据提示,显式下载每一个缺失的包)
pnpm install --shamefully-hoist
兼容性
参考文章
为什么要使用pnpm:https://juejin.cn/post/6932046455733485575
pnpm一些专业解释:https://juejin.cn/post/6916101419703468045
pnpm好处总结:https://juejin.cn/post/6951190236290351118