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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:43:37