这是我参与「第四届青训营 」笔记创作活动的第20天。
笔记小结: 本节课杨兴元老师详细讲了Vite的构建工具,依次进行了Vite概要介绍,上手实战以及Vite整体架构,Vite进阶路线。现对照课程内容顺序将笔记补充如下。
01.为什么需要构建工具?
前端痛点:资源
随着前端发展,涉及到的资源是越来越多,如何搞笑快速的进行资源管理问题避无可避,正是由于传统的资源管理方式所带来的一系列弊端,推荐了构建工具的诞生。
构建工具这里从四个方面进行描述:
- 模块化:ESM、CommonJs、UMD
- 模块化方案
- 提供模块加载方案
- 兼容不同模块规范
- 模块化方案
- 资源编译: 高级语法的编译
- 语法转译
- 高级语法转译:如Sass、TypeScript
- 资源加载:如图片、字体、worker
- 语法转译
- 产物质量: 代码体积、代码性能
- 方案
- 产物压缩、无用代码删除、语法降级
- 方案
- 开发效率: 热更新
02. Vite概要介绍
什么是Vite
Vite是一种新型的前端构建工具,它能显著改善前端开发体验。
Vite由两个主要部分组成:
- dev server:利用浏览器的ESM能力来提供源文件,具有丰富的内置功能并具有高效的HMR
- 生产构建:生产环境利用Rollup来构建代码,提供指令用来优化构建过程
Vite作为一个基于浏览器原生ESM的构建工具,它省略了开发环境的打包过程,利用浏览器去解析imports,在服务端按需编译返回。同时,在开发环境拥有速度快到惊人的模块热更新,且热更新的速度不会随着模块增多而变慢。因此,使用Vite进行开发,至少会比Webpack快10倍左右。
定位: 新一代前端构架工具
- 两大组成部分:
- No-bundle开发服务,源文件无需打包
- 生产环境基于Rollup的Bundler
- 核心特征:
- 高性能,dev启动速度和热更新速度非常快
- 简单医易用,开发者体验好
- 传统构架工具遇到的问题
- 缓慢的启动=>项目编译等待成本告
- 缓慢的热更新=>修改代码后不能实时更新
- 瓶颈
- bundle带来的性能开销
- JS语言的性能瓶颈
前端构建工具的意义
03. Vite上手实战
- 提前安装 pnpm (需管理员权限)
npm i -g pnpm
- 初始化命令
pnpm create vite
- 安装依赖
pnpm install
- 项目启动
npm run dev
使用Sass/Scss & Css Modules
- 安装Sass
pnpm i sass -D
-
目录结构
-
index.module.scss
.header {
color: red;
}
- index.tsx
import React from 'react';
import styles from './index.module.scss';
export function Header(){
return <div className={styles.header}>Header</div>
}
- 效果: 页面Header文字表现为红色
使用静态资源
- 用法: 比如图片直接引入在需要的地方加上就即可
使用HMR
无需额外配置自动开启
生产环境 Tree Shaking
Tree Shaking 在Vite中 无需配置,自动开启
-
优化原理
- 基于ESN的import/export 语句依赖关系,与运行时状态无关
- 在构架阶段将为使用道德代码进行删除
-
理解: 在打包时项目中引用单位使用的部分不会进行打包处理
-
打包
pnpm run build
04. Vite整体架构
关键技术:依赖预打包
为什们要进行预打包?
- 避免node_moudles过多的文件请求
- 将COmmonJs格式转换为ESM格式
实现原理:
- 服务器启动前扫描代码中用到的依赖
- 用Esbuild对依赖代码进行滚预打包
- 改写import语句,指定依赖为预构建产物路径
//改写前
import React from "react";
//改写后
import React from '/node_nodules/.vite/react.js'
关键技术:单文件编译
用Esbuild编译TS/JSX
优势: 编译速度提升10-100x
局限性
- 不支持类型检查
- 不支持语法降级为ES5
关键技术:代码压缩
Esbuild作为默认压缩工具,替换传统的Terser、Uglify.js等压缩工具
关键技术:插件机制
- 开发阶段:使用Rollup插件机制
- 生产环境: 直接使用Rollup
- 插件兼容性查阅传送
05. Vite进阶路线
深入双引擎
- Esbuild
- Rollup
学习顺序
- 先了解基本使用,动手尝试各项常用配置
- 然后学习其插件开发
为什么需要插件机制?
- 抽离核心逻辑
- 易于拓展
Vite插件开发
- 服务启动阶段
- config
- configResolved
- options
- configureServer
- buildStart
- 请求相应阶段
- transformIndexHtml
- resolveId => load => transform
- 热更新阶段: handleHotUpdate
- 服务关闭阶段
- buildEnd
- closeBundle
参考资料
- Vite插件开发文档
- 复杂度较低的插件:json加载插件
- 复杂度中等的插件:Esbuild接入插件
- 复杂度较高的插件:官方React插件
代码分割(拆包)
参考资料
-
官方中文文档
-
rollup.js
JS编译工具(Bable)
出现原因:
- JS语法标繁多,浏览器支持程度不一
- 开发者需要用到高级语法
参考资料:
- babe官方站点
- bable插件手册
语法安全降级
如何避免
- 上层解决方案:@vite.js/plugin-legacy
- 底层解决
- 借助Bable进行语法自动降级
- 提前注入Polyfill实现,如core-js,regenerator-runtime
参考资料
- @bable/preset-env文档
- Vite官方降级插件文档
服务器渲染
一种常见的渲染模式,用于提升首屏性能和SEO优化
参考资料
- Vite-SSR
深入了解底层标准
- CJS规范
- ESM规范
- HTTP2.0特性