reactjs – 如何使用React和Webpack设置Babel 6 stage 0

我从文档的理解

我看到Babel 6现在有三个预设:es2015,反应和stage-x。
我读了,我可以设置在.babelrc像这样:

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

或直接在package.JSON像这样:

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

我可以进一步使用babel-loader与webpack这样:

loader: 'babel?presets[]=es2015'

我的问题

所以编译一切不错,干净我添加babel-loader,它刚刚更新使用Babel6,到webpack配置像这样:

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

现在当我编译没有.babelrc在根或预设选项设置package.JSON,即只有在webpack配置中的babel-loader es2015预设置我得到一个意想不到的令牌错误关于静态propTypes在我的React组件类:

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我被告知这是一个阶段1的功能,即变换类的属性。所以我想立即实现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

或者简而言之:模块构建失败:错误:/…/index.jsx:我们不知道该做什么这个节点类型。我们以前是一个声明,但我们不能在这里?

这是我被困住的地方。我用Babel5编写这个组件,当我能够像这样用babel-loader编译时,一切工作正常:

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

现在我得到提到的错误编译。

>这是一个babel-loader问题,还是babel问题?
>我在哪里必须配置stage-0,使它不会
抛出错误?

更新

当使用预设集编译并使用所提到的类导出错误的解决方法(在创建它之前不能导出类​​),设置预设的顺序会更改错误消息。当我设置stage-0首先错误现在是’this’不允许之前super()(这是内部节点上的错误。可能是内部错误)
当我把stage-0第二或第三我从上面得到关于语法错误的消息。

最新

关于这些bug的最新进展see my postthe new babel issue tracker on phabricator更多。 (基本上编译固定为6.2.1,但现在还有其他事情发生)

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

我在这里遇到的两个相当重的bug,即直接导出带有静态属性的ES6类和ES6构造函数的问题在这个线程的答案中讨论,可以在GitHub上显式地找到(导出bug)和这里(constructor bug)。 (GitHub问题跟踪器已关闭, issues,bugs and requests have moved here)

这些都是正式确认的错误,从Babel 6.3.17以来修复

(也许一两个更早,不是在6.3.x之前,这是我在的版本,一切正在工作,因为它是与Babel5。快乐编码大家。)

(对于记录:)

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

我们不知道该怎么做这个节点类型。我们以前是一个声明,但我们不能在这里?

您可能正在导出具有此类静态属性或类似方式的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
}

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

import React,PropTypes } from 'react'

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

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

‘this’不允许在super()之前(这是内部节点上的错误,可能是内部错误)

尽管是一个合法的规则as pointed out by Dominic Tobias这是一个已确认的错误,其中似乎扩展类有自己的属性将抛出这个或类似的消息。至于现在我还没有看到这一个的任何解决方法。很多人回到Babel5为这个原因现在(从6.1.4)。

据说这是固定的释放Babel 6.1.18(见上面的GitHub问题),但人,我包括,仍然看到同样的确切问题发生。

还要注意,现在,您加载babel预设stage-x,反应和es2015的顺序似乎很重要,可能会改变您的输出。

至于Babel 6.2.1

这两个bug都是固定的,代码编译得很好。但是还有另一个可能影响很多人使用反应,抛出ReferenceError:这没有被初始化 – super()没有在运行时被调用。敬请关注…

从Babel 6.3.17完全修复

(也许一两个更早,不是在6.3.x之前,这是我在的版本,一切正在工作,因为它是与Babel5。快乐编码大家。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom