Babel 编译 ES6 代码后出现 SyntaxError: Unexpected token 问题的解决方案

阅读时长 5 分钟读完

问题描述

在使用 Babel 编译 ES6 代码时,有时会出现 SyntaxError: Unexpected token 的错误。这个错误通常出现在使用一些 ES6 特性时,比如箭头函数、模板字符串、解构赋值等等。例如,下面的 ES6 代码:

使用 Babel 编译后,会出现下面的错误:

这个错误提示并不是很具体,无法直接看出哪里出了问题,需要进一步调查。

解决方案

安装插件

Babel 本身只支持解析 ES6 语法,但不具备转换 ES6 语法的能力。因此,需要安装相应的 Babel 插件才能让 Babel 能够正确地转换 ES6 代码。常用的插件包括:

  • babel-preset-env:转换所有最新版本的 ECMAScript 语法,包括 ES6/ES2015,ES2016,ES2017 等。
  • babel-preset-react:转换 JSX 语法,通常配合 babel-preset-env 使用。

这里以 babel-preset-env 为例进行说明。首先,需要在项目中安装 babel-preset-env

安装完成后,在 .babelrc 文件中添加以下配置:

添加 Polyfill

有些特性无法通过转换实现,比如全局对象 PromiseMapSet 等。为了支持这些特性,需要添加相应的 Polyfill。常用的 Polyfill 包括:

  • @babel/polyfill:包含所有 ES6 新特性及新增的内置函数(如 PromiseSetMap 等)的 Polyfill。
  • core-js:与 @babel/polyfill 类似,但具有更细粒度的控制,可以按需引入需要的 polyfill。

这里以 core-js 为例进行说明。首先,需要在项目中安装 core-js

安装完成后,在代码中添加以下行:

这将会添加所有的 Polyfill,为了性能考虑,可以只添加需要的 Polyfill。例如:

这样可以添加 PromiseSetMap 的 Polyfill。

配置 Babel

Babel 可以通过配置文件 .babelrc 来指定编译的参数,常用的参数包括:

  • presets:转换的预设,常用的是 envreact
  • plugins:转换的插件,例如 transform-class-properties 可以将类属性转换为对象的属性。
  • ignore:忽略特定的文件和文件夹。
  • include:需要转换的文件和文件夹。
  • exclude:不需要转换的文件和文件夹。
  • sourceMaps:是否生成 sourceMap,默认值为 false

例如,下面是一个使用了 envtransform-class-properties.babelrc 文件:

示例代码

下面是一个完整的示例代码,使用了箭头函数、模板字符串和解构赋值,并添加了相应的 Polyfill 和 Babel 配置。

-- -------------------- ---- -------
------ ----------------------
------ ------------------
------ ------------------

----- --- - --- -- -- -
  ------ - - --
-

---------------- --- -- -------- ------

----- --- - - -- -- -- - --
----- - -- - - - ----
-------------------- ---------

.babelrc 文件:

-- -------------------- ---- -------
-
  ---------- -
    ------- -
      ---------- -
        ----------- -
          ----- - ----------
          ------- -- --
        -
      --
      -------------- ----
    --
  --
  ---------- -
    ----------------------------
  -
-

总结

Babel 是一个非常强大的工具,可以让我们使用最新的 ECMAScript 语法,同时又能在老版本浏览器中运行。但是,使用 Babel 也会带来一些问题,比如无法正确转换某些语法、无法正确识别某些特性。在解决这些问题时,需要仔细排查,同时注意与其他相关工具的兼容性。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f5afd0f6b2d6eab3e83dae

纠错
反馈