【发布时间】:2016-02-01 00:15:54
【问题描述】:
我对文档的理解
我看到 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'
我的问题
所以为了编译干净整洁的所有内容,我将刚刚更新为可与 Babel6 一起使用的 babel-loader 添加到 webpack 配置中,如下所示:
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)
},
[...]
现在,当我在 root 中编译 without .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 上,有人告诉我这是一个 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 放在第二或第三时,我会从上面收到有关语法错误的消息。
最新
有关这些错误的最新进展see my post 或the new babel issue tracker on phabricator 了解更多信息。 (从 6.2.1 开始基本编译已修复,但现在还有其他事情发生)
本文中提到的所有错误在 Babel 6.3.x 中都已完全修复。如果您仍然遇到问题,请更新您的依赖项。
【问题讨论】:
-
我对 gulp 也有同样的问题。我尝试在 .babelrc 和 babelify.configure 中配置 stage-0 预设,但没有用。
-
最新的 babel-core@6.9.0 好像有这个问题。是回归错误吗?
-
@sglai 除了不是很具体,我在 babel-core@6.9.0 上,我的代码编译良好,此后没有太大变化。请参考 phabricator 或打开一个新问题。
标签: reactjs config ecmascript-6 webpack babeljs