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

Rollup打包提示‘MY_CONSTANT未导出’的问题求助

Rollup打包UMD模块时提示变量未导出的问题

我在打包一个依赖自己另一个JS库的JS库时遇到错误,两个库都是用Rollup打包成UMD模块的。执行npm run build即可复现问题,构建命令为tsc && rollup -c。明明MY_CONSTANT已经在some-package里导出了,Rollup却提示未导出。

报错信息

build/index.js → dist/index.umd.js...
(!) "this" has been rewritten to "undefined"
https://rollupjs.org/guide/en/#error-this-is-undefined
node_modules/some-package/index.umd.js
3:   typeof define === 'function' && define.amd ? define(['exports'], factory) :
4:   (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["clarakm-env-js"] = {}));
5: })(this, (function (exports) { 'use strict';
      ^
6:   var MY_CONSTANT = "this is my constant";
[!] RollupError: "MY_CONSTANT" is not exported by "node_modules/some-package/index.umd.js", imported by "build/index.js".
https://rollupjs.org/guide/en/#error-name-is-not-exported-by-module
build/index.js (1:9)
1: import { MY_CONSTANT } from 'some-package';
            ^
2: console.log(MY_CONSTANT);
3: //# sourceMappingURL=index.js.map
    at error (/home/josh/Desktop/rollup-issue/node_modules/rollup/dist/shared/rollup.js:210:30)
    at Module.error (/home/josh/Desktop/rollup-issue/node_modules/rollup/dist/shared/rollup.js:13578:16)
    at Module.traceVariable (/home/josh/Desktop/rollup-issue/node_modules/rollup/dist/shared/rollup.js:13961:29)
    at ModuleScope.findVariable (/home/josh/Desktop/rollup-issue/node_modules/rollup/dist/shared/rollup.js:12442:39)
    at Identifier.bind (/home/josh/Desktop/rollup-issue/node_modules/rollup/dist/shared/rollup.js:8371:40)
    at CallExpression.bind (/home/josh/Desktop/rollup-issue/node_modules/rollup/dist/shared/rollup.js:6165:28)
    at CallExpression.bind (/home/josh/Desktop/rollup-issue/node_modules/rollup/dist/shared/rollup.js:9888:15)
    at ExpressionStatement.bind (/home/josh/Desktop/rollup-issue/node_modules/rollup/dist/shared/rollup.js:6169:23)
    at Program.bind (/home/josh/Desktop/rollup-issue/node_modules/rollup/dist/shared/rollup.js:6165:28)
    at Module.bindReferences (/home/josh/Desktop/rollup-issue/node_modules/rollup/dist/shared/rollup.js:13574:18)

相关文件内容

src/index.ts

import { MY_CONSTANT } from 'some-package';

console.log(MY_CONSTANT);

rollup.config.mjs

import nodeResolve from '@rollup/plugin-node-resolve';

export default {
  input: 'build/index.js',
  output: {
    file: 'dist/index.umd.js',
    format: 'umd'
  },
  plugins: [
    nodeResolve(),
  ]
};

node_modules/some-package/index.d.ts

export declare const MY_CONSTANT = 'this is my constant'; 

node_modules/some-package/index.umd.js

(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
  typeof define === 'function' && define.amd ? define(['exports'], factory) :
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["clarakm-env-js"] = {}));
})(this, (function (exports) { 'use strict';
  var MY_CONSTANT = "this is my constant";

  exports.MY_CONSTANT = MY_CONSTANT;
}));

node_modules/some-package/package.json

{
  "name": "some-package",
  "version": "1.0.0",
  "main": "index.umd.js",
  "module": "index.umd.js",
  "types": "index.d.ts"
}

问题原因与解决方案

核心原因

Rollup默认无法直接解析UMD格式的模块导出:UMD是为多环境兼容设计的包裹格式,并非标准ES模块,nodeResolve插件只能识别ES模块或CommonJS模块的导出结构,无法从UMD的自执行函数中提取导出内容。此外,some-package的package.json中把module字段指向UMD文件,会误导Rollup认为它是ES模块,进一步加剧识别失败。

解决方案

方案1:给some-package添加ES模块版本

修改some-package的Rollup配置,额外输出ES模块格式文件(如index.esm.js),然后更新其package.json:

{
  "main": "index.umd.js",
  "module": "index.esm.js", // 指向ES模块文件
  "types": "index.d.ts"
}

Rollup会优先加载ES模块,能正确识别MY_CONSTANT的导出。

方案2:在当前项目中使用@rollup/plugin-commonjs插件

如果无法修改some-package,可通过该插件将UMD/CommonJS模块转换为Rollup可识别的格式:

  1. 安装插件:
npm install @rollup/plugin-commonjs --save-dev
  1. 修改rollup.config.mjs:
import nodeResolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';

export default {
  input: 'build/index.js',
  output: {
    file: 'dist/index.umd.js',
    format: 'umd'
  },
  plugins: [
    nodeResolve(),
    commonjs() // 添加该插件
  ]
};

方案3:临时绕过(不推荐)

直接通过全局变量访问,会破坏模块化结构,仅作临时测试用:

// src/index.ts
declare const clarakmEnvJs: { MY_CONSTANT: string };
console.log(clarakmEnvJs.MY_CONSTANT);

内容的提问来源于stack exchange,提问作者Josh M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:20:19