pnpm简介
参考链接:都2022年了,pnpm快到碗里来!
pnpm安装
- 通过corepack安装,这样你可以在项目中指定pnpm版本,如果不指定,corepack自动会安装pnpm最新版本,corepack最低需要node16
- 通过npm i -g pnpm,这个是把pnpm安装在nodejs的目录下面,切换node版本后需要重新安装,且只能有一个pnpm版本
- 通过pnpm官方链接安装
更推荐通过corepack在项目中固定pnpm的版本
如果频繁切换node版本,怎么确保不需要重新 pnpm i
切换node版本后,如果全局安装的是不同的pnpm版本,那么就需要重新pnpm i,这时可以在项目中使用corepack固定pnpm版本,同时启用corepack,不要使用npm i -g pnpm
pnpm配置文件所在
一些常规配置通过pnpm config set默认会改到和npm一样的配置文件里面
pnpm独有的配置文件为 %localappdata%\pnpm\config\rc C:\Users\用户名\AppData\Local\pnpm\config\rc
这个配置文件默认不存在,修改过配置后才会生成
shell
# 这个修改会写入%localappdata%\pnpm\config\rc文件,如果加了--global还是会写入这个文件
pnpm config set store abcpnpm 缓存目录
shell
# 获取缓存目录,在c盘和d盘得到的是不同的缓存目录
# 但是如果你显示的配置过store-dir,那么就会得到同一个缓存目录,但是跨盘符是不能使用hard-link的,这几乎等于store失效,pnpm会完全复制一份需要安装的包
pnpm store pathpnpm符号链接和nodejs的寻址
pnpm 的硬链接 / 符号链接,为什么 Node.js 能正常 require / import
pnpm 看起来把依赖“拆散了”,但 Node.js 的模块解析规则 + 文件系统链接机制 正好能配合得上。
项目内的 .pnpm 目录
node_modules/.pnpm/
lodash@4.17.21/node_modules/lodash- 这里的
lodash目录里的文件 - 👉 硬链接(hard link) 指向 store 里的真实文件
项目的
node_modulesnode_modules/lodash -> .pnpm/lodash@4.17.21/node_modules/lodash
- 👉 这是一个 符号链接(symlink)
Node.js 如何解析模块(关键点)
Node.js 的模块解析规则(简化):
require('lodash')从当前目录开始,向上查找:
./node_modules/lodash ../node_modules/lodash ../../node_modules/lodash找到目录后:
- 读取
package.json - 找
main/exports - 加载对应文件
重点: 👉 Node.js 不会区分真实目录还是符号链接
只要:
- 路径存在
- 文件可读
解析就能继续。
那 Node.js 不会因为路径不同加载两次吗?
这是很多人最关心的点。
Node.js 的模块缓存规则
js
require.cache[resolvedFilename]缓存 key 是:
👉 解析后的真实路径(realpath)
Node.js 会:
text
symlink path
↓ realpath()
真实文件路径所以:
- 同一个包版本
- 同一个物理文件(硬链接)
👉 只会加载一次
pnpm 正是利用了这一点。