Babel 无法使用扩展运算符编译 ES6 对象克隆

Posted

技术标签:

【中文标题】Babel 无法使用扩展运算符编译 ES6 对象克隆【英文标题】:Babel fails to compile ES6 object cloning with spread operator 【发布时间】:2018-05-19 15:09:57 【问题描述】:

我使用 grunt-babel 来编译我的 ES6 代码。但是当我尝试使用...obj 复制和扩展对象时,它会返回Warning: dist/app.js: Unexpected token (321:9) Use --force to continue.。以下代码在 Chrome v61 的控制台中运行完美,但 Babel 不喜欢它。有什么问题?

let a =  a: 12 ;
let b =  ...a, b: 15 ;

我正在使用env 预设。 (babel-core v.6.26.0babel-preset-env v.1.6.1

【问题讨论】:

什么版本的Babel,你用的什么babel预设,你是怎么编译的?您留下了很多未回答的问题... 是的,同样的问题。我暂时使用Object.assign(, ) 工作,但想知道一个解决方案。 babel-core v.6.26.0babel-preset-env v.1.6.1 【参考方案1】:

对象的扩展属性不是 ES6 的一部分。目前,截至 2017 年 12 月,它是 ECMAScript 第 3 阶段提案的一部分。你可以have a look at the proposal here。

您需要一个 babel 预设,其中包含该语言尚未正式使用的功能。 babel-preset-env 不包含这些功能。

要解决您的问题,您可以使用 babel-preset-stage-3 之类的内容,并将“stage-3”添加到您的 .babelrc 中的预设列表中。

旁注:

ES6 中对象扩展语法的替代方法是使用Object.assign

let b = Object.assign(, a,  b: 15 );

【讨论】:

您的意思是不允许展开操作?但我可以做到k = ...a 就好了。只有两个对象的组合会造成问题。 @NanduKalidindi 同样,这取决于您使用的预设。 我正在使用 env 预设(这些示例中的第二个 JSON babeljs.io/docs/plugins/preset-env) @micobg 当前(2017 年 12 月),babel-preset-env 中不包含扩展运算符 ... is not an operator。剩余参数、扩展参数和剩余/扩展元素都是 ES6 的一部分。只有休息/传播 properties 不是。 @micobg:preset-env 仅包含已正式发布的功能的转换。【参考方案2】:

您可能希望将这些插件添加到您的.babelrc。这个Github问题有很多解决方案unexpected token (rest spread operator)。我现在正在尝试这些。


  "presets": ["react", "es2015"],
  "plugins": ["transform-es2015-destructuring", "transform-object-rest-spread"]

npm install --save-dev babel-plugin-transform-es2015-destructuring

npm install --save-dev babel-plugin-transform-object-rest-spread

【讨论】:

以上是关于Babel 无法使用扩展运算符编译 ES6 对象克隆的主要内容,如果未能解决你的问题,请参考以下文章

使用babel编译es6

如何使用Babel将ES6转码为ES5

使用 ES6 语法和 Babel 扩展 Javascript 中的错误

sh 配合Vue.js配置Webpack - 35. babel编译报错信息的具体,其实就是ES6的模板字符串无法读取

Webpack 4 学习06(使用babel编译ES6)

为什么说 Babel 将推动 JavaScript 的发展