build.rollupOptions 是 Vite 中唯一官方支持的 Rollup 深度定制入口,直接透传原始选项,核心用于 external 控制依赖排除和 output 精细配置产物结构,并需配合 globals 映射全局变量名以确保浏览器环境可用。

在 Vite 中,build.rollupOptions 是唯一官方支持的、用于深度定制底层 Rollup 行为的配置入口。它不是可选插件,而是直接透传给 Rollup 实例的原始选项对象,所有 Rollup 支持的配置项(只要不与 Vite 内部逻辑冲突)都可通过它生效。
核心用途:控制依赖处理与资源输出
最常用且影响最大的两个方向是 external 和 output:
-
external:指定哪些模块不参与打包,交由运行时提供(如 CDN 或全局变量)。只接受
string[]或(id) => boolean函数,例如:external: ['vue', 'axios']或external: (id) => id.startsWith('@company/') || id === 'lodash-es' -
output:精细控制产物结构,包括文件命名、格式、分包策略等。关键子项有:
–entryFileNames:入口 JS 文件名,如'assets/js/[name].[hash].js'
–chunkFileNames:动态导入或公共代码块名
–assetFileNames:图片、字体等静态资源名,函数需同步返回字符串
–manualChunks:按依赖名或路径手动分包,例如把['vue', 'vue-router']合并为vue-vendor.js
配合 globals 实现浏览器环境可用
当用 external 剥离了 Vue、React 等依赖后,必须让 Rollup 知道这些模块在全局对应什么变量名,否则生成的代码会尝试 require('vue') 而失败:
- 在
rollupOptions.output.globals中声明映射:globals: { vue: 'Vue', 'vue-router': 'VueRouter' } - 同时确保 HTML 中已通过
<script></script>引入对应 CDN,且暴露的全局变量名一致(如unpkg.com/vue@3/dist/vue.global.js暴露window.Vue)
避免常见错误的实操要点
很多问题源于类型误用或异步操作:
-
external不能写成对象、正则字面量(如/^@ant-design\/.*/)、null或未安装的包名——否则静默失效,运行时报错“Cannot resolve module” -
assetFileNames函数严禁异步(如await fetch()或fs.readFile),必须纯同步判断,否则构建卡死 - 多页应用中,若 HTML 入口是
src/admin/main.js,则entryFileNames应匹配目录层级,如'admin/js/[name].[hash].js',否则页面加载 404
验证是否生效的简单方法
构建完成后快速确认配置是否起作用:
- 打开
dist下任意 JS 文件,搜索被 external 的包名(如axios),应找不到其源码;import 语句通常被转为const axios = __require('axios')类似占位 - 检查
dist目录下是否有按manualChunks名称生成的独立 JS 文件(如vue-vendor.xxxx.js) - 用
rollup-plugin-visualizer查看依赖图,确认目标模块未出现在 bundle 内部节点中


















