在 Vite 中通过 build.rollupOptions.external 配置可将 React、Vue 等大型依赖外部化,避免重复打包、减小体积并提升 tree-shaking 效果;需配合 peerDependencies 声明以确保用户正确安装对应版本。

在 Vite 中配置 Rollup 外部化大型依赖,本质是通过 build.rollupOptions.external 告诉打包器:这些模块不打进最终产物,由使用者环境提供。这对 React、Vue、lodash 等通用依赖尤其关键——避免重复打包、减小体积、提升 tree-shaking 效果。
明确哪些依赖该 external
通常外部化的库具备以下特征:
- 用户项目中已存在(如 react、vue、react-dom)
- 体积大且不参与逻辑封装(如 lodash、moment)
- 属于运行时框架或 peerDependencies(需在
package.json中声明)
在 vite.config.ts 中配置 external
直接在 build.rollupOptions.external 字段中指定:
import { defineConfig } from 'vite';<br>export default defineConfig({<br> build: {<br> rollupOptions: {<br> external: [<br> 'react',<br> 'react-dom',<br> 'vue',<br> 'lodash-es',<br> '@ant-design/icons'<br> ]<br> }<br> }<br>});
这样,Rollup 在构建时会跳过这些模块的解析与打包,保留原始 import 语句(如 import React from 'react'),交由最终宿主环境处理。
使用 Vite 8、React 19、Tailwind CSS v4、shadcn/ui、Biome、Vitest 和 Hono 构建全栈 TypeScript 应用,涵盖前端(Vite/Rolldown 构建 + 开发)...
支持正则或函数判断更灵活的场景
当需要按命名空间或动态规则排除时,可用函数或正则:
-
正则方式:排除所有以
@types/开头的包:/^@types\// -
函数方式:精细控制(例如仅 external 非本地路径):
external: (id) => id.startsWith('react') || id.startsWith('vue')
注意:函数返回 true 表示“外部化”,返回 false 或 undefined 表示正常打包。
配合 package.json 的 peerDependencies 使用
external 只是打包行为,还需同步声明依赖关系,否则用户安装时可能遗漏:
示例(package.json):"peerDependencies": {<br> "react": "^18.0.0",<br> "react-dom": "^18.0.0"<br>},<br>"devDependencies": {<br> "react": "^18.0.0",<br> "react-dom": "^18.0.0"<br>}
这样既保证开发时可运行,又提示用户必须自行安装对应版本,避免版本冲突或重复引入。

















