我从doctor 那里得到的理解

我看到巴别塔6目前有三个预设:es2015、react和stage-x.

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

或者直接包装.比如:

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

我可以进一步使用babel loader和以下网页:

loader: 'babel?presets[]=es2015'


我的问题

因此,为了把所有的东西都编译得干净漂亮,我在网页配置中添加了babel-loader个,它刚刚被更新为与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)
      },
      [...]


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.

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?

This is where I'm stuck.我用Babel5编写了这个组件,当时我可以像这样用babel loader编译,一切都很好:

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)


最近的

有关这些bug的最新进展,请参阅see my postthe new babel issue tracker on phabricator.(Basically compiling is fixed as of 6.2.1 but there's other things happening now)

All the bugs mentioned in this article are completely fixed as of Babel 6.3.x. Please update your dependencies if you're still having issues.

推荐答案

我在这里遇到的两个相当严重的错误,即带有静态属性的ES6类的直接导出和ES6构造函数的问题,在这个线程的答案中讨论过,可以在GitHub上明确地找到这里(导出错误)和这里(构造函数错误).(GitHub Issue Tracker has been closed and 100.)

这两个都是官方确认的bug,自Babel 6.3.17以来已修复

(Maybe one or two earlier, not before 6.3.x, this is the version I'm on and everything is working as it was with Babel5. Happy coding everyone.)


(For the records:)

因此,如果在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
}

GitHub上的简单解决方案是as mentioned by Stryzhevskyi人和几个人:

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)

尽管这是一个合法的规则as pointed out by Dominic Tobias,但这是一个已确认的错误,似乎拥有自己属性的扩展类会抛出此消息或类似消息.到目前为止,我还没有看到任何解决办法.出于这个原因,现在很多人回到了Babel5(从6.1.4开始).

据推测,Babel 6.1.18的发布已经解决了这个问题(参见上面的GitHub问题),但人们,包括我在内,仍然看到同样的问题发生.


还需要注意的是,目前加载babel预设stage-xreactes2015的顺序似乎很重要,可能会改变输出


从巴别塔6.2.1开始

这两个bug都是fixed,代码编译很好.But...还有一个可能会影响很多使用react的人,在运行时抛出ReferenceError: this hasn't been initialised - super() hasn't been called.Referenced here.请继续关注...

自巴别塔6.3.17以来完全修复

(Maybe one or two earlier, not before 6.3.x, this is the version I'm on and everything is working as it was with Babel5. Happy coding everyone.)

Reactjs相关问答推荐

URL参数和React路由中的点

是否将样式应用于父悬停(框架运动)上的子元素?

Formik验证不适用于物料UI自动完成

在Reaction中测试条件组件

将对象添加到集合中的数组时的no_id字段

防止在Reaction中卸载

UseEffect和useSelector的奇怪问题导致无限循环

为多租户SSO登录配置Azure AD应用程序

当列表中的项的顺序改变并且使用唯一键作为它们的索引时,Reaction如何看待呈现方面?

警告:遇到两个子元素拥有同一把 keys .键应该是唯一的,以便组件在更新时保持其身份

React redux 工具包 useGetFilterProductsQuery 和 useGetFilterProductsByCategoriesQuery 未定义为函数

我无法通过 useContext 显示值

在 React 中将 MUI 样式外包到单独的文件中?

无法访问 usefocusEffect 中 const 的更新状态

react 测试库不测试包含 react 路由 dom V6 的组件

基于标记名的博客详细信息分组没有发生

下一次导出:未捕获的语法错误:标识符注册表已被声明

React + i18next + Trans + Prettier:Prettier 最终会在重新格式化 JSX 时 destruct 翻译

Storybook - 无法解析generated-stories-entry.cjs/字段browser不包含有效的别名配置

如何在按钮左下角制作 Material UI 菜单下拉菜单