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

Rollup构建本地包在API项目中导出foo报错求助

排查Node API项目引入ESM本地包时的模块解析问题

核心问题分析

你的Node API项目虽已配置type: module和module: esnext,但仍优先加载了本地包mypackage的CJS版本,导致ESM导出的foo无法被识别。React项目正常是因为前端构建工具(如Vite、Webpack)默认优先读取module字段,而Node.js的模块解析逻辑有差异。

具体排查与修复步骤

  • 补全本地包mypackage的package.json配置
    Node.js 12+优先使用exports字段解析模块,仅靠main和module可能触发旧规则。添加exports字段明确区分ESM和CJS入口:

    "exports": {
      ".": {
        "import": "./dist/index.js",
        "require": "./dist/cjs/index.js"
      }
    }
    

    同时确认dist/index.js是标准ESM格式(使用export const foo = ...而非module.exports)。

  • 修正API项目的TypeScript解析配置
    修改tsconfig.json的moduleResolution为node16或nodenext,这两个模式严格遵循Node.js的ESM解析规则:

    {
      "compilerOptions": {
        "module": "esnext",
        "moduleResolution": "node16",
        // 其他配置...
      }
    }
    

    若仍用node模式,TS会降级处理模块解析,可能强制读取CJS版本。

  • 检查API项目的构建工具设置
    如果用Webpack/Rollup/tsup等工具构建:

    • Webpack需确保resolve.mainFields优先读取module:resolve: { mainFields: ['module', 'main'] }
    • Rollup无需额外配置,但要确认未开启强制转换ESM为CJS的插件
    • 若用Babel,需设置@babel/preset-env的modules: false,避免转译ESM
  • 清理依赖缓存与重新关联本地包
    本地包通过npm link引入时易出现缓存问题:

    # 重新关联本地包
    cd mypackage && npm link
    cd ../api-project && npm unlink mypackage && npm link mypackage
    # 或直接删除锁文件重装依赖
    rm package-lock.json node_modules && npm install
    
  • 验证模块解析路径
    在API项目入口文件添加调试代码,确认实际加载的包路径:

    console.log('实际加载的mypackage路径:', import.meta.resolve('mypackage'));
    

    若输出为dist/cjs/index.js,说明exports配置未生效,需检查字段格式是否正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 12:14:57