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

@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语法。
修复步骤
  1. 调整Rollup插件顺序,保证rollup-plugin-svelte放在@rollup/plugin-babel之前。
  2. 修改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
        }]
      ]
    })
    // 其余插件省略
  ]
}
  1. 如果存在本地Babel版本锁版本过低导致默认转译规则不生效的问题,可以显式声明转译插件,不需要依赖preset-env的默认配置:
// 在babel的plugins配置项中加入
plugins: [
  '@babel/plugin-proposal-nullish-coalescing-operator',
  '@babel/plugin-proposal-optional-chaining'
]
  1. 构建完成后在输出的打包文件中搜索??符号,确认已经被转译为三元判断的ES5写法即修复完成。

内容的提问来源于stack exchange,提问作者cascading-jox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:36:22