前提
最近在进行Webpack5学习时,学习到HMR,也就是模块热替换,也叫模块热更新的时候,遇到了一个问题。
问题
在进行开发环境内模块热更新的时候,React是借助于React Hot Loader来实现的HMR,目前已经改成使用react-refresh来实现了。
于是乎,我进行了以下代码的编写
代码语言:javascript复制// webpack.config.js
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');
const VueLoaderPlugin = require('vue-loader/lib/plugin');
module.exports = {
// watch: true,
entry: "./src/index.js",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, './build'),
publicPath: "/"
},
devServer: {
hot: true,
port: 8765
},
plugins: [
new HtmlWebpackPlugin({
template: './index.html'
}),
new ReactRefreshWebpackPlugin(),
new VueLoaderPlugin()
],
module: {
rules: [
{
test: /.jsx?$/,
use: "babel-loader"
},
{
test: /.vue$/i,
use: "vue-loader"
},
{
test: /.css/i,
use: [
"style-loader",
"css-loader"
]
}
]
}
}
代码语言:javascript复制// babel.config.js
module.exports = {
presets: [
["@babel/preset-env"],
["@babel/preset-react"],
],
plugins: [
["react-refresh/babel"]
]
}
然后就报出了下述错误。更绝望的是,网上百度不到为什么。
我一度以为是版本问题,但是怎么处理都不像。
还好最后参照了别人使用这个插件的代码,最后发现了问题。
解决方案
直接说问题解决方案
这里面的问题就在于webpack.config.js内module.exports里面的mode。
只要将这个mode设置为development就不会有问题了
代码语言:javascript复制
// webpack.config.js
module.exports = {
mode: 'development' // 就是这里
....
}
注:这个ReactRefreshWebpackPlugin在进行打包的时候,也会存在上述问题,所以对这个插件需要进行开发环境和打包环境的区分。production环境不能引入这个插件