網站首頁 編程語言 正文
環境
- vscode
- mac
- react 18
- webpack
- typescript
- npm
一、開發環境搭建
vscode搭建react-typescript-webpack
1. 創建項目文件夾及webpack配置文件、html入口文件
mkdir react-ts-webpack-demo
cd react-ts-webpack-demo
touch webpack.config.js index.html
2. 初始化npm和創建入口文件index.tsx
npm init -y
- 生成最小粒度的package.json配置文件,之后使用npm安裝的依賴包都會放在
package.json
文件中。 - 創建src文件夾將入口文件index.tsx放進去,此時項目結構如下所示:
3. 安裝webpack\react
npm i webpack webpack-cli webpack-dev-server -D
npm i react react-dom -S
此時的packages.json文件自動配置安裝的五個依賴包
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", //指定開發模式,默認為none
entry: "./src/index.tsx", //入口文件
output: {
path: path.resolve(__dirname, "dist"), //指定輸出文件存放到dist文件夾中
filename: "bundle.js", //指定打包后生成的文件名稱為bundle.js
},
module: {
rules: [
{
test: /\.tsx?$/, // 由awesome-typescript-loader 解析以.tsx結尾的文件
loader: "ts-loader",
exclude: /node_modules/,
},
],
},
resolve: {
extensions: [".tsx", ".ts", ".js"], //定義解析文件的順序,且引入這些文件可以不加后綴
},
plugins: [
//指定加載的index.html
new HtmlWebpackPlugin({
template: path.resolve(__dirname, "index.html"),
}),
// 每次打包都自動刪掉上一次打包留下的包(dist)
new CleanWebpackPlugin({}),
],
};
5. 創建和配置tsconfig.json文件
添加 tsconfig.json 文件,告訴 webpack 去哪兒尋找 typescript 文件以及編譯選項配置,配置內容如下所示:
{
"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修改啟動項目的方式
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"serve": "webpack-dev-server",
"build": "webpack"
},
現在可以使用npm run serve
啟動項目,npm run build
打包項目,打開之后是空白頁面,因為還沒有加入DOM元素對頁面進行渲染。
目錄結構如下所示:
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,但是做的過程中發現頁面渲染部分有問題,所以在文章的基礎上重新做了改進。
8. 配置index.html 、入口文件index.tsx
index.html
在body標簽里面創建一個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">
// 將項目標題改為從htmlwebpackplugin中動態獲取
<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函數去渲染DOM元素,開發的時候遇到了DOM沒有渲染出來的問題,可以參考附錄的開發過程記錄文章區解決。
// 持續更新中。。。
附錄
開發過程錯誤記錄
- react 18 createRoot沒有渲染出DOM元素
- 運行時出現Uncaught ReferenceError: process is not defined錯誤提示
原文鏈接:https://blog.csdn.net/weixin_46353030/article/details/125518553
相關推薦
- 2022-05-09 C#多線程之線程池ThreadPool用法_C#教程
- 2022-04-10 cmd無法加載命令解決方法
- 2022-09-04 mat矩陣和npy矩陣實現互相轉換(python和matlab)_python
- 2023-12-19 spring boot configuration annotation processor not
- 2022-09-14 Python字符串拼接的4種方法實例_python
- 2022-07-01 ASP.NET中的Web控件介紹_基礎應用
- 2022-06-29 python人工智能tensorflow函數tf.get_collection使用方法_python
- 2022-10-12 使用Docker搭建Vsftpd?的?FTP?服務的詳細過程_docker
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支