-
Notifications
You must be signed in to change notification settings - Fork 14
(十四)配置react模块热更新
阿峰 edited this page Jun 28, 2023
·
2 revisions
热更新上面已经在
devServer
中配置hot
为true
, 在webpack4
中,还需要在插件中添加了HotModuleReplacementPlugin
,在webpack5
中,只要devServer.hot
为true
了,该插件就已经内置了。
现在开发模式下修改css和less文件,页面样式可以在不刷新浏览器的情况实时生效,因为此时样式都在style标签里面,style-loader做了替换样式的热替换功能。但是修改App.tsx,浏览器会自动刷新后再显示修改后的内容,但我们想要的不是刷新浏览器,而是在不需要刷新浏览器的前提下模块热更新,并且能够保留react组件的状态。
可以借助@pmmmwh/react-refresh-webpack-plugin插件来实现,该插件又依赖于react-refresh,
- 安装依赖:
npm i @pmmmwh/react-refresh-webpack-plugin react-refresh -D
- 配置react热更新插件,修改webpack.dev.js
// webpack.dev.js
const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');
module.exports = merge(baseConfig, {
// ...
plugins: [
new ReactRefreshWebpackPlugin(), // 添加热更新插件
]
})
- 为babel-loader配置react-refesh刷新插件,修改babel.config.js文件
const isDEV = process.env.NODE_ENV === 'development' // 是否是开发模式
module.exports = {
// ...
"plugins": [
isDEV && require.resolve('react-refresh/babel'), // 如果是开发模式,就启动react热更新插件
// ...
].filter(Boolean) // 过滤空值
}
- 测试一下,修改App.tsx代码
import React, { useState } from 'react'
function App() {
const [ count, setCounts ] = useState('')
const onChange = (e: any) => {
setCounts(e.target.value)
}
return (
<>
<h2>webpack5+react+ts</h2>
<p>受控组件</p>
<input type="text" value={count} onChange={onChange} />
<br />
<p>非受控组件</p>
<input type="text" />
</>
)
}
export default App
在两个输入框分别输入内容后,修改App.tsx中h2标签的文本,会发现在不刷新浏览器的情况下,页面内容进行了热更新,并且react组件状态也会保留。
新增或者删除页面hooks时,热更新时组件状态不会保留。