← 返回目录

第 20 卷

第 20 / 26 卷日期:

建 7}

8});

(2)动态导入依赖

对于动态导入的第三方依赖(如 import('lodash-es/map')),Vite 会在首次加载时触发“按需预构建”,并将结果缓存,后续加载直接复用。

二十五、说一下Vite的打包过程和静态资源处理方式。

Vite 的核心特点是“开发环境不打包,生产环境按需打包”。生产环境的打包过程基于 Rollup 实现,聚焦“产物优化”(如 Tree Shaking、代码分割、资源压缩);静态资源处理则采用“原生 ESM 支

持 + 按需转换 + 优化输出”的策略,兼顾开发体验和生产性能。

一、Vite 的打包过程(生产环境)

Vite 生产打包的核心目标是“生成体积小、加载快、兼容性好的静态产物”,流程可拆解为“预构建准备 → Rollup 打包 → 产物优化 → 输出文件”四个核心阶段:

  1. 阶段一:预构建准备(优化依赖)
  2. 执行 vite build 命令后,Vite 首先检查依赖预构建缓存( node_modules/.vite),若

缓存失效(如依赖版本变化、配置修改),则重新执行依赖预构建:将 CommonJS 依赖转换为 ESM,合并小模块为预构建包。

  1. 扫描项目源码,收集入口模块信息(默认入口为 index.html,可通过

build.rollupOptions.input 自定义)。

  1. 阶段二:Rollup 打包(核心构建)
  2. Vite 调用 Rollup 实例,传入预设配置(如格式为 ESM、启用 Tree Shaking)和用户自定义的

build.rollupOptions 配置。

  1. Rollup 以入口模块为起点,构建项目依赖图:解析所有模块(JS/TS、Vue/React 组件、CSS

等),处理模块间的依赖关系。

  1. 模块转换:通过 Vite 插件和 Rollup 插件处理各类模块(如 @vitejs/plugin-vue 编译 Vue

组件、 @vitejs/plugin-react 编译 React 组件、 css-loader 处理 CSS 等)。

  1. 阶段三:产物优化(核心优化环节)

Vite 内置多种优化策略,在 Rollup 打包过程中自动启用,无需额外配置:

• Tree Shaking:自动移除未被使用的代码(死代码),仅保留被引用的模块和代码片段(基于

• 代码分割(Code Splitting):自动拆分第三方依赖(如 vue、 axios)为独立 chunk(如

• 对动态导入的模块(如 import('./pages/About.vue')),自动拆分为异步 chunk,实现

按需加载。

代码压缩:使用 esbuild 对 JS、CSS 进行压缩(默认开启),压缩速度远超传统的 terser、 cssnano。

CSS 优化:提取组件内联 CSS 为单独的 CSS 文件(默认开启,可通过 build.cssCodeSplit 关闭)。

自动移除未使用的 CSS(需配合 purgecss-plugin-vite 等插件,针对全局 CSS)。

产物哈希命名:对 JS、CSS、静态资源等产物添加内容哈希(如 index.[hash].js),实现长效缓存(文件内容不变则哈希不变,浏览器可缓存;内容变化则哈希变化,触发重新加载)。

  1. 阶段四:输出文件(生成最终产物)
  2. 将优化后的 chunk 文件、静态资源、HTML 文件输出到 dist 目录(可通过 build.outDir

自定义输出目录)。

  1. 自动处理 HTML 文件:注入打包后的 JS、CSS 资源路径,生成最终的 index.html(支持多页

面应用,通过 build.rollupOptions.input 配置多个入口 HTML)。

  1. 生成打包统计信息(如产物大小、构建时间),打印到控制台。

二、Vite 的静态资源处理方式

静态资源(如图片、字体、音频、视频、JSON 等)是前端项目的重要组成部分,Vite 对静态资源的处理分为“开发环境”和“生产环境”两个场景,策略不同但目标一致:“按需加载、优化性能、简

化配置”。

  1. 核心处理原则

• 开发环境:以“原生 ESM 支持”为核心,直接将静态资源作为模块加载,无需打包,确保开发体

验流畅。

• 生产环境:以“优化输出”为核心,对静态资源进行压缩、哈希命名、按需转换(如小图片转

Base64),提升加载性能。

• 零配置支持:默认支持常见静态资源类型( png、 jpg、 gif、 svg、 woff、 mp4

等),无需手动配置 Loader。

  1. 具体处理方式(按资源类型)

(1)图片资源(png、jpg、gif、svg 等)

• 开发环境:直接通过 import 或 url() 加载图片,Vite Dev Server 实时返回图片资源,支持

console.log(logo); // 输出:/src/logo.png(Dev Server 地址)

// CSS 中引用图片 .logo {

background: url('./logo.png');

}

  • 生产环境:自动压缩:使用 esbuild 或 sharp 对图片进行压缩,减小体积。

• 小图片转 Base64:默认将小于 4KB 的图片转换为 Base64 编码,嵌入到 JS/CSS 中,减少 HTTP

请求(可通过 build.assetsInlineLimit 自定义阈值)。

  • 哈希命名:生成 logo.[hash].png 格式的文件名,输出到 dist/assets 目录。

• SVG 特殊处理:支持直接导入 SVG 作为组件(需配合 @vitejs/plugin-vue 等框架插件),

或作为图片资源加载。

(2)字体资源(woff、woff2、eot、ttf 等)

• 处理逻辑与图片类似:开发环境直接加载,生产环境自动压缩、哈希命名、输出到

dist/assets 目录。

• 示例: // CSS 中引用字体

@font-face { font-family: 'MyFont';

src: url('./myfont.woff2') format('woff2');

}

(3)音频/视频资源(mp3、mp4、webm 等)

• 开发环境:直接通过 import 或 <audio>/<video> 标签加载,Vite Dev Server 提供资源服

务。

• 生产环境:自动哈希命名、输出到 dist/assets 目录,不进行 Base64 转换(体积较大,转换

后会增大 JS/CSS 体积)。

(4)JSON 资源

  • 开发环境:原生支持 ESM 导入 JSON,Vite 自动解析 JSON 内容,返回 JavaScript 对象。

• 生产环境:将 JSON 内容嵌入到 JS 中(小 JSON)或单独输出(大 JSON),并进行压缩(移除

空格、注释)。

全站分卷索引 · 26 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷
  7. 7第 7 卷
  8. 8第 8 卷
  9. 9第 9 卷
  10. 10第 10 卷
  11. 11第 11 卷
  12. 12第 12 卷
  13. 13第 13 卷
  14. 14第 14 卷
  15. 15第 15 卷
  16. 16第 16 卷
  17. 17第 17 卷
  18. 18第 18 卷
  19. 19第 19 卷
  20. 20第 20 卷
  21. 21第 21 卷
  22. 22第 22 卷
  23. 23第 23 卷
  24. 24第 24 卷
  25. 25第 25 卷
  26. 26第 26 卷