为何Yarn会生成.pnp.loader.mjs与.pnp.cjs文件?
关于Yarn生成的.pnp.loader.mjs和.pnp.cjs文件的说明
核心背景
这两个文件是Yarn 2+(又称Yarn Berry)引入的Plug'n'Play (PnP) 特性的产物。如果你之前用的是Yarn 1(经典版Yarn)或npm,自然不会见到它们——因为npm和Yarn 1采用传统的node_modules依赖管理方式,而PnP是Yarn Berry推出的替代方案。
两个文件的具体用途
- .pnp.cjs:这是PnP的核心配置文件,记录了所有依赖的安装位置、版本、依赖关系等元数据。Node.js或Vite这类构建工具会通过它直接定位依赖文件,无需依赖
node_modules目录。 - .pnp.loader.mjs:这是PnP的加载器脚本,负责拦截Node.js的模块加载逻辑,让Node.js能理解并使用PnP配置来查找依赖。用Yarn Berry启动项目时,这个加载器会被注入到Node.js的加载流程中,确保所有模块都能被正确找到。
生成原因
如果你近期升级了Yarn版本,或是在项目中启用了PnP特性(比如执行过yarn set version berry),Yarn就会自动生成这两个文件,同时默认不再创建node_modules目录。PnP通过直接映射依赖路径的方式,比传统node_modules更节省磁盘空间,还能避免依赖版本冲突问题。
补充说明
如果想回到传统的node_modules管理方式,可以在项目根目录的.yarnrc.yml文件中添加如下配置:
nodeLinker: node-modules
之后重新运行yarn install,Yarn就会生成node_modules,同时不再维护这两个PnP相关文件。
内容的提问来源于stack exchange,提问作者Esteban Sabo
相关产品推荐
相关产品推荐

