从0到1使用 Webpack5 + React + TS 构建标准化应用

2023-11-15

前言

本篇文章主要讲解如何从一个空目录开始,建立起一个基于webpack + react + typescript的标准化前端应用。

  • 技术栈: webpack5 + React18 + TS
  • 工程化: eslint + prettier + husky + git hooks
  • 支持图片、less、sass、fonts、数据资源(JSON、csv、tsv等)、Antd按需加载以及主题
  • 支持热更新、资源压缩、代码分离(动态导入、懒加载等)、缓存、devServer

背景

在项目开发中,我们可以使用create-react-app或者飞冰等脚手架工具,那么,为什么我们要自己来搭建一个标准化项目?

原因

  • 当我们使用优秀的脚手架工具开发项目时,当然会提升很多便利,他们的功能更全面、性能更强大,但是在这些值得学习的榜样面前,我们需要从零开始,动手去实现每一个细节和功能,看的再多都不如自己动手实现一个demo更有效果。并且动手实践也可以帮助我们理解项目打包和编译的原理,进而提升自己的技术熟练度,扩展我们的知识面。Webpack 实现工程化方方面面的功能,自然不是 all in one code实现的。从 Webpack 的设计理念和实现原理中,我们能接触到工程化方面的知识:架构扩展、插件化、缓存机制。学习Webpack也代表着学习前端的发展趋势:例如在webpack的竟对Vite上,我们可以学到bundleless的理念,跳过了传统的打包这个概念,并且其他先进理念都是我们需要去学习的地方。
  • 开发中,我们发现使用def、aone等生成一个成熟的前端项目模版,不难会发现,项目中的babel、weback、prettier、loader等配置文件缺失,而且难以修改现成的脚手架配置,可扩展能力较弱。导致在性能优化方面能做的工作有限,使得开发受到限制。

项目结构

目录

├── dist                                // 默认的 build 输出目录
├── .husky                              // pre-commit hook
├── webpack.config.js                   // 全局配置文件及webpack配置文件
├── test                                // 测试目录
└── src                                 // 源码目录
    ├── assets                          // 公共的文件(如image、css、font等)
    ├── components                      // 项目组件
    ├── constants                       // 常量/接口地址等
    ├── routes                          // 路由
    ├── utils                           // 工具库
    ├── pages                           // 页面模块
        ├── Home                        // Home模块,建议组件统一大写开头
        ├── ...
    ├── App.tsx                         // react顶层文件
    ├── typing                          // ts类型文件
├── .editorconfig                       // IDE格式规范
├── .eslintignore                       // eslint忽略
├── .eslintrc                           // eslint配置文件
├── .gitignore                          // git忽略
├── .prettierrc                         // prettierc配置文件
├── .babelrc                         // babel配置文件
├── LICENSE.md                          // LICENSE
├── package.json                        // package
├── README.md                           // README
├── tsconfig.json                       // typescript配置文件

依赖

"dependencies": {
    "antd": "^4.22.4", // 懂得都懂
    "react": "^18.2.0", // 懂得都懂
    "react-dom": "^18.2.0" // 懂得都懂
  },
  "devDependencies": {
    // babel全家桶
    "@babel/core": "^7.18.10",
    "@babel/plugin-proposal-class-properties": "^7.18.6", // React class支持
    "@babel/plugin-transform-runtime": "^7.18.10", // 抽离提取 Babel的注入代码,防止重复加载,减小体积
    "@babel/preset-env": "^7.18.10", // 提供的预设,允许我们使用最新的JavaScript
    "@babel/preset-react": "^7.18.6", // react支持
      
    // ts类型检查
    "@types/node": "^18.6.4",
    "@types/react": "^18.0.15",
    "@types/react-dom": "^18.0.6",
    // @types 开头的是对应包的 TypeScript 类型声明
    "@typescript-eslint/eslint-plugin": "^5.33.0",
    "@typescript-eslint/parser": "^5.33.0",
      
    // webpack loader:解析对应文件
    "csv-loader": "^3.0.5",
    "sass-loader": "^13.0.2",
    "xml-loader": "^1.2.1",
    "ts-loader": "^9.3.1",
    "less-loader": "^11.0.0",
      
    // eslint全家桶
    "eslint": "^8.21.0",
    "eslint-config-ali": "^14.0.1", // ali前端规约
    "eslint-config-prettier": "^8.5.0", // 关闭所有不必要或可能与[Prettier]冲突的规则
    "eslint-import-resolver-typescript": "^3.4.0", // 添加 ts 语法支持  eslint-plugin-import
    "eslint-plugin-import": "^2.26.0", // ES6+  import/export 语法支持
    "eslint-plugin-prettier": "^4.2.1", // prettier语法支持
    "eslint-plugin-react": "^7.30.1", // react语法支持
    "eslint-plugin-react-hooks": "^4.6.0", // hooks语法支持
    "eslint-webpack-plugin": "^3.2.0", 
    
    // webpack plugin
    "fork-ts-checker-webpack-plugin": "^7.2.13", // 避免webpack中检测ts类型
    "html-webpack-plugin": "^5.5.0", // 简化HTML文件的创建 ,配合webpack包含hash的bundle使用
    "mini-css-extract-plugin": "^2.6.1", // css拆分
    "optimize-css-assets-webpack-plugin": "^6.0.1", // css压缩
    "terser-webpack-plugin": "^5.3.3", // 使用 terser 压缩 js (terser 是一个管理和压缩 ES6+ 的工具)
    "webpack-bundle-analyzer": "^4.5.0", // webpack打包体积可视化分析
    "webpack-cli": "^4.10.0", // 提供脚手架命令
    "webpack": "^5.74.0", // webpack引擎
    "webpack-dev-server": "^4.9.3", // 开发环境的live server
     
    // 工具
    "husky": "^8.0.1", // 自动配置 Git hooks 钩子
    "less": "^4.1.3", // css类型
    "sass": "^1.54.3", // css类型
    "typescript": "^4.7.4", // ts
    "lint-staged": "^13.0.3", // 对暂存的git文件运行linter
    
    // prettier 格式化
    "prettier": "^2.7.1",
    "pretty-quick": "^3.1.3", // 在更改的文件上运行 prettier
  }

实现过程

项目初始化

首先从一个空目录开始,对项目初始化:

mkdir demo
cd demo
git init
npm init

React和Babel引入

对于一个React项目,我们首先要安装React,写一个Hello World!

安装我们主要的项目依赖:

tnpm i -S react react-dom

由于我们的浏览器不支持最新的ECMAScript语法,所以我们需要Babel来转义为ES5或者ES6。

安装我们的Babel来提高兼容性:

tnpm i -D @babel/core babel-preset-env babel-preset-react @babel/plugin-proposal-class-properties
  • @babel/core: babel转码的核心引擎
  • babel-preset-env: 添加对ES5、ES6的支持
  • babel-preset-react: 添加对JSX的支持
  • @babel/plugin-proposal-class-properties: 对React中class的支持

Webpack引入

tnpm i -D webpack webpack-cli webpack-dev-server html-webpack-plugin
  • webpack: weback插件的核心依赖
  • webpack-cli: 为插件提供命令行工具
  • webpack-dev-server: 帮助启动live server
  • html-webpack-plugin: 帮助创建HTML模版

Babel配置

.babelrc中添加基本配置:

{
  "presets": ["@babel/react", "@babel/env"],
  "plugins": ["@babel/plugin-proposal-class-properties"]
}

Babel Plugin

Babel是代码转换器,借助Babel,我们可以使用最流行的js写法,而plugin就是实现Babel功能

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从0到1使用 Webpack5 + React + TS 构建标准化应用 的相关文章

随机推荐

  • PMBOK(第六版) PMP笔记——《第十章 项目沟通管理》

    第十章 项目沟通管理 PM 大多数时间都用在与干系人的沟通上 第十章有三个过程 规划沟通管理 根据干系人的需求 制定沟通管理计划 管理沟通 根据沟通管理计划发布 收集 处理信息 监督沟通 确保在正确时间将正确信息传递给正确的人 1 10 1
  • 花生壳内网穿透+Windows系统,如何搭建网站?

    1 准备工作 在百度搜索 Win7下安装Apache PHP MySQL 根据搜到的教程自行安装WAMP环境 如果在网页上键入http 127 0 0 1 nbsp 出现以下页面表示您的服务器已经建好 下一步就是关键 如何通过花生壳内网穿透
  • 大家平时天天说的分布式系统到底是什么东西

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 从单块系统说起 团队越来越大 业务越来越复杂 分布式出现 庞大系统分而治之 分布式系统所带来的技术问题 一句话总结 什么是分布式系统设计和开发经验 补充说明 中
  • 【死磕 NIO】— ServerSocketChannel 的应用实例

    大家好 我是大明哥 一个专注于 死磕 Java 的程序员 死磕 Java 系列为作者 chenssy 倾情打造的 Java 系列文章 深入分析 Java 相关技术核心原理及源码 死磕 Java https www cmsblogs com
  • java大数据开发训练营--Java Web 后端技术基础(下)之Spring IOC控制反转

    一 Spring概述 1 1 Spring是什么 Spring是分层的 Java SE EE应用 full stack 全栈式 轻量级开源框架 提供了表现层 SpringMVC和持久层 Spring JDBC Template以及 业务层
  • 目标检测 3—— 人脸检测

    笔记来源 DeepLearning 500 questions 上次学习了目标检测的基本概念 Two Stage和 One Stage 算法 1 目标检测Two Stage 2 目标检测One Stage 4 人脸检测 在目标检测领域可以划
  • rk3368 Android9.0 HIDL调试记录

    rk3368 Android9 0 HIDL调试记录 Platform RK3368 OS Android 9 0 Kernel 4 4 194 文章目录 rk3368 Android9 0 HIDL调试记录 1 使用hidl gen工具生
  • AD使用插件生成交互式BOM

    AD使用插件生成交互式BOM 1 下载AD用交互式BOM插件 首先前往GitHub下载这位大佬开发的插件 地址 https github com lianlian33 InteractiveHtmlBomForAD 下载完成后打开文件所在位
  • 请实现一个简单的网页计算器(vue)

    练习一下父组件向子组件传值 计算部分用eval方法实现 运行截图如下 话不多说 上代码 页面结构 div div
  • JAVA08_Stream流anyMatch和allMatch和noneMatch的区别

    allMatch全匹配 判断数据列表中全部元素都符合设置的predicate条件 如果是就返回true 否则返回false 流为空时总是返回true 接口定义 boolean allMatch Predicate
  • 【华为】Redis客户端API使用(java)

    1 概述 目标读者 本文档专供需要Redis客户端API调用的开发人员 适用于具备Java开发经验的开发人员 简介 Redis客户端通过API调用 向Redis发起命令调用 向Redis或写入或读出数据 基本概念 Redis服务端 提供服务
  • 计算机cpi的公式,EAC=BAC/CPI;EAC=AC+( BAC-EV)/CPI公式分别在什么情况下使用?

    EAC BAC CPI EAC AC BAC EV CPI公式分别在什么情况下使用 来源 信管网 2018年10月30日 所有评论 横渡大漠 cnitpm com 08 21 35 帮忙解释一下 什么情况下用EAC BAC CPI 算 什么
  • 木兰开源社区分论坛

    ChinaOSC 2022 木兰开源社区 技术论坛将于 2022年8月21日15 00 17 30 在陕西省西安高新国际会议中心 会议室 召开 聚焦开源许可证与标准 探索开源发展模式 为国内开源产业打地基 木兰开源社区做了什么 还要怎么做
  • 黑客攻防入门(二)shellcode构造

    1 概说 shell我们都知道是什么了吧 狭义的shellcode 就是一段可以运行shell的代码 构造一段shellcode的作用就是为了在缓冲区溢出时将shellcode的地址覆盖掉正常的返回地址 shellcode通常放在缓冲区内
  • 视觉工程师手写文档之优秀程序员指南篇

    首先 这是我从第一次开始走出校园就一直在完善的一些指南 本来是给自己看的 但现在离职期间再翻看到之后 感触良多 就做了分享 里面很多内容是我在CSDN技术博客上看到的 我认为写的很好的 有些是我自己的总结 大家看看就好
  • Android 中简单计时器的实现方法(Handler和TimerTask)

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 方法一 用handler线程创建计时器 计时器效果如下 第一步 写xml文件
  • 09-1_Qt 5.9 C++开发指南_Qchart概述

    Qt Charts 可以很方便地绘制常见的折线图 柱状图 饼图等图表 不用自己耗费时间和精力开发绘图组件或使用第三方组件了 本章首先介绍 Qt Charts 的基本特点和功能 以画折线图为例详细说明 Qt Charts 各主要部件的操作方法
  • 算法基础课:第一讲——基础算法

    文章目录 前言 排序 1 快速排序 作用 算法思想 模板 例题 AC代码 2 归并排序 作用 算法思想 模板 例题 AC代码 二分 1 整数二分 作用 算法思想 模板 例题 AC代码 总结 2 浮点数二分 算法思想 模板 例题 AC代码 高
  • vue中ref的使用

    今天看了别人写的代码 有些地方不太理解 查阅资料之后真的是受益匪浅 在这里分享给大家
  • 从0到1使用 Webpack5 + React + TS 构建标准化应用

    前言 本篇文章主要讲解如何从一个空目录开始 建立起一个基于webpack react typescript的标准化前端应用 技术栈 webpack5 React18 TS 工程化 eslint prettier husky git hook