Yarn工作区能否全局配置"type": "module"?如何实现?
Yarn工作区全局启用ES模块(type: module)方案
Yarn工作区默认不会让根目录的"type": "module"自动继承给子工作区,因为每个子工作区都是独立的npm包,Node.js会优先读取子包自身package.json的配置——这就是你遇到SyntaxError: Cannot use import statement outside a module错误的原因。
下面是两种实现全局生效的方法:
方法一:用Yarn 2+的packageExtensions强制注入(推荐)
在根目录的package.json中添加packageExtensions字段,给所有子工作区自动添加type: module配置:
{ "packageManager": "yarn@3.x", "workspaces": ["packages/*"], // 替换为你的子工作区路径 "packageExtensions": { "*": { "type": "module" } } }
这个配置会让Yarn在处理子工作区时,自动给每个子包的package.json补上"type": "module",无需手动修改子包文件。
方法二:批量修改子工作区package.json(兼容Yarn 1)
如果用的是Yarn 1或者不想用packageExtensions,可以写个脚本批量修改所有子包的package.json:
- 在根目录创建
add-type-module.js文件:
const fs = require('fs'); const path = require('path'); // 替换为你的子工作区目录,比如['packages/*', 'apps/*'] const workspacePaths = ['packages/*']; workspacePaths.forEach(glob => { const baseDir = path.resolve(__dirname, glob.replace('*', '')); if (!fs.existsSync(baseDir)) return; fs.readdirSync(baseDir).forEach(dir => { const pkgPath = path.join(baseDir, dir, 'package.json'); if (fs.existsSync(pkgPath)) { const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')); pkg.type = 'module'; fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2)); } }); });
- 运行脚本:
node add-type-module.js,所有子工作区的package.json就会自动加上"type": "module"。后续新增子包时,再跑一遍脚本即可。
内容的提问来源于stack exchange,提问作者Werlious
相关产品推荐
相关产品推荐

