如何使用Rollup合并文件?如何阻止Rollup重命名变量g?
阻止Rollup重命名变量
g的方法 Rollup默认会对模块内的局部变量做优化重命名,它把你的g识别成了模块局部变量,所以才会改成g$1。要避免这种情况,你有几种实用方案可选:
方案1:将g暴露为全局变量(适配原有全局代码风格)
在a.js里把g挂载到全局对象(比如浏览器环境的window)上,Rollup会识别它是全局属性,不会再对其重命名:
// a.js window.g = { version: 1, extend: function(source, target) { console.log('in g.extend'); } };
这样合并后的IIFE里,g会保持原有名称,因为它指向的是window.g这个全局属性。
方案2:使用ES模块的导入导出(推荐)
放弃全局变量的写法,改用标准ES模块语法,Rollup会正确处理变量引用,不会随意重命名:
// a.js export const g = { version: 1, extend: function(source, target) { console.log('in g.extend'); } }; // b.js import { g } from './a'; g.extend(g, { h: function() { console.log('in h'); } }); // index.js import './a'; import './b';
这种方式更符合现代JS开发规范,既能避免全局变量污染,也能让Rollup更好地完成树摇、代码压缩等优化操作。
方案3:通过注释标记全局变量
如果你坚持使用全局变量写法,可以在b.js顶部添加注释,明确告诉Rollupg是全局变量,不要对它进行重命名:
// b.js /* global g */ g.extend(g, { h: function() { console.log('in h'); } });
关于合并文件的方式是否正确
你当前通过index.js导入两个文件、Rollup打包成IIFE的方式本身是可行的,但存在一个核心问题:你的原始代码依赖全局变量,而Rollup默认是在模块作用域下处理代码,所以它会把g当成模块局部变量,这才引发了重命名的问题。
如果想让这种合并方式正确且规范,建议采用上面提到的方案2(ES模块导入导出),这是现代JS项目打包的标准做法。如果必须保留全局变量的写法,那么采用方案1将g挂载到全局对象上也能解决问题,但要注意全局变量可能带来的命名冲突风险。
内容的提问来源于stack exchange,提问作者user2331095
相关产品推荐
相关产品推荐

