Yarn 3搭配Node 17启用Plug'n'Play后无法自动解析.js扩展名问题
你遇到的扩展名解析问题是两个规则共同作用的结果:
- Node 原生 ESM 规范默认要求导入路径必须补全文件扩展名,不支持 CommonJS 模式下的自动补全逻辑
- Yarn PnP 的默认 ESM 加载器会严格遵循 Node ESM 规范,不会自动追加扩展名
你之前的判断正确,yarn node 命令确实会自动加载 .pnp.cjs 接管模块解析逻辑。
可用解决方案
- 方案1:启用 Node 实验性 ESM 解析规则
直接修改启动命令,添加 Node 内置参数即可实现类似 CommonJS 的自动扩展名解析,无需修改任何项目配置:
yarn node --experimental-specifier-resolution=node server.js
该方案对 Node 17.0.1 版本完全兼容。
- 方案2:配置 Yarn PnP 自动识别扩展名
如果你不想使用实验性参数,可以在项目根目录的.yarnrc.yml文件中添加以下配置:
pnpEnableEsmLoader: true pnpExtensions: - .js - .jsx # 如有TypeScript需求可追加对应扩展名 # - .ts # - .tsx
配置完成后执行 yarn install 重新生成 PnP 文件,再用原命令 yarn node server.js 启动即可。
- 方案3:简化启动命令
如果需要固定启动逻辑,可以在 package.json 中添加脚本配置:
{ "scripts": { "start": "yarn node --experimental-specifier-resolution=node server.js" } }
后续只需执行 yarn start 即可完成启动。
内容的提问来源于stack exchange,提问作者Michael Johansen
相关产品推荐
相关产品推荐

