Mic*_*ros 16 javascript reactjs webpack babeljs webpack-hmr
我正在尝试创建我的React项目的生成版本,但它选择了错误的配置.
在开发版本中,我正在使用HMR(热模块替换).这是在.babelrc中配置的env > development > plugins.添加额外节点时env > production,似乎会被忽略.它仍在使用HMR的开发配置,这会导致错误:
未捕获错误:locals [0]似乎不是
module启用了热模块替换API 的对象.您应该使用envBabel配置中的部分禁用生产中的react-transform-hmr .请参阅自述文件中的示例:https://github.com/gaearon/react-transform-hmr
当然我已经检查了这些信息,但一切似乎都是正确的.当我从.babelrc的开发配置中删除HMR插件时,它可以工作,证明它确实使用开发配置而不是生产.这是我的文件:
的package.json
{
"name": "myproject",
"main": "index.js",
"scripts": {
"serve": "cross-env NODE_ENV=development webpack-dev-server --content-base bin/ --devtool eval --progress --colors --hot --inline",
"deploy": "cross-env NODE_ENV=production BABEL_ENV=production webpack -p --config webpack.production.config.js"
}
//dependencies omitted in this example
}
Run Code Online (Sandbox Code Playgroud)
.babelrc
{
"presets": ["react", "es2015", "stage-0"],
"plugins": [
["transform-decorators-legacy"]
],
"env": {
"development": {
"plugins": [
["react-transform", {
"transforms": [{
"transform": "react-transform-hmr",
"imports": ["react"],
"locals": ["module"]
}]
}]
]
},
"production": {
"plugins": []
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的package.json > scripts > deploy,我甚至明确地将BABEL_ENV设置为"生产".
为什么会这样?如何确保生成构建忽略HMR插件?
顺便说一句,搜索经常导致React-transform-HMR Github页面上的问题#5,这是一个没有明确解决方案的长线程.
编辑2016.03.30:根据请求添加我的webpack配置的Babel部分.编辑2016.04.06:根据要求添加整个webpack文件.
webpack.production.config.js
require('es6-promise').polyfill();
var path = require('path');
module.exports = {
entry: './main.jsx',
context: __dirname + path.sep + 'src',
output: {
path: path.resolve(__dirname, './bin'),
filename: 'index.js'
},
devServer: {
port: 3333
},
module: {
loaders: [
{
test: /\.js(x?)$/,
exclude: /node_modules/,
loader: 'babel',
query: {
presets: ['react', 'es2015', 'stage-0'],
plugins: [['transform-decorators-legacy']]
}
},
{
test: /\.css$/,
loader: "style!css"
},
{
test: /\.scss$/,
exclude: /(node_modules|bower_components)/,
loader: 'style-loader!css-loader!sass-loader?sourceMap'
}
]
}
};
Run Code Online (Sandbox Code Playgroud)
唯一对我有用的是我写的 -
process.env.NODE_ENV = 'production';
Run Code Online (Sandbox Code Playgroud)
在我的webpack.config.prod.js文件的开头.
看来无论 Babel 怎样继续使用中指定的值development的部分。为我解决问题的方法是使用“development”以外的名称并将其设置为 BABEL_ENV 的值。env.babelrc
"env": {
"dev": {
"plugins": [
]
},
"production": {
}
}
Run Code Online (Sandbox Code Playgroud)
我使用单独的conf进行开发。在插件中我有:
new webpack.DefinePlugin({
'process.env': {
'NODE_ENV': JSON.stringify('development'),
'BABEL_ENV': JSON.stringify('dev')
}
}),
Run Code Online (Sandbox Code Playgroud)
&in shell 意味着它将在后台运行,因此也许您的变量声明不会被同时发生的构建内容捕获。好处是您可以在命令前面添加变量声明。
您可以像这样简化命令:
"serve": "NODE_ENV=development webpack-dev-server --content-base bin/ --devtool eval --progress --colors --hot --inline",
"deploy": "NODE_ENV=production BABEL_ENV=production webpack -p --config webpack.production.config.js"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5533 次 |
| 最近记录: |