确定。我正在引导一个简单的应用程序。我正在使用flow.js.我使用的预设是babel-preset-2015,babel-preset-react和babel-preset-stage-0。我必须在我的.babelrc和我的webpack.config中放置相同的预设才能完成所有工作。如果我例如从webpack.config中删除它我得到一个错误'React is not defined'。如果我删除.babelrc和babel-register我得到一个错误,因为我使用import和Flow.js注释。为什么会这样?如果我在webpack.config中放置预设我应该能够删除.babelrc或反之。这就是我的代码现在看起来如何工作(减去一些对问题不重要的文件)。
开始-dev.js
require('babel-register')
require('./src/server/index.js')
index.js
/* @flow */
import Express from 'express'
import path from 'path'
import conf from '../conf/'
const APP_PORT: number = conf.APP_PORT
const PORT = process.env.PORT || APP_PORT
const app: Express = new Express()
// Middleware
app.set('views', path.join(__dirname, 'views'))
app.set('view engine', 'ejs')
app.use(Express.static(path.join(__dirname, '../', 'client', 'dist')))
// Routes
app.get('*', function (req: Object, res: Object) {
res.render('index')
})
app.listen(PORT, function () {
console.log(`Express server is up on port ${PORT}`)
})
app.js
import React from 'react'
import ReactDOM from 'react-dom'
ReactDOM.render(
<h1>First</h1>,
document.getElementById('app')
)
的package.json
{
"scripts": {
"start-dev": "set \"NODE_ENV=development\" && babel-node ./start-dev.js",
"start": "set \"NODE_ENV=development\" && node ./start-dev.js",
"flow": "./node_modules/.bin/flow check",
"standard": "node_modules/.bin/standard --verbose | node_modules/.bin/snazzy"
},
"dependencies": {
"ejs": "^2.5.6",
"express": "^4.15.2",
"react": "^15.4.2",
"react-dom": "^15.4.2"
},
"devDependencies": {
"babel-cli": "^6.24.0",
"babel-core": "^6.24.0",
"babel-eslint": "^7.2.1",
"babel-loader": "^6.4.1",
"babel-preset-es2015": "^6.24.0",
"babel-preset-react": "^6.23.0",
"babel-preset-stage-0": "^6.22.0",
"babel-register": "^6.24.0",
"eslint": "^3.18.0",
"eslint-config-standard": "^7.1.0",
"eslint-plugin-flowtype": "^2.30.4",
"eslint-plugin-react": "^6.10.3",
"flow-bin": "^0.42.0",
"snazzy": "^6.0.0",
"standard": "^9.0.2",
"webpack": "^2.3.2"
}
}
.babelrc
{
"passPerPreset": true,
"presets": [
"es2015",
"react",
"stage-0"
]
}
webpack.config.babel.js
'use strict'
import path from 'path'
const publicPath = path.resolve(__dirname, './src/client')
module.exports = {
devtool: '#source-maps',
performance: {
hints: false
},
context: publicPath,
entry: {
bundle: './app.js'
},
output: {
path: path.join(publicPath, 'dist'),
filename: '[name].js',
publicPath: '/dist/'
},
resolve: {
extensions: ['.js', '.jsx']
},
module: {
rules: [
{
test: /\.jsx?$/,
exclude: /node_modules/,
loader: 'babel-loader',
options: {
presets: [
'react',
'es2015',
'stage-0'
]
}
}
]
}
}
答案 0 :(得分:23)
如果我在webpack.config中放置预设,我应该可以删除
.babelrc
或反之。
不,事实并非如此。在webpack配置中指定预设只会影响webpack,其他所有使用babel的内容(例如babel-node
,babel-register
等)都不会关心你的webpack配置,因此不会看到它们
反过来确实有效。因此,如果您有.babelrc
,则可以删除webpack预设选项,因为babel-loader
使用了引擎盖下的babel,这显然尊重.babelrc
。
如果我从webpack.config中删除它们,我收到错误
React is not defined
。
问题是您的.babelrc
配置与webpack配置中的配置不同。罪魁祸首是"passPerPreset": true
。使用此选项,可以单独应用每个预设而不考虑其他预设。为此,订单很重要。来自babel docs - Plugin/Preset Ordering:
预设顺序相反(从最后到第一个)。
这意味着它们将按以下顺序应用:stage-0
,react
,es2015
。在单独应用它们时,react
会将JSX转换为React.createElement
,因为React
在范围内,es2015
只会将导入转换为_react2.default
,因此不再定义React
。两个包之间的整个差异是:
@@ -9470,7 +9470,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
// var React = require('react')
// var ReactDOM = require('react-dom')
-_reactDom2.default.render(React.createElement(
+_reactDom2.default.render(_react2.default.createElement(
'h1',
null,
'Juhuuuu'
关于passPerPreset
的信息不多,但它在Release notes中标记为实验性的,您应该完全避免使用它。
虽然如果您将react
预设放在列表的第一位,它会起作用,但我建议删除passPerPreset
选项,除非您有非常具体的理由使用它。
{
"presets": [
"es2015",
"react",
"stage-0"
]
}
答案 1 :(得分:1)
尝试修改您的装载程序,如
module: {
rules: [
{
test: /\.jsx?$/,
exclude: [/node_modules/],
use: [{
loader: 'babel-loader',
options: { presets: ['react','es2015', 'stage-0'] }
}],
}
]
}