构建工具的作用
- 模块化:ESM、CommonJS、UMD
构建工具能够提供模块加载方案,以兼容不同的模块规范
- 资源编译:高级语法的编译
构建工具能够实现高级语法的转译,如Sass、TypeScript等,优化资源加载,如图片、字体等
- 产物质量:代码体积、代码性能
构建工具能够压缩产物,删除无用代码,实现语法降级,提高兼容性
- 开发效率:热更新
构建工具能够热更新来提高开发时的体验,修改代码后的实时更新
Vite 概要
两大组成
- No-bundle 开发服务,源文件无需打包
- 生产环境基于 Rollup 的 Bundler
核心特征
- 高性能,dev 的启动速度和热更新的速度非常快
- 简单易用,开发体验好
Vite 操作
项目初始化
// 初始化命令
pnpm create vite
// 安装依赖
pnpm install
// 启动项目
pnpm run dev
- 添加 Sass 依赖
-D 是指将当前依赖作为 dev 时候的依赖加载
pnpm i sass -D
Sass 相较于 CSS 能够使用样式嵌套的写法
<div className={style.header}>
Header
<p className={style.content}>Hello World</p>
</div>
<style>
.header {
.content {
color: skyblue;
}
color: red;
}
</style>
静态资源加载
除了常见的图片格式,Vite 内置了对 JSON、Worker、WASM 资源的加载支持
import reactLogo from './assets/react.svg'
function App() {
return (
<div>
<a href="https://react.dev" target="_blank">
<img src={reactLogo} className="logo react" alt="React logo" />
</a>
</div>
)
}
生产环境 Tree Shaking
即基于 ESM 的 import/export 语句的依赖关系,与运行时状态无关,将在构建阶段将未使用到的代码删除
Vite 整体架构
- 单文件编译:使用 Esbuild 对依赖进行预打包和对单文件的编译,使编译速度得到极大的提高,但是 Esbuild 不支持类型检查和将语法降级到 ES5
- 压缩机制:使用 Esbuild 对代码进行压缩,相比于其他的压缩工具时间大大地缩短
- 插件机制:在开发阶段使用 Plugin Container 模拟 Rollup 的插件机制,而在生产环境之间使用 Rollup
Vite 进阶路径
深入双引擎
- Esbuild:esbuild.docschina.org/
- Rollup:www.rollupjs.com/
从了解和掌握基本使用各种常用配置项到能够进行其插件的开发
Vite 插件开发
抽离核心逻辑,易于拓展
可以基于如下 Hook,实现在不同的构建阶段插入自定义的逻辑
- 如下是将一个自定义的文件内容进行编译,并将编译内容返回给 vite
// myPlugin.js
const fileRegex = /.(my-file-ext)$/
export default function myPlugin() {
return {
name: 'transform-file',
transfrom(src, id) {
if (fileRegex.test(id)) {
return {
code: compileFileToJS(src),
map: null
}
}
}
}
}
// vite.config.js
import { defineConfig } from 'vite'
import plugin from './myPlugin'
export default defineConfig({
plugins: [
plugin()
],
})
服务端渲染
SSR (Server Side Render) 是一种渲染模式,常用于提升首屏性能和 SEO 优化
-
首屏加载慢:首屏加载需要依赖 JS 的执行,尤其是在一些网络不佳的场景,下载和执行 JS 时运行过慢,导致首屏加载时间过长
-
SEO 不友好:具体的内容没有在 HTML 中显示出来,导致搜索引擎爬虫无法快捷地从网站爬取关键词信息
通过运用 SSR,可以实现在服务端生成好完整的 HTML 内容,直接返回给浏览器,这样浏览器就能够根据 HTML 直接渲染出首屏的内容,而不需要再依赖于 JS 的加载,从而降低首屏渲染的时间以及展现完整的内容给浏览器爬虫
语法降级
解决方案: @vitejs/plugin-legacy
其借助了 Babel 进行语法的自动降级,提前注入 Polyfill 实现,如:core-js、regenerator-runtime