使用 Webpack 和生产中的 React Hot Loader 3
React Hot Loader 3 with Webpack and in production
我正在使用 Webpack 和 React Hot Loader v3。在开发中,它基本上按预期工作。但是,我希望在使用
输出静态捆绑文件时禁用热加载功能
webpack --progress -p
但我得到的却是重复出现的此类错误;
这是我的 Webpack 配置;
var path = require('path');
var webpack = require('webpack');
module.exports = {
devServer: {
publicPath: '/js/',
hot: false,
historyApiFallback: true,
port: process.env.PORT || 3000
},
devtool: 'eval-source-map',
entry: [
'react-hot-loader/patch',
'webpack-dev-server/client?http://localhost:3000',
'webpack/hot/only-dev-server',
'./js/app/index'
],
output: {
path: path.join(__dirname, '/web/js/'),
filename: 'bundle.js',
publicPath: '/js/'
},
plugins: [
new webpack.HotModuleReplacementPlugin()
],
module: {
loaders: [
{
test: /\.css$/,
loader: "style-loader!css-loader?modules",
},
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
loader: 'babel',
query: {
presets: ['es2015', 'react', 'stage-0'],
plugins: ['transform-flow-strip-types'],
cacheDirectory: true
},
include: path.join(__dirname, '/js/')
}
]
}
};
我收到了尝试禁用 HotModuleReplacementPlugin()
的建议,但仍然出现相同的错误。关于我在这里遗漏的任何想法?
除了去掉HotModuleReplacementPlugin
,你还需要去掉额外的入口点:
// Current
entry: [
'react-hot-loader/patch',
'webpack-dev-server/client?http://localhost:3000',
'webpack/hot/only-dev-server',
'./js/app/index'
],
// Fixed
entry: [
'./js/app/index'
],
您需要一个单独的生产配置,该配置不在条目中包含开发服务器或热加载程序。请参阅下面我的 webpack 配置的简化版本。如果应用程序是 运行 并且 webpack -p
则 LAUNCH_COMMAND
是 production
并且使用 productionConfig
。
但这只是一种方法。您还可以有一个单独的配置文件用于生产。类似于 webpack.prod.config.js
。然后用 webpack -p --config webpack.prod.config.js
代替 运行ning webpack -p
来指定生产配置。同样,您的生产配置不会在条目中包含 webpack-dev-server
或 hot-loader
。
import webpack from 'webpack'
import path from 'path'
import HtmlWebpackPlugin from 'html-webpack-plugin'
const HtmlWebpackPluginConfig = new HtmlWebpackPlugin({
template: path.join(__dirname, '/app/index.html'),
filename: 'index.html',
inject: 'body',
})
const PATHS = {
app: path.join(__dirname, 'app'),
build: path.join(__dirname, 'dist'),
}
const LAUNCH_COMMAND = process.env.npm_lifecycle_event
const isProduction = LAUNCH_COMMAND === 'production'
process.env.BABEL_ENV = LAUNCH_COMMAND
const productionPlugin = new webpack.DefinePlugin({
'process.env': {
NODE_ENV: JSON.stringify('production'),
},
})
const base = {
output: {
path: PATHS.build,
filename: 'index_bundle.js',
},
}
const developmentConfig = {
entry: [
'webpack-dev-server/client?http://localhost:8080',
'webpack/hot/only-dev-server',
'./app/index',
],
}
const productionConfig = {
entry: [
'./app/index',
],
}
export default Object.assign({}, base,
isProduction === true ? productionConfig : developmentConfig)
我正在使用 Webpack 和 React Hot Loader v3。在开发中,它基本上按预期工作。但是,我希望在使用
输出静态捆绑文件时禁用热加载功能webpack --progress -p
但我得到的却是重复出现的此类错误;
这是我的 Webpack 配置;
var path = require('path');
var webpack = require('webpack');
module.exports = {
devServer: {
publicPath: '/js/',
hot: false,
historyApiFallback: true,
port: process.env.PORT || 3000
},
devtool: 'eval-source-map',
entry: [
'react-hot-loader/patch',
'webpack-dev-server/client?http://localhost:3000',
'webpack/hot/only-dev-server',
'./js/app/index'
],
output: {
path: path.join(__dirname, '/web/js/'),
filename: 'bundle.js',
publicPath: '/js/'
},
plugins: [
new webpack.HotModuleReplacementPlugin()
],
module: {
loaders: [
{
test: /\.css$/,
loader: "style-loader!css-loader?modules",
},
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
loader: 'babel',
query: {
presets: ['es2015', 'react', 'stage-0'],
plugins: ['transform-flow-strip-types'],
cacheDirectory: true
},
include: path.join(__dirname, '/js/')
}
]
}
};
我收到了尝试禁用 HotModuleReplacementPlugin()
的建议,但仍然出现相同的错误。关于我在这里遗漏的任何想法?
除了去掉HotModuleReplacementPlugin
,你还需要去掉额外的入口点:
// Current
entry: [
'react-hot-loader/patch',
'webpack-dev-server/client?http://localhost:3000',
'webpack/hot/only-dev-server',
'./js/app/index'
],
// Fixed
entry: [
'./js/app/index'
],
您需要一个单独的生产配置,该配置不在条目中包含开发服务器或热加载程序。请参阅下面我的 webpack 配置的简化版本。如果应用程序是 运行 并且 webpack -p
则 LAUNCH_COMMAND
是 production
并且使用 productionConfig
。
但这只是一种方法。您还可以有一个单独的配置文件用于生产。类似于 webpack.prod.config.js
。然后用 webpack -p --config webpack.prod.config.js
代替 运行ning webpack -p
来指定生产配置。同样,您的生产配置不会在条目中包含 webpack-dev-server
或 hot-loader
。
import webpack from 'webpack'
import path from 'path'
import HtmlWebpackPlugin from 'html-webpack-plugin'
const HtmlWebpackPluginConfig = new HtmlWebpackPlugin({
template: path.join(__dirname, '/app/index.html'),
filename: 'index.html',
inject: 'body',
})
const PATHS = {
app: path.join(__dirname, 'app'),
build: path.join(__dirname, 'dist'),
}
const LAUNCH_COMMAND = process.env.npm_lifecycle_event
const isProduction = LAUNCH_COMMAND === 'production'
process.env.BABEL_ENV = LAUNCH_COMMAND
const productionPlugin = new webpack.DefinePlugin({
'process.env': {
NODE_ENV: JSON.stringify('production'),
},
})
const base = {
output: {
path: PATHS.build,
filename: 'index_bundle.js',
},
}
const developmentConfig = {
entry: [
'webpack-dev-server/client?http://localhost:8080',
'webpack/hot/only-dev-server',
'./app/index',
],
}
const productionConfig = {
entry: [
'./app/index',
],
}
export default Object.assign({}, base,
isProduction === true ? productionConfig : developmentConfig)