Vite概要介绍
Vite的定位为定位:新一代前端构建工具.
两大组成部分:
1.No-bundle开发服务,源文件无需打包;
2.生产环境基于Rollup 的 Bundler. 核心特征:
- 高性能,dev启动速度和热更新速度非常快;
- 简单易用,开发者体验好.
| Dev启动时长 | Dev页面加载 | Build时长 | |
|---|---|---|---|
| Vue-cli | 2568ms | 320ms | 5.23 |
| Vite | 232ms | 379ms | 2.13 |
由测试结果可见Vue-cli和Vite的dev命令运行耗时相差十倍,而且随着项目体积越大性能的差距也越大,为啥呢?
当下问题
当前构建工具的通病是什么呢?我认为有以下两点:
- 缓慢的启动,这意味着项目编译等待成本高
- 缓慢的热更新,以至于修改代码后不能快速同步更新
对于产生上述两点问题的原因就是bundle带来的大量性能开销以及JavaScript语言的性能瓶颈.
行业趋势
全球浏览器对原生ESM普遍支持
1.当前浏览器绝大部分都能运行以下代码(script标签增加type=’module’属性;支持ESM模块导入导出语法):
// fn.js
export const fn = 'fn'
// index.html
<!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.jpg">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>demo</title>
</head>
<body>
<script type="module" >
import {fn} from './fn.js'
console.log(fn) // fn
</script>
</body>
</html>
2.基于原生ESM的开发优势:
- 无需打包项目源代码
- 按需加载
- 可以利用文件级别的浏览器缓存
基于原生语言(如golang,Rust)编写的前端工具链逐渐兴起(如golang编写的Esbuild,Rust编写的SWC等)
从上图可以看出EsBuild的性能是其他工具的百倍左右,打包编译压缩等方面比传统的工具性能强,在Vite中被深度使用,并且Vite上手简单,开箱即用,并不要设置很多配置项
Vite上手实战
那么下面就开始介绍Vite的使用:
Vite项目初始化
# 使用 NPM:
npm create vite@latest
# 使用 Yarn:
yarn create vite
# 使用 PNPM:
pnpm create vite
npm create vite
npm install
npm run dev
选择好配置项就成功了!
Vite优势
-
热更新HMR:Vite自带
-
使用静态资源:vite内置了对于JSON,Worker,WASM资源的加载支持
-
生产环境Tree Shaking(默认开启)
- 基于ESM的import/export语句依赖关系,与运行时状态无关(CommonJS的require可能依赖运行时计算的结果,所以不支持Tree Shaking)
- 在构建阶段将未使用到的代码进行删除
整体架构
Vite架构图
关键技术
- 依赖预打包
Vite在项目启动前会扫描项目中用到的一些依赖,对这些依赖代码进行项目Esbuid预打包,打包完后将业务代码语句中的import语句进行改写
- 单文件编译
优势:使用Esbuild编译TS/JSX,速度非常快
缺点:不支持类型检查(所以在生产构建项目时要先通过类型编译检查才行,如下图),而且不支持语法降级到ES5,比如说箭头函数在低版本浏览器是会报错的.
- 代码压缩
在生产环境中是非常重要的一环.好多人都对webpack压缩代码速度慢而烦恼,代码压缩在打包中是非常耗时的阶段.Vite为了大大提高代码压缩速度,采用Esbuild作为默认压缩工具,替换了传统的Terser,Uglifys等压缩工具.
- 插件机制
Vite在开发阶段是开发了Plugin Container,是用来模拟Rollup插件机制的,而在生产环境是直接使用Rollup的.最终导致Vite的插件既可以用到开发阶段,也可以用到生成环境阶段.
Vite进阶路线
深入学习构建工具
总结
✨🧨🧨✨
Vite构建工具效率高,开发环境配置更轻松,快速启动服务器无需等,模块热更新流畅无阻。
无需担心性能的问题,轻量级打包速度飞快,前端开发更上一层楼,助力开发者再创佳绩。