webpack5搭建一個簡易的react腳手架項(xiàng)目實(shí)踐
項(xiàng)目初始化
首先我們創(chuàng)建一個目錄,初始化 npm,得到一個package.json文件。
mkdir react-cli cd react-cli npm init -y
安裝webpack
安裝webpack和相關(guān)依賴。webpack-dev-server是開啟開發(fā)環(huán)境的服務(wù),webpack-merge是合并公共配置文件。
npm install webpack webpack-cli webpack-dev-server webpack-merge -D
這個時候得到以下結(jié)構(gòu)
react-cli |- node_modules |- package.json |- package-lock.json
搭建腳手架目錄結(jié)構(gòu)
現(xiàn)在,我們將創(chuàng)建以下目錄結(jié)構(gòu)、文件和內(nèi)容:
react-cli |- node_modules |- package.json |- package-lock.json + |- public + |- index.html //入口文件 + |- src + |- App.js + |- index.css + |- App.scss //測試sass + |- index.js + |- webpack.common.js //開發(fā)和生產(chǎn)環(huán)境的公共配置 + |- webpack.prod.js //開發(fā)環(huán)境的配置 + |- webpack.dev.js //生產(chǎn)環(huán)境的配置
public的index.html的內(nèi)容如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>react-cli</title> </head> <body> <div id="root"></div> </body> </html>
src的index.js的內(nèi)容如下:
const root = document.getElementById("root");
root.innerHTML = "cks";開啟本地服務(wù)
我們先安裝html-webpack-plugin。該插件將為你生成一個 HTML5 文件, 在 body 中使用 script 標(biāo)簽引入你所有 webpack 生成的 bundle
npm i html-webpack-plugin -D 復(fù)制代碼
webpack.common.js的公共配置如下:
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
entry: {
index: "./src/index.js",
},
plugins: [
new HtmlWebpackPlugin({
template: "./public/index.html"
})
],
output: {
filename: "[name].bundle.js",
path: path.resolve(__dirname, "dist"),
}
};
webpack.dev.js的配置如下,我們使用webpack-merge進(jìn)行合并公共配置:
const { merge } = require("webpack-merge");
const baseConfig = require("./webpack.common.js");
module.exports = merge(baseConfig, {
mode: "development", //開發(fā)環(huán)境
devtool: "inline-source-map" //可以查看代碼報錯的位置
});修改package.json文件,加上dev命令。
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack-dev-server --config webpack.dev.js"
},然后控制臺npm run dev回車,打開http://localhost:8080 ,如果頁面出現(xiàn)cks證明開啟本地服務(wù)成功,更多詳細(xì)配置查看webpack官網(wǎng) webpack.docschina.org/guides/ 。
配置css&sass
我們安裝樣式文件相關(guān)的loader,在webpack 5 中,可以使用內(nèi)置的Asset Modules處理圖像和字體,我們不用額外安裝。
npm install --save-dev style-loader css-loader sass sass-loader
修改webpack.commmon.js文件:
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
entry: {
index: "./src/index.js",
},
module: {
rules: [
{
test: /css$/i, //匹配css、scss文件
use: ["style-loader", "css-loader", "sass-loader"] // 注意執(zhí)行順序是后往前
},
{
test: /.(png|jpg|jpeg|svg|gif)$/i,
type: "asset/resource"
},
{
test: /.(woff|woff2|eot|ttf|otf)$/i,
type: "asset/resource"
}
],
},
plugins: [
new HtmlWebpackPlugin({
template: "./public/index.html"
})
],
output: {
filename: "[name].bundle.js",
path: path.resolve(__dirname, "dist"),
}
};這樣css和sass的樣式文件就能使用了。
安裝react的相關(guān)依賴
我們要在生產(chǎn)環(huán)境安裝react和react-dom,因?yàn)閞eact的編譯依賴babel,我們也安裝babel相關(guān)的依賴。babel主要是以下這些:
- "babel-loader": 轉(zhuǎn)義 js 文件代碼的 loader
- "@babel/core": babel 核心庫
- "@babel/preset-env": ES6轉(zhuǎn)ES5
- "@babel/preset-react": 轉(zhuǎn)換 JSX 為函數(shù)
npm install --save react react-dom
npm install babel-loader @babel/core @babel/preset-env @babel/preset-react -D
修改webpack.common.js文件,添加babel的loader,當(dāng)然也可以使用配置文件.babelrc的形式。
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
entry: {
index: "./src/index.js",
},
resolve: {
extensions: [".js", ".json", ".jsx"],
},
module: {
rules: [
{
test: /css$/i,
use: ["style-loader", "css-loader", "sass-loader"] // 注意執(zhí)行順序是后往前
},
{
test: /.(png|jpg|jpeg|svg|gif)$/i,
type: "asset/resource"
},
{
test: /.(woff|woff2|eot|ttf|otf)$/i,
type: "asset/resource"
},
{
test: /\.js|jsx$/,
exclude: /node_modules/,
use: {
loader: "babel-loader",
options: {
presets: ["@babel/preset-env", "@babel/preset-react"]
}
}
}
],
},
plugins: [
new HtmlWebpackPlugin({
template: "./public/index.html"
})
],
output: {
filename: "[name].bundle.js",
path: path.resolve(__dirname, "dist"),
}
};然后我們在src的index.js中導(dǎo)入的App組件,將組件渲染到頁面。因?yàn)槲沂前惭b的是React18, React 18 不再支持 ReactDOM.render,改用 createRoot。更多請查看reactjs.org/link/switch…, 我們修改index.js的代碼為:
import React from 'react';
import { createRoot } from 'react-dom/client';
import App from './App';
const container = document.getElementById('root');
const root = createRoot(container); // createRoot(container!) if you use TypeScript
root.render(<App />);瀏覽器打開http://localhost:8080/ 得到以下內(nèi)容證明添加react成功了。

項(xiàng)目添加熱更新
HMR 全稱為 Hot Module Replacement ,中文意思為熱模塊替換。是 webpack 提供的最有用的功能之一。它允許在運(yùn)行時替換,添加,刪除各種模塊,而無需進(jìn)行完全刷新重新加載整個頁面。從 webpack-dev-server v4.0.0 開始,熱模塊替換是默認(rèn)開啟的。如下開啟熱模塊替換:
devServer: {
hot: true,
}上面那個是默認(rèn)開啟的,我們就不配置了,但是設(shè)置那個只是樣式文件進(jìn)行了熱更新,我們的jsx或者js修改還是重新刷新的。所以我們要修改src的index.js文件進(jìn)行react的熱更新。
import React from 'react';
import { createRoot } from 'react-dom/client';
import App from './App';
const container = document.getElementById('root');
const root = createRoot(container); // createRoot(container!) if you use TypeScript
root.render(<App />);
// 如果啟動webpack熱更新,則會執(zhí)行一下代碼
if (module.hot) {
module.hot.accept("./App.js", () => {
const NextApp = require("./App.js").default;
// 再次掛在到dom元素上
root.render(<NextApp />)
})
}生產(chǎn)環(huán)境打包
我們?yōu)閣ebpack.prod.js添加以下代碼進(jìn)行簡單打包。更多打包優(yōu)化查看webpack.docschina.org/guides/
const { merge } = require("webpack-merge");
const baseConfig = require("./webpack.common.js");
module.exports = merge(baseConfig, {
mode: "development", //開啟生產(chǎn)環(huán)境
output: {
clean: true // webpack5的新特性,在生成文件之前清空 output 目錄
}
});同時修改package.json文件代碼,添加打包命令:
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack-dev-server --config webpack.dev.js",
"build": "webpack --config webpack.prod.js"
}然后npm run build打包。
總結(jié)
以上就是webpack5搭建一個簡易的react腳手架項(xiàng)目的大概流程,并總結(jié)一些webpack5的新特性,后面我將總結(jié)一下webpack的打包優(yōu)化。
項(xiàng)目地址:https://gitee.com/chen-kangsen/react-cli
到此這篇關(guān)于webpack5搭建一個簡易的react腳手架項(xiàng)目實(shí)踐的文章就介紹到這了,更多相關(guān)webpack5搭建react腳手架內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js實(shí)現(xiàn)文章文字大小字號功能完整實(shí)例
這篇文章主要介紹了js實(shí)現(xiàn)文章文字大小字號功能的實(shí)現(xiàn)方法,可根據(jù)用戶習(xí)慣調(diào)整顯示文字的大小.詳細(xì)講述了實(shí)現(xiàn)這一功能的完整步驟.是非常實(shí)用的技巧,需要的朋友可以參考下2014-11-11
JS事件處理機(jī)制及事件代理(事件委托)實(shí)例詳解
這篇文章主要介紹了JS事件處理機(jī)制及事件代理,結(jié)合實(shí)例形式詳細(xì)分析了JS時間處理機(jī)制與事件代理功能、用法及相關(guān)使用技巧,需要的朋友可以參考下2023-06-06
細(xì)數(shù)JavaScript 一個等號,兩個等號,三個等號的區(qū)別
下面小編就為大家?guī)硪黄?xì)數(shù)JavaScript 一個等號,兩個等號,三個等號的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10
JS實(shí)現(xiàn)超級好看的鼠標(biāo)小尾巴特效
這篇文章主要給大家介紹了關(guān)于JS實(shí)現(xiàn)超級好看的鼠標(biāo)小尾巴特效的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12

