如何使用React和Webpack设置Babel 6 Stage 0

玛丽安:

我对文档的理解

我看到Babel 6目前具有三个预设:es2015,react和stage-x。我读到可以这样设置.babelrc

{
  "presets": ["es2015", "react", "stage-0"]
}

或直接在package.JSON中,如下所示:

{
  ...,
  "version": x.x.x,
  "babel": {
    "presets": ["es2015", "react", "stage-0"]
  },
  ...,
}

我可以进一步将babel-loader与webpack结合使用,如下所示:

loader: 'babel?presets[]=es2015'


我的问题

因此,为了将所有内容都编译得babel-loader井井有条,我在Webpack配置中添加了刚刚更新为与Babel6配合使用的内容:

module.exports = function(options) {
  var jsLoaders = ['babel?presets[]=es2015'];
  [...]
    loaders: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loaders: jsLoaders
      },
      {
        test: /\.jsx$/,
        exclude: /node_modules/,
        loaders: options.production ? jsLoaders : ['react-hot'].concat(jsLoaders)
      },
      [...]


现在,当我 .babelrc使用root或预置选项进行编译时package.JSON,即仅使用webpack配置中设置的babel-loader es2015预置进行编译时,我在React组件类中收到有关静态propTypes的意外令牌错误:

ERROR in ./app/components/form/index.jsx
Module build failed: SyntaxError: /Library/WebServer/Documents/yarsk.test/app/components/form/index.jsx: Unexpected token (19:19)
  17 | // ES6 React Component:
  18 | export default class SurveyForm extends Component {
> 19 |   static propTypes = {
     |                    ^

在GitHub上,我被告知这是一个stage-1功能,即transform-class-properties因此,我想立即实施stage-0
但是
当我通过像上面那样添加.babelrc或定义时package.JSON,我得到一个很奇怪的构建失败错误:

ERROR in ./app/components/form/index.jsx
Module build failed: Error: /Library/WebServer/Documents/yarsk.test/app/components/form/index.jsx: We don't know what to do with this node type. We were previously a Statement but we can't fit in here?
    at NodePath.insertAfter (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/path/modification.js:181:13)
    at NodePath.replaceWithMultiple (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/path/replacement.js:92:8)
    at handleClassWithSuper (/Library/WebServer/Documents/yarsk.test/node_modules/babel-plugin-transform-class-constructor-call/lib/index.js:80:10)
    at PluginPass.Class (/Library/WebServer/Documents/yarsk.test/node_modules/babel-plugin-transform-class-constructor-call/lib/index.js:101:11)
    at newFn (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/visitors.js:233:27)
    at NodePath._call (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/path/context.js:72:18)
    at NodePath.call (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/path/context.js:44:17)
    at NodePath.visit (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/path/context.js:102:12)
    at TraversalContext.visitQueue (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/context.js:151:16)
    at TraversalContext.visitSingle (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/context.js:111:19)
    at TraversalContext.visit (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/context.js:195:19)
    at Function.traverse.node (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/index.js:139:17)
    at NodePath.visit (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/path/context.js:106:22)
    at TraversalContext.visitQueue (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/context.js:151:16)
    at TraversalContext.visitMultiple (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/context.js:106:17)
    at TraversalContext.visit (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/context.js:193:19)
    at Function.traverse.node (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/index.js:139:17)
 @ ./app/index.jsx 9:0-28

或简而言之: Module build failed: Error: /.../index.jsx: We don't know what to do with this node type. We were previously a Statement but we can't fit in here?

这就是我卡住的地方。当我能够像这样用babel-loader编译时,我用Babel5编写了这个组件,并且一切正常:

loader: 'babel?optional[]=runtime&stage=0

现在,我正在编译提到的错误。

  • 这是babel-loader问题还是babel问题?
  • 我必须在哪里进行配置,stage-0以免引发错误?


更新资料

当使用预设集进行编译并且对类导出错误使用提及的解决方法时(必须在创建类之后才导出类),设置的预设顺序会更改错误消息。当我stage-0首先设置错误时,现在的错误是:'this' is not allowed before super() (This is an error on an internal node. Probably an internal error)当我放置stage-0第二或第三时,我从上方得到有关语法错误的消息。


最新

有关这些错误的最新进展,请参阅我的文章phabricator上的新babel问题跟踪器以获取更多信息。(从6.2.1开始,基本编译是固定的,但是现在还发生了其他事情)

从Babel 6.3.x开始,本文中提到的所有错误均已完全修复。如果仍有问题,请更新您的依赖关系。

玛丽安:

我在这里遇到的两个很严重的错误,即具有静态属性的ES6类的直接导出和ES6构造函数的问题,在此线程的答案中进行了讨论,可以在GitHub上明确找到(导出错误),此处(构造函数错误)(GitHub Issue Tracker已关闭,问题,错误和请求已移至此处。)

这些都是官方确认的错误,自Babel 6.3.17起已修复

(也许早一两个,而不是6.3.x之前的版本,这是我正在使用的版本,并且一切都与Babel5一样工作。祝大家编码愉快。)


(作记录:)

因此,如果您在CLI中收到以下错误消息:

We don't know what to do with this node type. We were previously a Statement but we can't fit in here?

您有可能以这种方式或类似的方式导出具有静态属性的ES6类(请注意,这似乎不再与正在扩展的类相关,而是与具有静态属性的类相关联)

import React, { Component, PropTypes } from 'react'

export default class ClassName extends Component {
  static propTypes = {...}
  // This will not get compiled correctly for now, as of Babel 6.1.4
}

Stryzhevskyi和GitHub上的一些人提到的简单解决方法

import React, { Component, PropTypes } from 'react'

class ClassName extends Component {
  static propTypes = {...}
}
export default ClassName // Just export the class after creating it



第二个问题是有关以下错误的:

'this' is not allowed before super() (This is an error on an internal node. Probably an internal error)

尽管Dominic Tobias指出这是一个合法的规则但这是一个已确认的错误,其中似乎具有自己属性的扩展类将抛出此消息或类似消息。到目前为止,我还没有看到任何解决方法。出于这个原因,很多人现在都回滚到Babel5(从6.1.4开始)。

据说这已经在Babel 6.1.18发行版中得到了解决(参见GitHub问题),但是包括我在内的人们仍然看到同样的问题正在发生。


还需要注意,现在在您加载预设通天塔的顺序stage-xreact并且es2015似乎是重要的,可能会改变你的输出。


从Babel 6.2.1开始

这两个错误都是固定的,代码可以正常编译。但是...还有另一种可能会影响很多使用React的人,它们会ReferenceError: this hasn't been initialised - super() hasn't been called在运行时抛出这里引用敬请关注...


自Babel 6.3.17起已完全修复

(也许早一两个,而不是6.3.x之前的版本,这是我正在使用的版本,并且一切都与Babel5一样工作。祝大家编码愉快。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Linux $ [$ RANDOM%6] == 0]

使用webpack,ES6和Babel进行调试

babel-preset-stage-0,babel-preset-stage-1等之间有什么区别?

如何使用React + ES6 + webpack导入和导出组件?

webpack / babel / es6导入问题-(0,_whatwgFetch2.default)不是函数

ES6,ES7(及更高版本),ES2015,stage-0,stage-1(及更高版本)之间是什么关系?

如何将Webpack babel-loader和es6与worker-loader一起使用?

无法使用箭头功能(React,Babel,Webpack,ES6)

如何为Pug,React和ES6设置Webpack

如何使用“ babel-node --presets es2015,stage-3”为电子应用设置npm start

使用Webpack和Babel的ES6动态导入

Babel的“ stage-0”预设是否稳定?

[[stage_in]],MTLVertexDescriptor和MTKMesh之间的连接

使用Webpack 4.5 + Babel 6 + React 16导入JSON时出错

反应本机转换-错误找不到预设“ babel-preset-react-native-stage-0”

将本地npm库与es6,babel和webpack一起使用

如何使用babel和webpack设置ua react / node项目?

使用Babel 7运行Mocha 6 ES6测试,如何设置?

如何阅读此lambda x:f'{x:0> 6}'

使用OpenCV readNetFromTensorFlow运行Keras DNN模型(UNet):错误:未知的图层类型op解码器中的图形Shape_stage0_upsampling / Shape

如何在Matlab中将前6行和所有列设置为0

在静脉示例中,我如何知道stage的值何时或为什么从0变为1?

./components/Avatar.tsx错误:找不到模块'@ babel / preset-stage-0'

git add和git stage之间的区别?

如何修复require.ensure错误Webpack,Babel6,React?

babel-preset-stage-0 没有转换异步生成器函数

尽管使用 babel-preset-react、babel-preset-es2015 和 babel-preset-stage-3,browserify 仍无法解析 jsx

无法使用 webpack 中的 babel-loader 加载 stage-3 javascript 文件

foldLeft 在 (0 /: (1 to 6))(_+_) 中是如何计算的?