Vite

Vite 依赖预构建

理解 Vite 的依赖预构建机制,学会配置 include、exclude 和 force 选项来优化开发体验。

🎯 引言

学会这篇文章,你能理解为什么 Vite 第一次启动时有时会“预处理依赖”,以及如何通过 optimizeDeps 配置控制这个过程。这个知识点能帮你解决不少开发时遇到的奇怪报错。


🧱 为什么需要预构建

Vite 开发时依赖浏览器原生 ES Module。很多 npm 包发布的是 CommonJS 格式(require/module.exports),浏览器不直接支持。Vite 会在第一次启动时把这些包转换成 ES Module,并合并成少量文件,这个过程就叫依赖预构建

想象你去食堂吃饭:

  • 没有预构建:每次点一个菜,厨师现做,排队很慢。
  • 有预构建:食堂提前把热门菜做好,你直接拿,速度快很多。

预构建后的文件会缓存在 node_modules/.vite 目录中。只要不升级依赖,下次启动就不需要重新构建。


✨ 默认行为

首次运行 npm run dev 时,你可能会看到终端输出:

Pre-bundling dependencies: vue, element-plus

这表示 Vite 正在扫描入口文件,并把用到的第三方依赖进行预构建。

如果 node_modules/.vite 被删除,或者依赖版本发生变化,Vite 会重新执行预构建。

🛠 手动控制预构建

include

如果 Vite 没有自动发现某些依赖,可以手动告诉它:

vite.config.js
import { defineConfig } from 'vite';

export default defineConfig({
    optimizeDeps: {
        include: ['lodash-es', 'axios'],
    },
});

exclude

某些包已经提供原生 ES Module,不需要预构建,可以排除:

vite.config.js
import { defineConfig } from 'vite';

export default defineConfig({
    optimizeDeps: {
        exclude: ['vue-demi'],
    },
});
exclude 要谨慎使用。如果排除的包不是纯 ES Module,浏览器会报错。

force

有时候缓存出了问题,可以强制重新预构建:

vite --force

或者:

npx vite --force

这会删除 node_modules/.vite 缓存并重新构建。


🛠 一个常见场景

你引入了一个较大的组件库,但只用到其中几个组件:

import { ElButton } from 'element-plus';

Vite 默认会预构建整个 element-plus。如果你希望只构建用到的部分,可以配合组件库的 ES Module 版本或按需引入插件,不过这已经超出本课程范围,后续可以单独学习。


🧾 小节总结

  • 依赖预构建把 CommonJS 包转成 ES Module,让浏览器能正确加载。
  • 预构建缓存放在 node_modules/.vite,首次启动或依赖变化时会自动重新构建。
  • include 手动补充需要预构建的依赖。
  • exclude 排除不需要预构建的依赖,但要确保它们是原生 ES Module。
  • vite --force 可以强制刷新预构建缓存。

❓ 知识问答

Q1:预构建会影响生产构建吗?

不会。预构建只在开发阶段使用,生产构建由 Rollup 直接处理。

Q2:node_modules/.vite 可以删除吗?

可以,它是缓存目录,删除后 Vite 会自动重新生成。

Q3:什么时候需要手动写 include

当 Vite 自动扫描没有识别到某些依赖,或者你的依赖是动态引入导致扫描不到时。


🧪 小练习

为一个引入了 lodash-es 的项目添加预构建配置:

  1. 安装 lodash-es
  2. vite.config.js 中把它加入 optimizeDeps.include
  3. 删除 node_modules/.vite,重新运行 npm run dev,观察是否重新预构建。
vite.config.js
import { defineConfig } from 'vite';

export default defineConfig({
    optimizeDeps: {
        // 请在这里补充 include
    },
});

🎉 恭喜你理解了 Vite 的依赖预构建!下一篇我们来学习如何构建和部署 Vite 项目。