babel - es2015和es2017预设不能一起工作

时间:2017-03-13 10:47:43

标签: javascript babeljs

我有两个js文件:play.jsmyStore.js

我想将myStore.js中的代码导入play.js并在那里使用它。我正在使用es2015插件进行导入,但即使我设置了es2017,它也会导致es2017友好代码失败。

play.js

import G from '../functions/myStore.js'; // import needs es2015

// this works with es2017, but not when es2015 is also included
for(k in [1,2,3]) console.log(k) 

myStore.js

var G = {}
export default G


输出
如果我没有import任何内容,并且只使用了es2017预设,则运行正常,但使用es2015和{ {1}}使此失败如下:

es2017

我正在通过for (k in [1, 2, 3]) { ^ ReferenceError: k is not defined 从终端执行此操作。这是我的 package.json

npm start

和我的 babel.rc

{
  "name": "functions",
  "version": "1.0.0",
  "description": "",
  "main": "play.js",
  "scripts": {
    "start": "babel-node play.js"
  },
  "author": "Somjit",
  "license": "ISC",
  "devDependencies": {
    "babel-cli": "^6.24.0",
    "babel-preset-es2015": "^6.24.0",
    "babel-preset-es2015-node5": "^1.2.0",
    "babel-preset-es2017": "^6.22.0"
  }
}

3 个答案:

答案 0 :(得分:3)

确定。我的简短回答是......

1)Babel会读取您的代码,如果它看到一些新的js功能,则会使用预设将其转换为常规js。例如,如果它看到let a = 1 Babel使用preset-es2015(知道let是什么)并将此行转换为var a = 1,那么您的浏览器就可以理解这一行。

2)如果您查看babel-preset-es2017的docs,您会发现它仅支持两个功能。您的代码中没有此功能。因此,在阅读您提供的代码时,babel不会使用此预设。所以es2017对你的问题无关紧要。

3)如果你运行没有es2015的代码,它允许你声明没有var的变量(因为你可以在没有严格模式的js中这样做)。但是当你使用这个预设时,Babel会读取你的代码并拖出一个错误,因为根据新的js标准,你需要用var,let或const声明变量,而不能只写a = 1;

答案 1 :(得分:1)

当我开始使用babel甚至是小东西时,需要花费太多时间来理解。 然后我发现这个tutorial给了我很多帮助。

答案 2 :(得分:0)

在您的情况下,您的问题绝对不是babel-preset-es2017。您必须安装babel-plugin-transform-runtime并将其作为插件放在.babelrc文件中。

安装:

npm install --save-dev babel-plugin-transform-runtime

设置.babelrc文件:

{
  "presets": [
    "es2015",
    "es2017"
  ],
  "plugins": [
    "transform-runtime"
  ]
}