網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
環(huán)境
- vscode
- mac
- react 18
- webpack
- typescript
- npm
一、開(kāi)發(fā)環(huán)境搭建
vscode搭建react-typescript-webpack
1. 創(chuàng)建項(xiàng)目文件夾及webpack配置文件、html入口文件
mkdir react-ts-webpack-demo
cd react-ts-webpack-demo
touch webpack.config.js index.html
2. 初始化npm和創(chuàng)建入口文件index.tsx
npm init -y
- 生成最小粒度的package.json配置文件,之后使用npm安裝的依賴(lài)包都會(huì)放在
package.json
文件中。 - 創(chuàng)建src文件夾將入口文件index.tsx放進(jìn)去,此時(shí)項(xiàng)目結(jié)構(gòu)如下所示:
3. 安裝webpack\react
npm i webpack webpack-cli webpack-dev-server -D
npm i react react-dom -S
此時(shí)的packages.json文件自動(dòng)配置安裝的五個(gè)依賴(lài)包
4. 配置webpack.config.js
(1)安裝html-webpack-plugin、clean-webpack-plugin、awesome-typescript-loader、typescript
npm i html-webpack-plugin --dev
npm i clean-webpack-plugin -S
npm i typescript ts-loader -D
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
module.exports = {
mode: "development", //指定開(kāi)發(fā)模式,默認(rèn)為none
entry: "./src/index.tsx", //入口文件
output: {
path: path.resolve(__dirname, "dist"), //指定輸出文件存放到dist文件夾中
filename: "bundle.js", //指定打包后生成的文件名稱(chēng)為bundle.js
},
module: {
rules: [
{
test: /\.tsx?$/, // 由awesome-typescript-loader 解析以.tsx結(jié)尾的文件
loader: "ts-loader",
exclude: /node_modules/,
},
],
},
resolve: {
extensions: [".tsx", ".ts", ".js"], //定義解析文件的順序,且引入這些文件可以不加后綴
},
plugins: [
//指定加載的index.html
new HtmlWebpackPlugin({
template: path.resolve(__dirname, "index.html"),
}),
// 每次打包都自動(dòng)刪掉上一次打包留下的包(dist)
new CleanWebpackPlugin({}),
],
};
5. 創(chuàng)建和配置tsconfig.json文件
添加 tsconfig.json 文件,告訴 webpack 去哪兒尋找 typescript 文件以及編譯選項(xiàng)配置,配置內(nèi)容如下所示:
{
"compilerOptions": {
"outDir": "./dist/",
"noImplicitAny": true,
"module": "es6",
"target": "es5",
"jsx": "react",
"allowJs": true,
"moduleResolution": "node"
}
}
6. 安裝@react文件
使用@types/前綴表示我們額外要獲取 React 和 React-DOM 的聲明文件
npm i @types/react @types/react-dom -D
7. 到package.json修改啟動(dòng)項(xiàng)目的方式
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"serve": "webpack-dev-server",
"build": "webpack"
},
現(xiàn)在可以使用npm run serve
啟動(dòng)項(xiàng)目,npm run build
打包項(xiàng)目,打開(kāi)之后是空白頁(yè)面,因?yàn)檫€沒(méi)有加入DOM元素對(duì)頁(yè)面進(jìn)行渲染。
目錄結(jié)構(gòu)如下所示:
packages.json文件如下所示:
{
"name": "react-ts-webpack-demo",
"version": "1.0.0",
"description": "",
"main": "webpack.config.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"serve": "webpack-dev-server",
"build": "webpack"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"clean-webpack-plugin": "^4.0.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-scripts": "^5.0.1"
},
"devDependencies": {
"@types/react": "^18.0.14",
"@types/react-dom": "^18.0.5",
"html-webpack-plugin": "^5.5.0",
"ts-loader": "^9.3.1",
"typescript": "^4.7.4",
"webpack": "^5.73.0",
"webpack-cli": "^4.10.0",
"webpack-dev-server": "^4.9.2"
}
}
ps:以上步驟參照文章:https://zhuanlan.zhihu.com/p/59023070,但是做的過(guò)程中發(fā)現(xiàn)頁(yè)面渲染部分有問(wèn)題,所以在文章的基礎(chǔ)上重新做了改進(jìn)。
8. 配置index.html 、入口文件index.tsx
index.html
在body標(biāo)簽里面創(chuàng)建一個(gè)id為root的div,方便入口文件獲取
<!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">
// 將項(xiàng)目標(biāo)題改為從htmlwebpackplugin中動(dòng)態(tài)獲取
<title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
<div id="root"></div>
</body>
</html>
使用createReact獲取根元素root后將DOM渲染到該根元素下面:
import * as React from "react";
import { createRoot } from "react-dom/client";
const root = createRoot(document.getElementById("root"));
root.render(<h1>Hello world!</h1>);
react 18 用createRoot取代React17 的render函數(shù)去渲染DOM元素,開(kāi)發(fā)的時(shí)候遇到了DOM沒(méi)有渲染出來(lái)的問(wèn)題,可以參考附錄的開(kāi)發(fā)過(guò)程記錄文章區(qū)解決。
// 持續(xù)更新中。。。
附錄
開(kāi)發(fā)過(guò)程錯(cuò)誤記錄
- react 18 createRoot沒(méi)有渲染出DOM元素
- 運(yùn)行時(shí)出現(xiàn)Uncaught ReferenceError: process is not defined錯(cuò)誤提示
原文鏈接:https://blog.csdn.net/weixin_46353030/article/details/125518553
相關(guān)推薦
- 2023-01-11 Selenium中的option使用示例_python
- 2023-11-13 linux tar指令壓縮解壓縮文件夾、文件命令詳解
- 2022-10-22 React拖拽調(diào)整大小的組件_React
- 2022-07-08 一文詳解Python中生成器的原理與使用_python
- 2022-04-14 解決Mac環(huán)境下zsh: command not found:
- 2022-02-24 Antv G2折線圖+柱狀圖 自定義圖例(legend)和tooltip
- 2022-09-07 Python的flask常用函數(shù)route()_python
- 2022-07-10 laravel 中 distinct() 的使用方法與去重
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支