Vite 依赖预构建

解释 Vite 开发阶段用 esbuild 预构建依赖的原因、缓存位置与 optimizeDeps 常见调整场景。

#type / concept #status / growing #tech / dev / frontend #resource / javascript

[!info] 关联笔记

Vite 依赖预构建

这个概念为什么出现

node_modules 里的包常常是:

  • CommonJS 或混合导出
  • 内部拆成成百上千小文件
  • 开发中很少修改

若浏览器对每个深层文件都发 ESM 请求,开发服务器会被依赖图拖死。预构建把依赖转换成 dev 友好的 ESM,并合并请求。

[!abstract] 一句话理解 预构建是开发期对依赖的“缓存型编译”,不是生产 Rollup 的同一过程。

最小可观察示例

场景:接入图表库后首页变慢

// 业务:库存趋势图
import * as echarts from 'echarts'

export function renderStockTrend(el: HTMLElement, points: number[]) {
  const chart = echarts.init(el)
  chart.setOption({
    xAxis: { type: 'category' },
    yAxis: { type: 'value' },
    series: [{ type: 'line', data: points }],
  })
  return chart
}

建议观察:

pnpm dev
# 首次启动日志中的 dependency pre-bundling / optimizing
ls node_modules/.vite/deps 2>/dev/null | head

期望:

依赖被写到 node_modules/.vite/deps 一类缓存目录;
后续冷启动命中缓存则明显更快。

结合场景关注点

  1. 改业务源码通常不必重做全部依赖预构建。
  2. 增删依赖/改 optimizeDeps 常使缓存失效。
  3. 预构建修的是 dev 体验,不能代替 prod 分析。

核心规则

  • 工具:esbuild(高速转换)
  • 配置入口:optimizeDeps.include / exclude
  • 当出现“依赖导出在 dev 下行为怪异”时,优先查是否应强制 include

常见误区

[!warning] 常见误区:把 optimizeDeps 当成万能拆包配置 生产拆包看 build.rollupOptions;optimizeDeps 主战场在开发。

本节总结

预构建让“依赖少改、源码常改”的不对称性被正确利用。

自测题

  1. 为什么预构建主要针对依赖而不是 src
参考答案

依赖变更频率低、模块数多、格式复杂;源码需要按需即时编译以保持编辑反馈。

延伸阅读

资料类型支撑内容
Dependency Pre-Bundling官方机制与配置
创建于 2026/7/15 更新于 2026/7/15