webpack5搭建一個簡易的react腳手架項目實踐
項目初始化
首先我們創(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,因為react的編譯依賴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組件,將組件渲染到頁面。因為我是安裝的是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成功了。
項目添加熱更新
HMR
全稱為 Hot Module Replacement
,中文意思為熱模塊替換。是 webpack
提供的最有用的功能之一。它允許在運行時替換,添加,刪除各種模塊,而無需進(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腳手架項目的大概流程,并總結(jié)一些webpack5的新特性,后面我將總結(jié)一下webpack的打包優(yōu)化。
項目地址:https://gitee.com/chen-kangsen/react-cli
到此這篇關(guān)于webpack5搭建一個簡易的react腳手架項目實踐的文章就介紹到這了,更多相關(guān)webpack5搭建react腳手架內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
細(xì)數(shù)JavaScript 一個等號,兩個等號,三個等號的區(qū)別
下面小編就為大家?guī)硪黄?xì)數(shù)JavaScript 一個等號,兩個等號,三個等號的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10