You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 在根目录创建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));
    }
  });
});
  1. 运行脚本:node add-type-module.js,所有子工作区的package.json就会自动加上"type": "module"。后续新增子包时,再跑一遍脚本即可。

内容的提问来源于stack exchange,提问作者Werlious

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:57:43