这是我参与「第五届青训营」笔记创作活动的第二十七天
Vite 上手实战与架构解析
如何使用Vite
项目初始化
dev: 启动开发服务器build:生产环境打包,底层用的是Rollup,tsc && vite biuld这里为什么有tsc呢,vite底层打包使用的Esbuild并不提供TypeScript的类型支持,所以我们需要借助ts官方的工具tsc来进行类型的检查(即先进行类型检查再进行打包)preview: 通过生产模式打出最终产物后,怎么来预览产物的内容
接入一些常用的CSS module
-
例:
pnpm i sass -D -
vite会默认地把
.module.scss结尾的文件当作css module进行处理 -
使用
CSS Module可以做到不同组件之间的样式隔离,防止组件间样式污染
使用静态资源
使用HMR
HMR是可以保存组件的局部状态的
生产环境的Tree Shaking
- 为了调试,我们可以先暂时把生产环境的代码压缩先关掉 (注:代码压缩和Tree Shaking不是同一个东西)
Vite的Tree Shaking是基于Rollup的
对Vite的直观印象
Vite的整体架构
依赖预打包
node_modules是一个非常不可控的一个东西,可能会夹杂非常多的文件请求,比如说Lodash这个库把它引进来后,你要引入一个debounce方法,会导致六七百个文件的引入,这个文件的请求数量是相当大的node_modules里的一些代码产物是不规范的,可能是CommonJS,放到浏览器里就跑不起来了- 针对以上两个问题,
Vite是进行了一个预打包
代码压缩
- 代码压缩是生产环境中非常重要的一个阶段,也是非常耗时的一个阶段
插件机制
- 在开发阶段
Vite是开发了一个Plugin Container的一个东西,用来模拟Rollup的插件环境,生产环境下就可以直接使用Rollup=> 最后的效果就是Vite的插件既可以用在开发阶段也可以用在生产阶段, (当然Rollup的插件是不一定能使用到Vite当中的)
Vite 进阶路线
Vite的插件开发
为什么需要插件机制
- 抽离核心逻辑 => 把
Dev Server的逻辑抽离出来,把构建相关的能力封装成一个个的插件,这样可以达到一个解耦的效果,这样构建和Dev Server的逻辑是分开的,更容易维护 - 易于扩展 => 有了这个插件机制之后, 社区也可以给
Vite贡献一些插件,目前生态也是非常的丰富
Vite的钩子介绍
Vite在开发阶段是一个Dev Server,所以它在服务启动阶段,请求响应阶段等各个阶段,都会插入不同的Hook,我们可以在插件写钩子函数,通过这些钩子函数,在不同的构建阶段去插入我们自定义的逻辑 (推荐大家掌握一些常用的钩子就可以了,比如说config,resolveId, load, transform)
插件示例
- 这个插件所做的事情 把自定义的文件内容进行一个编译,把编译的结果返回给
Vite
参考资料
- 插件 API | Vite 官方中文文档 (vitejs.dev)
- vite/json.ts at main · vitejs/vite (github.com)
- vite/esbuild.ts at main · vitejs/vite (github.com)
- Page not found · GitHub (这个好像仓库地址变了)
代码分割|拆包
- 构建选项 | Vite 官方中文文档 (vitejs.dev)
- Configuration Options | Rollup (rollupjs.org)
- 传统的项目一般是打包成一个
Bundle
JS编译工具
- What is Babel? · Babel (babeljs.io)
- babel-handbook/plugin-handbook.md at master · jamiebuilds/babel-handbook (github.com)
语法安全降级
- @babel/preset-env · Babel (babeljs.io)
- vite/packages/plugin-legacy at main · vitejs/vite (github.com)
SSR服务端渲染
- 和原来的模式最大的不同是,除了构建出原来前端的产物,也会构建出一份SSR的产物,这份产物是跑在Node.js (服务端),在代码执行的阶段,我们在服务端会拿到SSR的产物,进行数据的预取,进行组件的渲染,然后在服务端就把HTML的内容给产出出来,这样前端能够拿到的是完整的HTML内容,而不是之前的仅仅一个
<div id="root"></div>,因此可以更快地渲染到页面上(提高首屏时间)
服务端渲染 | Vite 官方中文文档 (vitejs.dev)
服务端渲染 | Vite 官方中文文档 (vitejs.dev)
深入浅出 Vite - 神三元 - 掘金小册 (juejin.cn)
深入了解底层标准
- 不光是浏览器支持了原生地ESM模块加载,包括Node也支持了原生的Node加载
- ES modules: A cartoon deep-dive - Mozilla Hacks - the Web developer blog
- Ship ESM & CJS in one Package (antfu.me)
- Pure ESM package (github.com)
- 为了保证稳定性,目前阶段,还是需要去发同时具有
ESM和CJS的包,未来可能可以逐渐过渡到纯ESM的模式(社区也称之为PureESM)