代码分割
单 chunk 打包存在的问题
Vite 默认会将 js 打包到一个 index.js 文件中,即单 chunk 打包。

这样其实会导致一些问题
- 包体积会很大,当前没使用的包也被打包进去了,没办法做到按需加载。
- 缓存复用率很低,单 chunk 打包基本上不会命中缓存,因为只要改动就重新打包,打包后的 url 改变,浏览器会当作新的资源去请求。
自定义拆包
配置 manualChunks
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | export default defineConfig({
 
 build: {
 rollupOptions: {
 output: {
 manualChunks: {
 
 "react-vendor": ["react", "react-dom"],
 
 "lodash": ["lodash-es"],
 
 "library": ["antd"],
 
 "moment": ["moment"]
 },
 },
 }
 },
 });
 
 | 
对 manualChunks 进行配置,key 代表 chunk 的名称, value 是第三方包的包名的数组。

可以清楚看到原来的一个大的 chunk 被拆分成多个 chunk ,当更新时,也只更新其中一个 chunk ,其他的 chunk 则会读取缓存,提高了缓存命中率。
使用插件
首先安装
| 1
 | pnpm i vite-plugin-chunk-split -D
 | 
使用
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 | import { chunkSplitPlugin } from "vite-plugin-chunk-split";
 export default defineConfig({
 plugins: [
 chunkSplitPlugin({
 
 customSplitting: {
 
 "react-vendor": ["react", "react-dom"],
 
 "components-util": [/src\/components/, /src\/utils/],
 "lodash": ["lodash-es"],
 "library": ["antd"],
 "moment": ["moment"]
 }
 }),
 
 ],
 });
 
 | 
语法降级 和 Polyfill
简单来说就是低版本的浏览器对一些JS代码无法识别,需要对JS语法进行降级,详细定义:Polyfill
插件
安装官方插件
| 1
 | pnpm i @vitejs/plugin-legacy -D
 | 
使用插件
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 
 | export default defineConfig({plugins: [
 chunkSplitPlugin({
 
 customSplitting: {
 
 "react-vendor": ["react", "react-dom"],
 
 "components-util": [/src\/components/, /src\/utils/],
 "lodash": ["lodash-es"],
 "library": ["antd"],
 "moment": ["moment"]
 }
 }),
 ],
 });
 
 | 
执行打包
在 dist 目录下的 index.html 可以看到
| 12
 
 | <script type="module">...</script><script nomodule>...</script>
 
 | 
当使用现代浏览器时加载 type=”module” 的 script,当使用低版本的浏览器加载 nomodule 的 script,这样就能够对低版本浏览器进行兼容了。
网络优化
使用 HTTP2
插件 vite-plugin-mkcert
- 安装 | 1
 | pnpm i vite-plugin-mkcert -D
 |  
 
- 配置| 12
 3
 4
 5
 6
 
 | export default defineConfig({plugins: [react(), mkcert()],
 server: {
 https: true,
 },
 });
 
 |  
 
DNS 预解析
资源优化
使用 rollup-plugin-visualizer 对打包的产物进行分析
| 1
 | pnpm i  rollup-plugin-visualizer -D
 | 
配置
| 12
 3
 4
 5
 6
 7
 
 | export default defineConfig({plugins: [
 visualizer({
 open: true,
 }),
 ],
 });
 
 | 
执行打包后会自动带开浏览器
图片压缩
如果项目存在图片的静态文件,在打包时一定会增加包的大小,一般情况下我们需要在打包时对图片进行压缩处理
一个 Vite 插件 vite-plugin-imagemin 可以帮我们来做这件事
安装
| 1
 | pnpm i vite-plugin-imagemin -D
 | 
配置
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 
 | export default defineConfig({plugins: [
 
 viteImagemin({
 
 optipng: {
 optimizationLevel: 7
 },
 
 pngquant: {
 quality: [0.8, 0.9],
 },
 
 svgo: {
 plugins: [
 {
 name: "removeViewBox"
 },
 {
 name: "removeEmptyAttrs",
 active: false
 }
 ]
 }
 })
 ],
 });
 
 | 
然后执行 build

控制台可以看到我们的配置生效了
gzip
gzip 可以对我们的代码体积进行压缩,提高性能
- 安装插件 | 1
 | pnpm i vite-plugin-compression -D
 |  
 
- 配置 
| 12
 3
 4
 5
 6
 7
 8
 
 | import viteCompression from "vite-plugin-compression";
 export default defineConfig({
 plugins: [
 
 viteCompression()
 ],
 });
 
 | 
