这是我参与「第五届青训营」笔记创作活动的第13天。
为什么需要构建工具
前端构建工具的意义
-
模块化方案
- 提供模块加载方案
- 兼容不同模块规范
-
语法转译
- 高级语法转译,如Sass、TypeScript
- 资源加载,如图片、字体、worker
-
产物质量
产物压缩、无用代码删除、语法降级
-
开发效率
热更新
Vite入门
组成部分:
- No-Bundle开发服务,源文件无需打包
- 生产环境基于Rollup的Bundler
核心特征:
- 高性能,dev启动速度和热更新速度非常快
- 简单易用,开发体验好
如何使用Vite
项目初始化
# 提前安装pnpm
npm i -g pnpm
# 初始化
pnpm create vite
# 安装依赖
pnpm install
# 启动项目
npm run dev
-
静态资源
vite支持常见的图片格式,除此之外Vite也内置了对于JSON、Worker、WASM资源的加载支持
-
HMR
无需配置,默认开启
-
Tree-Shaking
无需配置,默认开启
- 优化:
- 基于ESM的import/export语句依赖关系,与运行时状态无关
- 在构建阶段将未使用到的代码删除
- 优化:
整体架构
关键技术:
-
预打包
-
为什么?
- 避免node_modules过多的文件请求
- 将CommonJS格式转换为ESM格式
-
实现原理:
- 服务启动前扫描代码中用到的依赖
- 用Esbuild对依赖进行打包
- 改写Import语句,指定依赖为与构建产物路径
-
-
单文件编译
用Esbuild编译TS / JSX
-
优势
编译速度大幅提升
-
局限
-
不支持类型检查
-
不支持语法降级
-
-
-
代码压缩
使用Esbuild作为代码压缩工具
-
插件
开发环境:模拟Rollup插件机制
生产环境:直接使用Rollup
Vite进阶
插件开发
- 服务启动阶段
- config
- configResolved
- options
- configureServer
- buildStart
- 请求响应阶段
- transformIndexHtml
- resolveId
- load
- transform
- 热更新阶段
- handleHotUpdate
- 服务关闭阶段
- buildEnd
- closeBundle