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

使用Babel env preset后Bundle仍含const,Safari 9.x报语法错误

解决Safari 9.x中SyntaxError: Unexpected keyword 'const'问题

这个问题我之前帮客户排查过类似的,Safari 9.x对ES6+语法的支持确实有不少坑,尤其是严格模式下的const声明问题——哪怕用了babel-loader,配置没到位也白搭。下面是一步步的排查和解决思路:

1. 先确认Babel预设的目标浏览器配置

你用了babel-loader,但大概率是@babel/preset-env的目标没指定Safari 9,导致Babel没针对性转译ES6语法。修改你的Babel配置(不管是.babelrc还是webpack里的loader options):

{
  presets: [
    ['@babel/preset-env', {
      targets: {
        safari: '9'
      },
      useBuiltIns: 'usage', // 按需引入兼容补丁
      corejs: 3 // 需要先安装corejs@3,执行npm install core-js@3 --save
    }]
  ]
}

这里核心是告诉Babel:要兼容Safari 9,所有不兼容的语法都要转成ES5。

2. 别漏了第三方依赖的转译

很多时候报错不是来自你的代码,而是项目里的第三方npm包——有些现代库会保留ES6代码,而默认webpack的babel-loader只转译src目录下的文件,导致这些依赖在Safari 9里报错。你需要修改webpack的module规则,把需要转译的依赖包加进去:

module: {
  rules: [
    {
      test: /\.js$/,
      // 排除node_modules,但指定需要转译的包(比如axios、lodash-es这类)
      exclude: /node_modules\/(?!(axios|lodash-es)\/)/,
      use: {
        loader: 'babel-loader',
        options: {
          // 你的Babel配置
        }
      }
    }
  ]
}

3. 针对性解决const的转译问题

如果上面的配置还没解决,你可以单独加个Babel插件专门处理块级作用域的变量:

{
  plugins: ['@babel/plugin-transform-block-scoping']
}

这个插件会把const和let转译为Safari 9能兼容的var写法,彻底解决严格模式下的const报错。

4. 验证转译结果

构建完成后,打开打包后的JS文件搜一下const关键字,如果还有残留,说明某个模块没被转译。可以用webpack-bundle-analyzer分析打包产物,定位到包含const的模块,再针对性调整转译范围。

另外提醒下,Safari 9.x还不支持箭头函数、Promise这些特性,所以@babel/preset-env的targets配置一定要准确,确保所有必要的兼容补丁都能加上。

内容的提问来源于stack exchange,提问作者RavenHursT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:30:41