这是我参与「第四届青训营 」笔记创作活动的的第6天**
本节的重点知识:
- Vite概要介绍
- Vite上手实战
- Vite整体架构
- Vite进阶路线
vite概况
我们为什么需要构建工具?因为前端编程的一些缺陷需要这些工具来帮助我们完善
| 问题所在 | 解决方案 | |
|---|---|---|
| 模块化 | 提供模块化加载方案,兼容不同模块的规范 | |
| 资源编译 | 一些高级的语法,浏览器无法识别,所以需要一些工具将其识别成为浏览器可认识的语法 | 高级语法转译(如Sass,TypeScript),资源的加载(如图片、字体、worker) |
| 产物质量 | 在工作中,需要考虑产物质量(代码体积,代码性能) | 产物压缩,无用代码删除,语法降级 |
| 开发效率 | 热更新 |
Vite两大组成部分:
- No-bundle开发服务,源文件无需打包
- 生产环境基于Rollup的Bundler
核心特征:
- 高性能,启动速度和热更新很快
- 简单易用,开发者体验好
当前一些其他工具的问题:
- 缓慢的启动,导致项目编译等待成本高
- 缓慢的热更新,导致修改代码后不能实时更新
瓶颈所在:
- bundle带来的性能开销
- JavaScript语言的性能瓶颈
浏览器原生ESM支持
全球浏览器对原生ESM普遍支持(占比92%以上)
两大要素:
1.script标签增加type="module”属性
2.使用ESM模块导入导出语法
基于原生ESM的开发服务优势
- 无需打包项目源代码
- 天然的按需加载
- 可以利用文件级的浏览器缓存
基于Esbuild的编译性能优化
Esbuild——基于Golang开发的前端工具,具备如下能力:
1.打包器Bundler
2.编译器Transformer
3.压缩器Minifier
性能极高,在 Vite中被深度使用
内置的 web 构建能力
Vite开箱即用的功能等价于
- webpack
- webpack-dev-server
- css-loader
- style-loader
- less-loader
- sass-loader
- postcss-loader
- file-loader
- MiniCssExtractPlugin
- HTMLWebpackPlugin
- 。。。。。
Vite上手实战
1、项目初始化
- 提前安装pnpm
npm i -g pnpm - 初始化命令
pnpm create vite - 安装依赖
pnpm install - 启动项目
npm run dev
启动完成后,打开浏览器访问对应地址即可
2、使用Sass/Scss&CSS Modules
目录结构
引入Header组件
3、使用静态资源
目录结构
以svg图片为例
除了常见的图片格式,Vite也内置了对于JSON、Worker、WASM资源的加载支持
4、生产环境Tree Shaking
优化原理:
- 基于ESM的
import/export语句依赖关系,与运行时状态无关 - 在构建阶段将未使用的代码进行删除
5、Vite最直观的印象
响应迅速 开箱即用
Vite整体架构
1、依赖预打包
-
原因:避免
node_modules过多的文件请求 将Commonjs格式转换为ESM格式 -
实现原理:
-
服务启动前扫描代码中用到的依赖 -
用Esbuild对以来代码进行预打包 -
改写`import`语句,指定依赖为预构建产物路径
2、单文件编译
用Esbuild编译TS/JSX
-
优势:编译速度提升10-100x
-
局限性:
- 不支持类型检查
- 不支持语法降级到ES5
3、代码压缩
Esbuild作为默认压缩工具,替换传统的Terser、Uglify.js等压缩工具
4、插件机制
- 开发阶段->模拟Rollup插件机制
- 生产环境->直接使用Rollup
vite进阶路线
1、插件开发
为什么需要插件机制:
- 抽离核心逻辑
- 易于拓展
-
参考资料
- Vite插件开发文档
- 复杂度较低的插件:json加载插件
- 复杂度中等的插件:Esbuild接入插件
- 复杂度较高的插件:官方React插件
2、JS编译工具(Babel) 出现原因:
- Javascript语法标准繁多,浏览器支持程度不一
- 开发者需要用到高级语言