Vite
目前前端生态中,主流构建工具可分为 “全能型”(功能全面,适合复杂应用)、“专注型”(垂直场景优化,如库打包)、“极速型”(性能优先,适合开发环境)三大类。
-
vite: 现代开发体验标杆
- 简介:2020 年由 Vue 作者尤雨溪开发,基于 ESBuild(开发环境) 和 Rollup(生产环境),主打“极速开发体验”。
-
特色
- 开发环境:浏览器原生ESM + esBuild => 极速开发体验
- 生产环境:Rollup
-
解决问题
- 痛点:
- 冷启动慢:需先打包整个应用(即使只改一行代码),耗时随项目规模线性增长;
- 热更新(HMR)慢:模块变更后需重新打包依赖链,大型项目更新延迟可达数秒。
- 解决思路
- 开发环境:利用浏览器原生 ESM 能力,按需加载源码(无需打包),配合 esbuild 预构建依赖
- 生产环境:复用 Rollup 成熟的 Tree Shaking、代码分割和产物优化能力,输出高性能静态资源。
- 痛点:
-
核心优势
- 极速冷启动:开发环境无需打包,冷启动时间 <1 秒(大型项目也仅需几秒)
- 毫秒级热更新:基于 ESM 的 HMR 仅更新变更模块,无需重建整个应用
- 零配置开箱即用:内置对 Vue/React/Svelte/Preact 等框架的支持,自动处理 CSS 预处理器、静态资源、环境变量;
- 生态兼容:兼容 Rollup 插件和部分 Webpack 插件,支持自定义插件扩展;
- 生产构建优化:Rollup 输出精简代码,支持代码分割、压缩、预加载等。
-
Vite 架构原理
-
开发环境:ESM + esbuild 预构建
- 核心逻辑:浏览器直接加载源码(.vue/.tsx/.js),通过原生 ESM 解析依赖,仅对第三方依赖和高频小模块进行预构建(避免浏览器频繁请求)。
- 关键技术:
-
原生 ESM 加载:Vite 启动开发服务器后,将源码中的 import语句转换为浏览器可识别的 ESM 路径(如 ./src/main.js→ /src/main.js?t=123),浏览器直接请求源码文件。
// 源码中的 import import { createApp } from 'vue'; // Vite 转换为(开发环境) import { createApp } from '/node_modules/.vite/deps/vue.js?v=xxx'; -
依赖预构建(Optimized Dependencies):第三方依赖(如 vue/react/lodash)通常以 CommonJS 格式发布,且可能存在大量小模块(如 lodash的子模块)。Vite 用 esbuild 将其预构建为 ESM 格式的单文件,并缓存到 node_modules/.vite目录,解决两个问题:
- 将 CommonJS 转 ESM,适配浏览器;
- 合并小模块,减少 HTTP 请求数。
- [预构建-触发时机]:首次启动、依赖变更(package.json或 vite.config.js修改)时自动执行。
-
esbuild 转译:用 esbuild 实时转译 TS/JSX/TSX 代码(速度比 Babel 快 10-100 倍),但不做类型检查(需配合 vue-tsc或 tsc --noEmit单独检查)。
- 实时转译:涉及到请求拦截
-
HMR 热更新:基于 ESM 的 import实现,当文件变更时,Vite 仅向浏览器推送变更模块的“更新通知”,浏览器重新请求新模块并替换,无需刷新页面。
- 怎么推送???
- 对 Vue/React 组件:通过框架自身的 HMR 能力(如 Vue 的 @vitejs/plugin-vue处理 .vue文件的热更新);
- 对普通 JS/TS 文件:直接替换模块。
-
-
生产环境:Rollup 打包
- 核心逻辑:生产环境需优化加载性能,Vite 用 Rollup 替代 esbuild 进行打包,利用 Rollup 的Tree Shaking(剔除未使用代码)和代码分割能力,输出更精简的产物。
- Rollup 的优势:
- Tree Shaking 更彻底:基于 ES 模块的静态分析,精准识别未使用代码(esbuild 的 Tree Shaking 相对基础);
- 代码分割更灵活:支持按动态导入(import())自动拆分代码块,或手动配置 manualChunks;
- 产物格式丰富:支持 ESM、CJS、UMD 等,适配不同运行环境。
- Vite 对 Rollup 的增强:
- 自动配置 Rollup:根据项目类型(Vue/React)自动生成 Rollup 配置(如处理 .vue文件、CSS 提取);
- 扩展 Rollup 插件:内置 @vitejs/plugin-vue/@vitejs/plugin-react等插件,处理框架特有语法;
- 生产环境优化:默认开启代码压缩(esbuild 或 terser)、资源内联、预加载提示(preload/prefetch)。
- Rollup 的优势:
- 核心逻辑:生产环境需优化加载性能,Vite 用 Rollup 替代 esbuild 进行打包,利用 Rollup 的Tree Shaking(剔除未使用代码)和代码分割能力,输出更精简的产物。
-
-
Vite 核心功能详解
- 提供脚手架 create-vite, 支持快速初始化项目, 内置模板覆盖主流框架
- 内置框架插件
- Vue:@vitejs/plugin-vue(支持 .vue单文件组件、Vue SFC 编译)
- React:@vitejs/plugin-react(支持 JSX、Fast Refresh 热更新)
- ...
- 模块解析与资源处理
- 模块解析规则
- 扩展名省略:导入时可省略 .js/.ts/.jsx/.tsx/.vue等扩展名,Vite 按顺序查找(resolve.extensions配置);
- 别名(Alias):通过 resolve.alias 配置路径别名(如 @→ src),简化导入路径;
- 外部依赖(External):通过 build.rollupOptions.external排除无需打包的依赖(如 CDN 引入的库)。
- 静态资源处理
- Vite 自动处理常见静态资源(图片、字体、JSON、SVG 等),支持多种引用方式:
- JS/TS 中导入:返回资源 URL(开发环境)或哈希文件名(生产环境);
import imgUrl from './logo.png'; // imgUrl → "/src/logo.png"(开发)/ "/assets/logo.8f3b.png"(生产)- CSS 中引用:通过 url()引入,自动转为 base64(小文件)或哈希文件名(大文件,默认阈值 4KB);
- HTML 中引用:直接写相对路径,Vite 会处理为绝对路径;
- Base64 内联:通过 ?url(强制 URL)、?raw(原始内容)、?inline(base64 内联)后缀控制;
import logoRaw from './logo.png?raw'; // 原始二进制数据(Uint8Array) import logoBase64 from './logo.png?inline'; // base64 字符串
- Vite 自动处理常见静态资源(图片、字体、JSON、SVG 等),支持多种引用方式:
- CSS 处理
- Vite 内置 CSS 处理能力,支持预处理器、模块化、PostCSS、CSS 代码分割等:
- 预处理器支持: 自动识别 .scss/.sass/.less/.styl/.stylus文件,需安装对应预处理器依赖:
- CSS 模块化(CSS Modules): 文件名以 .module.css/.module.scss结尾时,自动启用模块化(类名哈希化,避免冲突)
import styles from './button.module.css'; S// styles.button → "button_abc123"- PostCSS 与 Autoprefixer
- 默认集成 PostCSS,自动读取项目根目录的 postcss.config.js配置(需安装 autoprefixer等插件):
- CSS 代码分割: 生产环境下,Vite 会将 CSS 提取为单独文件(通过 Rollup 插件 rollup-plugin-css-only),并通过 标签引入,避免 FOUC(样式闪烁)。
- Vite 内置 CSS 处理能力,支持预处理器、模块化、PostCSS、CSS 代码分割等:
- JavaScript/TypeScript 处理
- (1)ESNext 语法转译: 开发环境用 esbuild 转译 ESNext 语法(如箭头函数、可选链 ?.)为目标环境兼容的代码(通过 build.target配置,默认 modules: esnext,即保留 ESM 语法);生产环境用 Rollup 转译(目标环境通过 build.target配置,如 es2020)。
- (2)TypeScript 支持
- 无需单独配置:Vite 内置 esbuild转译 TS(仅擦除类型,不校验类型错误);
- 类型检查:需配合 vue-tsc(Vue 项目)或 tsc --noEmit(React 项目)单独执行类型检查(可在 package.json中添加脚本)
{ "scripts": { "type-check": "vue-tsc --noEmit" // Vue 项目 // 或 "type-check": "tsc --noEmit" // React 项目 } }
- (3)JSX 支持
- React JSX:@vitejs/plugin-react自动处理 .jsx/.tsx文件,默认使用 React 17+ 的自动 JSX 运行时(无需手动导入 React);
- Vue JSX:@vitejs/plugin-vue-jsx支持 Vue 的 JSX 语法(如 h函数或
- 模块解析规则