如何阻止Rollup为导出名称添加`$1`后缀?
$1后缀? 嘿,我来帮你捋捋这个问题!Rollup给你的导出名称加上$1后缀,大概率是因为它检测到这些变量名(C、E、Is、CFunc)和全局作用域里的某个标识重名了——哪怕你自己没觉得这些名称是全局的,也有可能是代码里的某些写法让Rollup产生了误判,或是你不小心把这些变量挂载到了全局对象(比如window)上。
给你几个具体的解决方向,你可以挨个排查尝试:
1. 先检查代码里的全局挂载操作
去看看src/globals/js和src/prop/func.js里的变量声明,是不是有类似window.C = C或者globalThis.E = E这类把变量绑定到全局的代码?如果有的话,Rollup会认为你既要把这个变量放到全局环境,又要作为模块导出,为了避免两者冲突,就会给导出的版本加上$1后缀。
如果确实有全局挂载的需求,你可以把全局挂载的变量名和导出的变量名做区分,或者用Rollup插件来处理全局变量绑定,而非直接在代码里赋值。
2. 排查Rollup配置里的插件设置
打开你的rollup.config.mjs,看看有没有用到@rollup/plugin-inject或者其他和全局变量相关的插件。如果有,仔细检查插件的配置项,是不是不小心把C、E这些自定义变量当成了需要注入的全局依赖?比如要是inject插件的配置里把这些变量列在了全局相关的选项中,Rollup会把它们当成外部全局变量,打包时为了避免冲突就会重命名导出的同名变量。
如果是这个问题,把这些变量从插件的全局配置项里移除即可。
3. 显式指定Rollup的导出行为
在Rollup配置的output选项里,确保设置了exports: 'named',这能让Rollup严格按照你定义的命名规则处理导出,减少自动重命名的概率。另外,如果你没有外部依赖,记得把external选项留空,别把这些自定义变量加到external列表里——不然Rollup会把它们当成外部模块,也可能触发重命名逻辑。
4. 用命名空间包裹导出(兜底方案)
要是上面的方法都没解决问题,或者你想彻底规避这类命名冲突,你可以把这些导出变量放到一个命名空间对象里,比如在入口文件里这样写:
import { C, E, Is } from './globals/js'; import { CFunc } from './prop/func'; export const RAF = { C, E, Is, CFunc };
这样用户导入时就会用import { RAF } from 'your-library',通过RAF.C这类方式使用变量,从根源上避免和全局变量的冲突,自然也就不会出现$1后缀的问题了。当然你也可以选择不这么做,毕竟你提到导入方可以自己包裹或别名,但这个方法能从你的库本身彻底解决冲突隐患。
你可以先从检查代码里的全局挂载操作开始排查,这是触发Rollup自动重命名最常见的原因,再逐步看配置里的插件设置,应该就能找到问题所在啦!
备注:内容来源于stack exchange,提问作者Sideways S

