Vite 知识体系| 青训营笔记

135 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的的第15天

👋 本文介绍:1. 为什么需要构建工具 2. Vite 是什么 3. Vite 上手使用 4. Vite 整体架构 5. Vite 进阶路线

为什么需要构建工具

前端工程的痛点

  1. 模块化:在前端JS没有统一的模块化规范

(三个主要的规范: ESM、CommonJS、UMD)

  1. 资源编译:高级语法(如:TS、JSX)浏览器是不认识的,所以需要编译成浏览器认识的形式
  2. 产物质量:减小代码体积(如:对没有用到的代码需要剔除掉)、优化代码性能
  3. 开发效率:热更新(想要改动代码就能立即看到效果)

😁而构建工具就能解决如上的问题

前端构建工具的意义

Vite 是什么

概览

定位:新一代前端构建工具

两大组成部分:

  1. No-bundle 开发服务,源文件无需打包
  2. 生产环境基于Rollup的Bundler B

核心特征:

  1. 高性能,dev启动速度和热更新速度非常快!
  2. 简单易用,开发者体验好

Dev Server

扩:浏览器原生ESM支持
两大要素:
1. script 标签增加 type=“module” 属性
2. 使用ESM模块导入导出语法

基于原生ESM的开发服务优势,Vite开发了一套Dev Server,基于ESM的服务,可以去除bundle的开销,按需编译。

优势:

  • 无需打包项目源代码
  • 天然的按需加载
  • 可以利用文件级的浏览器缓存

性能优化

扩:Esbuild—基于Golang开发的前端工具,具备如下能力:
1. 打包器 Bundler
2. 编译器Transformer
3. 压缩器Minifier

基于Esbuild的编译性能优化 ,在Vite 被深度使用,提高性能

内置的Web构建能力

而 Vite 的默认集成度到达什么样的水平呢?

  • 默认集成度很高

Vite 上手使用

项目初始化

使用Sass/Scss & CSS Modules

//src目录
src
|--App.css
|--App.tsx
|--components
|----Header
|------index.module.scss
|------index.tsx
|--favicon.svg
|--index.css
|--logo.svg
|--main.tsx
|--vite-env.d.ts

//安装Sass
pnpm i sass -D

//index.tsx
import styles from'./index.module.scss';
//使用CSS Modules模块化方案,防止cLassName命名冲突export function Header(){
return <p className={styles.header}>This is Header</p>
};

// index.module.scss
.header {
  color: red;
}

//引入 Header 组件
import { Header } from "./components/Header"; 
function App(){
  return(
    <div>
      <Header/>
    </div>
); 
}
export default App;

使用静态资源

/src目录
src
|--App.css
|--App.tsx
|--components
|----Header
|------index.module.scss
|------index.tsx
|--favicon.svg
|--index.css
|--logo.svg
|--main.tsx
|--vite-env.d.ts

//以svg图片为例
import { Header } from "./components/Header"; 
import logoUrl from './Logo. svg'; 
function App(){
return(
  <div>
    <Header/>
    <img src={logoUrl} alt=""/>
  </div>
); 
}
export default App;

Vite 整体架构

1. 依赖预打包

为什么要进行预打包?

因为node_modules不可控,且node_modules产物里面格式可能是不规范的

  1. 避免node_modules过多的文件请求
  2. 将CommonJS格式转换为ESM格式

实现原理:

  1. 服务启动前扫描代码中用到的依赖
  2. 用Esbuild 对依赖代码进行预打包
  3. 改写import 语句,指定依赖为预构建产物路径

2. 单文件编译

用Esbuild 编译TS/JSX

优势:编译速度提升10-100×

局限性:

  • 不支持类型检查
  • 不支持语法降级到ES5

3. 代码压缩

默认使用 Esbuild,替代传统的 Terser、Uglify.js等压缩工具,使得性能得到极大提升

4. 插件机制

既可以用到dev阶段,也可以用到生产环境

Vite 进阶路线

深入双引擎

Vite底层非常依赖的两个引擎:esbuild 和 rollup.js

参考资料:(官方文档写得很详细)


推荐学习顺序:

  • 官方文档都有基本使用的模块,先了解基本使用.动手尝试各项常用配置
  • 然后学习其插件开发

Vite插件开发

参考资料:

Vite插件开发文档 :cn.vitejs.dev/guide/api-p…

复杂度较低的插件:json加载插件 github.com/vitejs/vite…

复杂度中等的插件:Esbuild接入插件

github.com/vitejs/vite…

复杂度较高的插件:官方React插件

github.com/vitejs/vite…

学习思路:

  • 先看文档,过一遍插件钩子的功能
  • 然后多学习其它插件的实现,掌握套路

JS编译工具(Babel)

通过阅读官方文档进行学习:

babel 官方站点:link.juejin.cn/?target=htt…

babel 插件手册: link.juejin.cn/?target=htt…

总结:简单了解了一下Vite的功能及用法,Vite作为前端构建工具,解决了前端的一些痛点,提高了项目的性能,对于Vite的学习,总的来说就是多看官方文档😁