【个人笔记】2023年搭建基于webpack5与typescript的react项目
写在前面
由于我在另外的一些文章所讨论或分析的内容可能基于一个已经初始化好的项目,为了避免每一个文章都重复的描述如何搭建项目,我在本文会统一记录下来,今后相关的文章直接引用文本,方便读者阅读。此文主要为个人笔记,不会有太多的关于思路的描述;另外,本文仅仅描述如何搭建基础react项目,不涉及图片等资源的加载,关于图片等资源的处理,我会单独编写一期。
项目初始化
创建一个目录,例如:webpack5-react-demo,然后进入目录执行初始化指令
$ mkdir webpack5-react-demo
$ cd webpack5-react-demo
$ yarn init
yarn init v1.22.19
question name (webpack5-react-demo):
question version (1.0.0):
question description:
question entry point (index.js):
question repository url:
question author:
question license (MIT):
question private:
success Saved package.json
Done in 10.32s.
添加gitignore文件,路径为项目根目录/.gitignore:
.idea
.vscode
node_modules
dist
初始化git仓库:
$ git init
$ git add .
$ git commit -m 'init'
(0)NPM依赖添加
echo '【1】基于webpack的项目核心相关内容'
echo '添加webpack基础四件套依赖'
yarn add -D webpack webpack-cli webpack-dev-server html-webpack-plugin
echo '【2】处理js(x)、ts(x)的相关模块'
echo '添加babel核心模块'
yarn add -D @babel/core
echo '添加babel相关preset欲集'
yarn add -D @babel/preset-env @babel/preset-react @babel/preset-typescript
echo '添加babel相关plugin插件'
yarn add -D @babel/plugin-proposal-class-properties @babel/plugin-proposal-object-rest-spread
echo '添加babel-loader'
yarn add -D babel-loader
echo '【3】处理style样式的相关模块'
echo '添加css-loader以及MiniCssExtractPlugin'
yarn add -D css-loader mini-css-extract-plugin
yarn add -D less less-loader
echo '【4】添加react/react-dom的类型定义以及运行依赖'
yarn add react react-dom
yarn add -D @types/react @types/react-dom
(1)webpack.config.js
作用:webpack基本配置,定义入口、各种loader、plugin等。
路径:项目根目录/webpack.config.js
内容:
const {resolve} = require('path');
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
mode: "development",
entry: {
main: resolve(__dirname, 'src', 'index.tsx')
},
output: {
filename: "index.js",
path: resolve(__dirname, 'dist')
},
resolve: {
// webpack 默认只处理js、jsx等js代码
// 为了防止在import其他ts代码的时候,出现
// " Can't resolve 'xxx' "的错误,需要特别配置
extensions: ['.js', '.jsx', '.ts', '.tsx']
},
module: {
rules: [
{
test: /\.tsx?/,
use: [
'babel-loader'
],
exclude: /node_moudles/
},
{
test: /\.css$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader'
]
},
{
test: /\.less$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'less-loader'
]
}
]
},
plugins: [
new HtmlWebpackPlugin({
template: resolve(__dirname, 'public', 'index.html'),
inject: 'body'
}),
new MiniCssExtractPlugin({
filename: 'app.css'
})
],
devServer: {
port: 8080
}
}
(2).babelrc
作用:被@babel/core读取使用,其中定义了@babel/core要用到的preset、plugin等组件,对ts文件进行编译。想要深入理解,可以阅读另一篇文章:【长文详解】TypeScript与Babel、webpack的关系以及IDE对TS的类型检查 - 知乎 (zhihu.com)。
路径:项目根目录/.babelrc
内容:
{
"presets": [
"@babel/preset-env",
"@babel/preset-typescript",
["@babel/preset-react", {"runtime": "automatic"}]
],
"plugins": [
"@babel/plugin-proposal-object-rest-spread",
"@babel/plugin-proposal-class-properties"
]
}
(3)tsconfig.json
作用:仅作为IDE进行TypeScript类型检查服务的文件,与ts代码编译没有直接关系。可以阅读另一篇文章来了解:【长文详解】TypeScript与Babel、webpack的关系以及IDE对TS的类型检查 - 知乎 (zhihu.com)
路径:项目根目录/tsconfig.json
内容:
{
"compilerOptions": {
"module": "commonjs",
"rootDir": "./src",
"outDir": "./dist",
"jsx": "react-jsx"
}
}
(4)项目代码
src目录下,三个文件:index.tsx、index.module.less、react-app.d.ts。
src/index.tsx
路径:项目根目录/src/index.tsx
内容:
import {createRoot} from "react-dom/client";
import styles from './index.module.less';
const App = () => {
return <div className={styles.app}>Hello, <span>App</span></div>
}
createRoot(document.querySelector('#app')).render(<App/>)
src/index.module.less
路径:项目根目录/src/index.module.less
内容:
html, body {
height: 100%;
width: 100%;
margin: 0;
}
div {
box-sizing: border-box;
}
.app {
height: 100%;
width: 100%;
font-size: 20px;
span {
color: rgb(0, 111, 222);
font-size: 24px;
}
}
src/react-app.d.ts(特别)
作用:仅仅用于类型定义,目前定义的是模块化less文件的结构定义。
路径:项目根目录/src/react-app.d.ts
内容:
declare module '*.module.less' {
const content: {
[className: string]: any
}
export default content;
}
public/index.html
作用:指定的html模板,根webpack.config.js里面HtmlWebpackPlugin所制定的模板路径保持一致。
路径:项目根目录/public/index.html
内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app"></div>
</body>
</html>
运行
在package.json中添加运行脚本:
{
"name": "webpack5-react-demo",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
+ "scripts": {
+ "dev": "webpack-dev-server --config webpack.config.js"
+ },
"devDependencies": {
... ...
},
"dependencies": {
... ...
}
}
效果:

附录
图解webpack配置与NPM包关系

github仓库
w4ngzhen/webpack5-react-demo (github.com)
【个人笔记】2023年搭建基于webpack5与typescript的react项目的更多相关文章
- [读书笔记] 三、搭建基于Spring boot的JavaWeb项目
一.POM <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3. ...
- 搭建基于eclipse的纯的JavaWeb项目
-----------2016.9.9--------------------- 步骤: 1.搭建一个Java项目 2,字该项目下新建一个文件夹,表示根,名字为webapp(name随意) 3,在we ...
- 一文详解如何在基于webpack5的react项目中使用svg
本文主要讨论基于webpack5+TypeScript的React项目(cra.craco底层本质都是使用webpack,所以同理)在2023年的今天是如何在项目中使用svg资源的. 首先,假定您已经 ...
- 从0开始基于Webpack5 搭建HTML+Less 前端工程
基于Webpack5 搭建HTMl+Less的前端项目 新建一个文件夹(比如命名为webpack) 用编辑器打开该文件夹,并在编辑器的终端执行 npm init -y 自动创建pa ...
- Docker学习笔记之一,搭建一个JAVA Tomcat运行环境
Docker学习笔记之一,搭建一个JAVA Tomcat运行环境 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序 ...
- 搭建基于python +opencv+Beautifulsoup+Neurolab机器学习平台
搭建基于python +opencv+Beautifulsoup+Neurolab机器学习平台 By 子敬叔叔 最近在学习麦好的<机器学习实践指南案例应用解析第二版>,在安装学习环境的时候 ...
- 如何在ASP.NET 5上搭建基于TypeScript的Angular2项目
一.前言 就在上月,公司的一个同事建议当前的前端全面改用AngularJs进行开发,而我们采用的就是ASP.NET 5项目,原本我的计划是采用TypeScript直接进行Angular2开发.所以借用 ...
- 面向服务体系架构(SOA)和数据仓库(DW)的思考基于 IBM 产品体系搭建基于 SOA 和 DW 的企业基础架构平台
面向服务体系架构(SOA)和数据仓库(DW)的思考 基于 IBM 产品体系搭建基于 SOA 和 DW 的企业基础架构平台 当前业界对面向服务体系架构(SOA)和数据仓库(Data Warehouse, ...
- 象写程序一样写博客:搭建基于github的博客
象写程序一样写博客:搭建基于github的博客 前言 github 真是无所不能.其 Pages 功能 支持上传 html,并且在页面中显示.于是有好事者做了一个基于 github 的博客管理工具 ...
- Windows 7下 搭建 基于 ssh 的sftp 服务器
Windows xp 下 搭建 基于 ssh 的sftp 服务器,服务器端可以用 freesshd,F-secure server等,filezilla server不可用,之前傻乎乎的用file ...
随机推荐
- delphi IDE 代码 恢复
- FolkMQ "单线程"消息中间件 v1.0.32 发布
简介 采用 "单线程" + "多路复用" + "内存运行" + "快照持久化" + "Broker 集群模式& ...
- NOI 2019 补全记录
D1T1 回家路线 好久之前写的,忘了具体细节,但是发现有平方项所以考虑拆项之后斜率优化. D1T2 机器人 考虑 DP. 记 \(f_{l,r,i}\) 表示 \([l,r]\) 这段区间,最大值为 ...
- 致敬英雄,共悼逝者,css 让页面变黑白
壹 ❀ 引 今天是四月四日清明节,也是全国哀悼抗疫烈士的一天.细心的同学可以发现,不仅是娱乐活动以及游戏全部停止,当我们打开各大门户网站,网站页面也都变成了黑白,那么具体怎么做呢,这里可以借用CSS3 ...
- 二进制文件转Hex和Wav文件转Hex的Java代码
二进制文件转Hex 对于需要将二进制数据写入固件的场景(例如mp3文件), 需要将二进制文件表示为byte数组 import java.io.File; import java.io.FileInpu ...
- oracle FGAC(细粒度访问控制)介绍
在ORACLE中,RLS有时也叫做虚拟私有数据库(VPD)或者细粒度访问控制(FGAC). RLS由8i引进,利用这一特性我们可以对表定义安全策略(并且指明对表的操作类型),实现对用户可以看到或者修改 ...
- django之manage.py migrate无效的问题
问题 已有的model,迁移之后,想重新设置字段,于是将migrations文件夹中除__init__.py之外其他文件都删掉,并且把数据库中的表删除,再次执行以下步骤python manage.py ...
- jupyter notebook更改默认工作目录
jupyter notebook默认配置路径:C:\Users\Administrator\.jupyter\jupyter_notebook_config.py 如果找不到配置文件,可以生成一个 j ...
- 【防忘笔记】一个例子理解Pytorch中一维卷积nn.Conv1d
一维卷积层的各项参数如下 torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1 ...
- java字节、位移以及进制转换
数据存储方式 众所周知,java中的数据都是以二进制的形式存储在计算机中的,但是我们看到的数据怎么是10进制的,因为java提供了很多进制自动转换的方式. 位移 向左位移是*2的幂次,一般都是正数操作 ...