Vite 知识体系 | 青训营笔记

85 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天

构建工具产生原因

前端工程的痛点

  • 模块化:ESM、CommonJS、UMD
  • 资源编译:高级语法的编译
  • 产物质量:代码体积、代码性能
  • 开发效率:热更新

前端构建工具的意义

  • 模块化方案
    • 提供模块加载方案
    • 兼容不同模块规范
  • 语法转译
    • 高级语法转译
    • 资源加载
  • 产物质量
    • 产物压缩
    • 无用代码删除
    • 语法降级
  • 开发效率
    • 热更新

Vite概览

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

两大组成:

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

核心特征:

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

瓶颈:

  • bundle带来的性能开销
  • JavaScript语言的性能瓶颈

优势:

  • 基于原生ESM的开发服务优势
    • 无需打包项目源代码
    • 天然的按需加载
    • 可以利用文件级的浏览器缓存
  • 基于Esbuild的编译性能优化

使用

# 提前安装 pnpm
npm i -g pnpm
# 初始化命令
pnpm create vite
# 安装依赖
pnpm install
# 启动项目
npm run dev

使用HMR:无需额外的配置,自动开启

生产环境Tree Shaking:

  • 基于ESM的import/export语句依赖关系,与运行时状态无关
  • 在构建阶段将未使用的代码进行删除

Tree Shaking在Vite中无需配置,默认开启

整体架构

image.png

依赖预打包

原因:

  • 避免node_moudles过多的文件请求
  • 将COmmonJs格式转换为ESM格式

实现原理:

  • 服务器启动前扫描代码中用到的依赖
  • 用Esbuild对依赖代码进行滚预打包
  • 改写import语句,指定依赖为预构建产物路径
//改写前
import React from "react";
//改写后
import React from '/node_modules/.vite/react.js'

单文件编译

用Esbuild编译TS/JSX

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

局限性:

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

代码压缩

Esbuild作为默认压缩工具,替换传统的Terser、Uglify.js等压缩工具

插件机制

image.png

开发阶段->模拟Rollup插件机制

生产环境->直接使用Rollup

进阶路线

  1. 深入双引擎:esbuild,rollup.js
  2. Vite插件开发image.png
  3. 代码分割
  • 拆包前:image.png
  • 拆包后:image.png
  1. JS编译工具(Babel)image.png
  2. 语法安全降级
  3. 服务器端渲染(SSR)
  4. 了解底层标准
  5. Vite社区生态