@rollup/plugin-babel为何未转译空值合并运算符(??)
问题根因
两个配置问题导致转译失效:
@rollup/plugin-babel默认仅处理.js/.mjs/.jsx后缀的文件,不会处理.svelte单文件组件经rollup-plugin-svelte编译后输出的脚本片段,写在组件script标签里的??运算符根本没进入Babel的转译流程,所以能观测到Babel正常给普通JS文件添加polyfill,但Svelte组件里的高版本语法完全没被处理。- 插件顺序或Svelte编译目标配置错误:如果Babel插件放在Svelte插件前面,Babel执行时还拿不到Svelte组件解析后的脚本内容,自然无法转译;部分版本的
rollup-plugin-svelte默认编译目标是ES2017+,本身也不会主动降级ES2020语法。
修复步骤
- 调整Rollup插件顺序,保证
rollup-plugin-svelte放在@rollup/plugin-babel之前。 - 修改Babel插件配置,把
.svelte加入待处理的扩展名列表,同时给Svelte插件设置ES5的编译目标,参考配置:
// rollup.config.js import svelte from 'rollup-plugin-svelte'; import babel from '@rollup/plugin-babel'; export default { // 其他基础配置省略 plugins: [ svelte({ compilerOptions: { // 让Svelte自身先输出ES5兼容的基础代码 target: 'es5' } }), babel({ // 加入.svelte后缀,让Babel处理Svelte组件输出的脚本 extensions: ['.js', '.mjs', '.svelte'], babelHelpers: 'runtime', exclude: 'node_modules/**', presets: [ ['@babel/preset-env', { targets: ['ie >= 11', '> 1%'], // 按实际ES5兼容目标调整 useBuiltIns: 'usage', corejs: 3 }] ] }) // 其余插件省略 ] }
- 如果存在本地Babel版本锁版本过低导致默认转译规则不生效的问题,可以显式声明转译插件,不需要依赖preset-env的默认配置:
// 在babel的plugins配置项中加入 plugins: [ '@babel/plugin-proposal-nullish-coalescing-operator', '@babel/plugin-proposal-optional-chaining' ]
- 构建完成后在输出的打包文件中搜索
??符号,确认已经被转译为三元判断的ES5写法即修复完成。
内容的提问来源于stack exchange,提问作者cascading-jox
相关产品推荐
相关产品推荐

