在 webpack 中为 HMR 配置 babel-loader 的正确方法
Correct way to configure babel-loader in webpack for HMR
大约一周前,我 运行 在将 HMR 添加到我的项目时遇到了一个问题,问题是它根本不起作用,控制台显示 HMR 已启用并且还检测到文件发生了变化,但是它没有重新呈现视图,控制台将记录:
[HMR] Updated modules:
[HMR] - ./app/src/components/app.jsx
[HMR] App is up to date.
但在代码检查器中,视觉上没有任何变化。
经过大量试验,我发现问题是由 babel-loader 引起的,它以某种方式干扰了 webpacks HMR 电机或类似的东西。我通过在 babel 加载器中排除索引文件来解决它,但是我不认为这是最好的方法,因为现在我不能在我的 index.jsx 文件中使用一些 js 功能。我想知道是否有更好的方法来解决这个问题,也许是我的配置或设置 webpacks 热中间件的方式。
这是我的 webpack 配置:
module.exports = {
resolve: {
extensions: ['*', '.js', '.jsx']
},
entry: [
'webpack-hot-middleware/client', './app/src/index.jsx'
],
output: {
path: path.resolve(__dirname, 'build/js'),
filename: 'bundle.js',
publicPath: '/public'
},
devtool: 'cheap-module-source-map',
module: {
rules: [{
test: /\.jsx?$/,
exclude: /node_modules/,
include: path.resolve(__dirname, 'app/src/'),
exclude: path.resolve(__dirname, 'app/src/index.jsx'),
use: [{
loader: 'babel-loader',
options: {
presets: [
'react-hmre'
],
plugins: [
'transform-object-rest-spread'
]
}
}],
}]
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.NoEmitOnErrorsPlugin()
]
}
这就是我在服务器中设置热中间件和 react-hot-loader 的方式:
const webpack = require('webpack')
const webpackDevMiddleware = require('webpack-dev-middleware')
const webpackHotMiddleware = require('webpack-hot-middleware')
const webpackConfig = require('./webpack.dev.config')
const compiler = webpack(webpackConfig)
app.use(webpackDevMiddleware(compiler, {
noInfo: true,
publicPath: webpackConfig.output.publicPath
}))
app.use(webpackHotMiddleware(compiler))
提前致谢。
所以这是我认为的 babel 配置,你需要在 env 预设中选择 modules: false
选项,这样它就可以让 webpack 处理模块,这是一个菜鸟错误,但是伙计,这让我抓狂了好几天.
env 预设的正确配置如下:
['env', {modules: false}]
大约一周前,我 运行 在将 HMR 添加到我的项目时遇到了一个问题,问题是它根本不起作用,控制台显示 HMR 已启用并且还检测到文件发生了变化,但是它没有重新呈现视图,控制台将记录:
[HMR] Updated modules:
[HMR] - ./app/src/components/app.jsx
[HMR] App is up to date.
但在代码检查器中,视觉上没有任何变化。
经过大量试验,我发现问题是由 babel-loader 引起的,它以某种方式干扰了 webpacks HMR 电机或类似的东西。我通过在 babel 加载器中排除索引文件来解决它,但是我不认为这是最好的方法,因为现在我不能在我的 index.jsx 文件中使用一些 js 功能。我想知道是否有更好的方法来解决这个问题,也许是我的配置或设置 webpacks 热中间件的方式。
这是我的 webpack 配置:
module.exports = {
resolve: {
extensions: ['*', '.js', '.jsx']
},
entry: [
'webpack-hot-middleware/client', './app/src/index.jsx'
],
output: {
path: path.resolve(__dirname, 'build/js'),
filename: 'bundle.js',
publicPath: '/public'
},
devtool: 'cheap-module-source-map',
module: {
rules: [{
test: /\.jsx?$/,
exclude: /node_modules/,
include: path.resolve(__dirname, 'app/src/'),
exclude: path.resolve(__dirname, 'app/src/index.jsx'),
use: [{
loader: 'babel-loader',
options: {
presets: [
'react-hmre'
],
plugins: [
'transform-object-rest-spread'
]
}
}],
}]
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.NoEmitOnErrorsPlugin()
]
}
这就是我在服务器中设置热中间件和 react-hot-loader 的方式:
const webpack = require('webpack')
const webpackDevMiddleware = require('webpack-dev-middleware')
const webpackHotMiddleware = require('webpack-hot-middleware')
const webpackConfig = require('./webpack.dev.config')
const compiler = webpack(webpackConfig)
app.use(webpackDevMiddleware(compiler, {
noInfo: true,
publicPath: webpackConfig.output.publicPath
}))
app.use(webpackHotMiddleware(compiler))
提前致谢。
所以这是我认为的 babel 配置,你需要在 env 预设中选择 modules: false
选项,这样它就可以让 webpack 处理模块,这是一个菜鸟错误,但是伙计,这让我抓狂了好几天.
env 预设的正确配置如下:
['env', {modules: false}]