react+webpack热更新、保存react状态
1、先搭建一个webpack+react的项目。 2、webpack.config.js中配置 module.exports = { //... devServer: { hot: true } }; module.exports = { //... plugins: [ //.. new webpack.HotModuleReplacementPlugin() ], }; 3、index.tsx中配置,我用的是typesctipt,不然的话就是index.js,也就是项目入口的js文件 let _module 在开发React应用时,为了提高开发效率,我们通常会使用Webpack进行模块打包,并结合热更新功能,以便在修改代码后无需手动刷新浏览器就能看到实时变化。本文将详细讲解如何在React + Webpack环境中实现热更新,并保持React组件的状态不丢失。 我们需要搭建一个基本的Webpack + React项目。这通常包括安装相关的依赖,如`react`, `react-dom`, `webpack`, `webpack-cli`, `webpack-dev-server`, `babel-core`, `babel-loader`, `@babel/preset-env`, `@babel/preset-react`, `awesome-typescript-loader`(如果使用TypeScript)等。 在配置文件`webpack.config.js`中,我们需要开启热更新功能。这可以通过设置`devServer`对象中的`hot`属性为`true`以及添加`HotModuleReplacementPlugin`插件来实现: ```javascript module.exports = { // ... devServer: { hot: true }, plugins: [ // ... new webpack.HotModuleReplacementPlugin() ] }; ``` 在项目入口文件(通常是`index.tsx`或`index.js`)中,我们需要监听`module.hot`对象,当其存在时,使用`accept`方法接受热更新。这样可以实现页面的自动刷新,但此时React组件的状态会被重置: ```typescript let _module = module as any; if (_module.hot) { _module.hot.accept(() => { ReactDOM.render(<App />, document.querySelector("#app")); }); } ReactDOM.render(<App />, document.querySelector("#app")); ``` 然而,对于需要保持状态的React组件,上述方法是不够的。为了解决这个问题,我们可以引入`react-hot-loader`库,它允许我们在热更新时保留React组件的状态。通过以下命令安装依赖: ```bash npm install react-hot-loader @hot-loader/react-dom ``` 接着,在`webpack.config.js`中,我们需要配置`babel-loader`以包含`react-hot-loader/babel`插件: ```javascript module.exports = { // ... module: { rules: [ { test: /\.js$/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-env'], plugins: ["react-hot-loader/babel"] } }, exclude: /node_modules/ }, { test: /\.tsx?$/, use: [ { loader: "awesome-typescript-loader", options: { useCache: true, cacheDirectory: path.join(__dirname, './../', ".cache-loader"), babelOption: { babelrc: false, plugins: ["react-hot-loader/babel"] } } } ] } ] } }; ``` 在React应用的根组件`App.js`中,导入`react-hot-loader/root`的`hot`函数,并将其应用于组件导出: ```javascript import { hot } from "react-hot-loader/root"; // ... export default hot(App); ``` 确保在引入`react`和`react-dom`之前引入`react-hot-loader`。现在,当你修改代码并保存时,Webpack会进行热更新,同时React组件的状态也会被正确地保留下来。 参考文档: 1. [Webpack官方文档 - Hot Module Replacement Plugin](https://webpack.docschina.org/plugins/hot-module-replacement-plugin/) 2. [react-hot-loader GitHub仓库](https://github.com/gaearon/react-hot-loader) 通过以上步骤,你已经成功地在React + Webpack环境中实现了热更新,并且能够保持React组件的状态。这将极大地提升你的开发效率,使你能更加流畅地进行应用的迭代与调试。