Webpack使用ReactRefreshWebpackPlugin对JSX文件进行本地热更新解析时 $RefreshSig$ is not defined

2022-06-29 08:22:54 浏览数 (1)

前提

最近在进行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环境不能引入这个插件

0 人点赞