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可识别的格式:
- 安装插件:
npm install @rollup/plugin-commonjs --save-dev
- 修改
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.
相关产品推荐
相关产品推荐

