react項(xiàng)目自行配置熱更新的實(shí)現(xiàn)
react項(xiàng)目自己配置熱更新的話(huà)需要安裝兩個(gè)包@pmmmwh/react-refresh-webpack-plugin和react-refresh,這個(gè)是官方推薦的做法。下面給出一個(gè)完整demo
App.js
import React, { useState } from "react";
function App() {
const [count, setCount] = useState(0);
return (
<div>
<h1 onClick={() => setCount(count + 1)}>{count}</h1>
<div>1</div>
</div>
);
}
export default App;
index.html
<!DOCTYPE html>
<html lang="zn">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>React App</title>
</head>
<body>
<div id="app"></div>
</body>
</html>
index.js
import React from "react";
import App from "./App";
import { createRoot } from "react-dom/client";
const root = createRoot(document.getElementById("app"));
root.render(<App></App>);
webpack.config.js
const ReactRefreshPlugin = require("@pmmmwh/react-refresh-webpack-plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
entry: "./index.js",
mode: "development",
devServer: {
static: "./dist",
hot: true,
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: "babel-loader",
options: {
presets: ["@babel/env", "@babel/preset-react"],
plugins: [require.resolve("react-refresh/babel")], // react-refresh 添加
},
},
],
},
plugins: [
new ReactRefreshPlugin(),
new HtmlWebpackPlugin({
template: "./index.html",
}),
],
};
package.json
{
"name": "react-hmr",
"version": "0.1.0",
"private": true,
"scripts": {
"start": "webpack-dev-server"
},
"dependencies": {
"@babel/core": "^7.23.3",
"@babel/preset-env": "^7.23.3",
"@babel/preset-react": "^7.23.3",
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.11",
"babel-loader": "^9.1.3",
"html-webpack-plugin": "^5.5.3",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-refresh": "^0.14.0",
"webpack": "^5.89.0",
"webpack-cli": "^5.1.4",
"webpack-dev-server": "^4.15.1"
}
}
之后執(zhí)行npm start,大家自行測(cè)試
這里說(shuō)一下注意點(diǎn),每個(gè)組件只能使用一個(gè)export,如果有多個(gè),熱更新會(huì)失效,這點(diǎn)很重要。例如我們修改App.js
App.js
import React, { useState } from "react";
export const delay = () => {}
function App() {
const [count, setCount] = useState(0);
return (
<div>
<h1 onClick={() => setCount(count + 1)}>{count}</h1>
<div>1</div>
</div>
);
}
export default App;
這里多加了一個(gè)export const delay,大家可以試一下。這個(gè)時(shí)候熱更新就不起作用了。
這里還解釋一下為什么不用webpack的hmr,webpack不是自帶hmr么,為什么還安裝其他的包呢?這個(gè)問(wèn)題大家可以看一下我這篇文章
還有一種方式是使用react-hot-loader,不過(guò)react-hot-loader已經(jīng)不推薦使用了。
我們這里基于上面的代碼進(jìn)行改編,這里react和react-dom需要降級(jí),把18版本降級(jí)成17版本。不然無(wú)法使用。先執(zhí)行
npm i react@17.0.0 react-dom@17.0.0 npm i react-hot-loader
修改webpack.config.js配置
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
entry: "./index.js",
mode: "development",
devServer: {
static: "./dist",
hot: true,
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: "babel-loader",
options: {
presets: ["@babel/env", "@babel/preset-react"],
plugins: ["react-hot-loader/babel"],
},
},
],
},
plugins: [
new HtmlWebpackPlugin({
template: "./index.html",
}),
],
};
修改index.js
import { hot } from "react-hot-loader/root";
import React from "react";
import App from "./App";
import { render } from "react-dom";
const HotComponent = hot(App);
render(<HotComponent />, document.getElementById("app"));
if (module.hot) {
module.hot.accept("./App", () => {
render(<HotComponent />, document.getElementById("app"));
});
}到此這篇關(guān)于react項(xiàng)目自行配置熱更新的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)react自行配置熱更新內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
React之防止按鈕多次點(diǎn)擊事件?重復(fù)提交
這篇文章主要介紹了React之防止按鈕多次點(diǎn)擊事件?重復(fù)提交問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
使用React?Hooks模擬生命周期的實(shí)現(xiàn)方法
這篇文章主要介紹了使用React?Hooks模擬生命周期,本文舉例說(shuō)明如何使用 hooks 來(lái)模擬比較常見(jiàn)的 class 組件生命周期,需要的朋友可以參考下2023-02-02
解析React?ref?命令代替父子組件的數(shù)據(jù)傳遞問(wèn)題
這篇文章主要介紹了React?-?ref?命令為什么代替父子組件的數(shù)據(jù)傳遞,使用?ref?之后,我們不需要再進(jìn)行頻繁的父子傳遞了,子組件也可以有自己的私有狀態(tài)并且不會(huì)影響信息的正常需求,這是為什么呢?因?yàn)槲覀兪褂昧?ref?命令的話(huà),ref是可以進(jìn)行狀態(tài)的傳輸2022-08-08
React路由監(jiān)聽(tīng)/跳轉(zhuǎn)/守衛(wèi)的完整指南
React Router 是 React 單頁(yè)應(yīng)用的核心路由庫(kù),除了基礎(chǔ)的路由配置,日常開(kāi)發(fā)中還會(huì)高頻用到路由監(jiān)聽(tīng)、編程式跳轉(zhuǎn)、路由守衛(wèi)等進(jìn)階功能,本文從實(shí)戰(zhàn)角度拆解這三大核心能力,需要的朋友可以參考下2026-03-03
react性能優(yōu)化useMemo與useCallback使用對(duì)比詳解
這篇文章主要為大家介紹了react性能優(yōu)化useMemo與useCallback使用對(duì)比詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08

