深度解析 Rollup 配置与 Vite 生产构建流程

作者:发现一只大呆瓜日期:2026/4/17

前言

为什么 Vite 在生产环境不使用 ESBuild 而是选择 Rollup?为什么 Rollup 打包出来的代码比 Webpack 更纯粹?本文将带你深入 Rollup 的核心配置,并拆解 Vite 是如何驱动 Rollup 完成生产环境构建的。

一、 Rollup 核心配置:构建系统的“方向盘”

1. 核心概念

Rollup 是 Vite 生产环境下的底层打包工具,专注于 ES 模块的打包优化。

注意:在 Vite 项目中,不需要单独编写rollup.config.js文件,所有 Rollup 相关的配置都统一写在vite.config.js/tsbuild.rollupOptions字段中。Vite 会自动将你的配置与内置的 Rollup 配置合并,生成最终的打包配置。

2. 核心特点

  • 具有天然的 Tree Shaking 功能,可以静态分析 ES 模块的导入导出关系,精准移除未使用到的代码
  • 支持Scope Hoisting(作用域提升) ,将多个模块的代码合并到同一个作用域中,减少函数包裹和运行时开销
  • 打包产物体积小、执行效率高,特别适合用于 JavaScript 库和工具的打包
  • 插件系统简洁强大,易于扩展和定制

二、Rollup 核心配置项详解

1. input(打包入口)

用于指定打包的入口文件,支持三种写法:

  • 字符串:单入口,所有代码打包到一个文件中,适合 SPA 单页面应用
  • 数组:多入口,每个入口生成独立的 chunk 文件,公共依赖会自动拆分
  • 对象:多入口,可自定义每个 chunk 的名称,是最灵活的写法
1// 单入口
2input: 'src/index.js'
3
4// 数组多入口
5input: ['src/page1.js', 'src/page2.js']
6
7// 对象多入口(推荐)
8input: {
9  home: 'src/pages/home.js',
10  about: 'src/pages/about.js',
11  vendor: 'src/utils/vendor.js'
12}
13

原内容保留:如果是多文件的话,会给每个入口生成独立文件,公共依赖会在打包过程中拆分出来,适用于 MPA(多页应用)、库的多版本。

2. output(打包输出)

该属性为对象或对象数组类型,可以指定打包后的文件输出规则。如果配置为数组,可以将同一份代码打包成多种不同格式的包同时输出。output 核心属性如下:

属性名类型说明
dirstring输出目录,当有多个 chunk 时必须使用此属性
filestring单个输出文件的路径,仅适用于单入口单 chunk 的情况
formatstring输出格式,支持:- esm:ES Module 格式(Vite 默认)- cjs:CommonJS 格式- umd:通用模块定义- iife:立即执行函数格式
namestring打包为iife或umd格式时必须配置,指定对外暴露的全局变量名
globalsobject全局变量声明,用于将外部依赖映射为全局变量示例:{ jquery: '$' }表示项目中可以直接用$代替jquery
sourcemapboolean是否生成源码映射文件,方便生产环境调试
assetFileNamesstring静态资源文件输出文件名模板示例:'assets/[name]-[hash][extname]'

下面的例子代表第一次打包(ESM 格式),将结果输出到dist/es/目录,第二次打包(CJS 格式),将结果输出到dist/cjs/目录

1output: [
2  {
3    dir: "dist/es",    // 输出到 dist/es 目录
4    format: "esm",     // ES Module 格式
5  },
6  {
7    dir: "dist/cjs",   // 输出到 dist/cjs 目录
8    format: "cjs",     // CommonJS 格式
9  },
10]
11

3. external(外部依赖)

用于标记某些模块为外部依赖,告诉 Rollup 这些模块不应该被打包到最终的 bundle 中。对于某些第三方包,有时候我们不想让 Rollup 进行打包,也可以通过 external 进行外部化。external 支持三种写法:

1// 字符串写法
2external: ['vue', 'react']
3
4// 正则写法
5external: [/^lodash/]
6
7// 函数写法(最灵活)
8external: (id) => {
9  // 所有node_modules中的模块都标记为外部依赖
10  return id.includes('node_modules')
11}
12

使用场景

  • 库打包时,将核心依赖(如 Vue、React)外部化,避免重复打包
  • 减少打包体积,提高构建速度
  • 利用 CDN 加载公共依赖

4. plugins(插件系统)

用于扩展和定制 Rollup 的构建流程。该配置项可以与output配置在同一级(全局生效),也可以配置在 output 参数里面(仅对该输出生效)。可使用自定义编写的 Rollup 插件,也可以使用第三方插件。

常用 Rollup 插件整理如下:

插件名称作用
@rollup/plugin-json支持.json文件的加载,并配合 Tree Shaking 去掉未使用的部分
@rollup/plugin-babel使用 Babel 进行 JS 代码的语法转译,兼容低版本浏览器
@rollup/plugin-typescript支持使用 TypeScript 开发
@rollup/plugin-alias支持路径别名配置
@rollup/plugin-replace在打包过程中进行变量字符串的替换
@rollup/plugin-node-resolve解析 node_modules 中的第三方依赖
@rollup/plugin-commonjs将 CommonJS 模块转换为 ES 模块,供 Rollup 处理
rollup-plugin-visualizer对打包产物进行分析,自动生成产物体积可视化分析图

补充说明@rollup/plugin-node-resolve@rollup/plugin-commonjs是 Rollup 处理第三方依赖的必备插件,Vite 已经内置了这两个插件,不需要手动配置。

这篇笔记非常深入地探讨了 Rollup 在 Vite 体系中的地位。作为现代前端打包工具的“幕后英雄”,Rollup 的配置和流程是进阶高级前端的必修课。

为了适配掘金的风格,我为你优化了标题,并引入了“声明式配置图解”和“双阶段构建流”的概念,同时修正了部分关于 input 拼写的小细节。


进阶必备:深度解析 Rollup 配置与 Vite 生产构建流程

前言

为什么 Vite 在生产环境不使用 ESBuild 而是选择 Rollup?为什么 Rollup 打包出来的代码比 Webpack 更纯粹?本文将带你深入 Rollup 的核心配置,并拆解 Vite 是如何驱动 Rollup 完成生产环境构建的。


一、 Rollup 核心配置:构建系统的“方向盘”

Rollup 的配置以简洁著称,其设计的核心目标是打包出最干净的代码库

1. 入口与出口 (Input & Output)

  • input (注意是单数):支持字符串或数组/对象。
    • 单入口:适合单页面应用 (SPA),生成一个主 bundle。
    • 多入口:适合多页面应用 (MPA) 或组件库,Rollup 会自动提取公共依赖。
  • output:支持数组形式,实现一份源码,多种格式输出
    • format:
      * esm: 现代浏览器首选。
      * cjs: Node.js 环境使用。
      * umd: 兼容 AMD/CommonJS/全局变量。
    • globals: 映射外部依赖,如 { jquery: '$' }

2. 外部依赖 (External)

核心作用:标记某些模块不被打包。

  • 场景:在开发组件库时,通常会将 vuereact 设为 external,让宿主环境提供这些依赖,减小打包体积。

3. 常用插件全家桶

插件名称核心作用
@rollup/plugin-json让 JS 能直接 import json,并支持 Tree Shaking。
@rollup/plugin-babel配合 Babel 进行语法降级,解决兼容性问题。
@rollup/plugin-typescript让 Rollup 具备处理 TS 的能力。
@rollup/plugin-alias配置路径别名(如 @ 指向 src)。
rollup-plugin-visualizer神器:生成体积分析图,优化首屏加载必看。

三、 Vite 视角下的 Rollup 构建流程

执行vite build命令后,Vite 会先完成自身的预处理工作,然后将所有打包任务委托给 Rollup 执行。整个流程可以分为以下三个核心阶段:

阶段 1:Vite 配置预处理与 Rollup 配置生成

Vite 读取vite.config.js,先分离 Vite 非 Rollup 相关的配置和 Rollup 相关配置;将 Vite 内置的处理 Vue/TS/CSS/ 静态资源插件注入,再合并用户配置的插件,最终生成标准的包含inputoutputplugins等核心字段的Rollup 配置对象

接着 Vite 调用 Rollup 的rollup.rollup()方法,传入上述配置,启动 Rollup 构建流程。

阶段 2:Rollup 构建阶段(建立模块依赖图)

Rollup 从input指定的入口文件开始,依次执行所有插件的resolveId(解析模块路径)→load(加载文件内容)→transform(转换文件为标准 ES 模块)钩子来处理各类资源。在处理的过程中会递归解析所有导入的模块,直到所有依赖解析完成,建立完整的模块依赖图。

补充:这个阶段只进行模块的解析和转换,不会生成任何输出文件。所有的文件内容都会被加载到内存中,形成一个完整的模块树。

阶段 3:Rollup 生成阶段(产物生成与输出)

在构建打包的过程中,Vite 会基于模块依赖图执行 Tree-shaking 移除未使用代码、Scope Hoisting 作用域提升,并根据output配置进行代码分割将代码拆分成多个独立的 chunks 文件,实现按需加载。Vite 插件在此阶段补充处理(将.vue、.ts 等文件编译为标准的 js 文件、并处理 css 将其压缩成单独的 css 文件等)。

最后调用bundle.generate()在内存中生成编译后的 JS/CSS/HTML 等产物,和bundle.write()将内存中的产物写入磁盘(默认dist目录),最终生成可部署的静态资源文件。

补充bundle.generate()只在内存中生成产物,不写入磁盘;bundle.write()会先调用bundle.generate(),然后将产物写入到指定的输出目录。

总结

Rollup 作为 Vite 生产环境的底层打包工具,是理解 Vite 打包原理的关键。掌握 Rollup 的核心配置和构建流程,不仅能帮助你解决生产环境中的各种打包问题,还能让你更灵活地定制 Vite 的构建流程,实现更高效的打包优化和插件开发。


深度解析 Rollup 配置与 Vite 生产构建流程》 是转载文章,点击查看原文


相关推荐


理解PDF的设计哲学,省下一半的编辑时间
databook2026/4/9

复制文字带换行?改一个字排版全乱?同一个文件到处显示一致? 我以前也觉得是PDF软件太垃圾。后来想通了:不是软件不行,是我一直把它用错了地方。 我被PDF坑过太多次了 从论文里复制一段话,贴出来全是"-"和莫名其妙的换行 想改一个错别字,后面的内容全跑了,调坐标调到想砸电脑 给客户发的报价单,在他电脑上竟然一模一样…… 最后一条其实不是坑,是惊喜。但前两条,真的烦。 后来我才搞明白一件事: PDF从一开始就不是让你编辑的。 它更像一张"数字相纸"——只管长啥样,不管你怎么改。 把它当电子纸


我用AI做了一个48秒的真人精品漫剧,不难也不贵
华洛2026/4/1

前言 最近花了点时间用AI做了一个48秒的真人精品漫剧,只能说在AI时代各行各业都被冲击的体无完肤... 制作方法 工具和平台 图片生成用到的模型是liblib、seedance2.0 视频生成用到的模型是可灵Omni、即梦图片5.0 平台用的是liblib、即梦 剪辑工具用到的是剪映 说一下这套工具的选择和搭配原因: 即梦作为当前生图、生视频第一梯队,一开始是我的首选,但是排队太久和真人验证确实令人心烦,后续逐渐演变为生图和补充的主力,不用来生视频了; 最终视频生成模型就选用了Omni,不过可


从 OpenClaw 到 Android:Harness Engineering 是怎么让 Agent 变得可用的
陆业聪2026/3/24

最近看到一张图,把 Agent 工程的演化路线列了出来:ReAct(2023初)→ Plan & Execute(2023末)→ Multi-Agent(2024)→ Context Engineering(2025)→ Harness Engineering(2025+)。配了一句话: "名词换了五六轮,核心问题从未改变。Agent 工程师的核心能力:在不确定性上构建确定性。" 这句话我反复想了一下,觉得说到点子上了。这篇文章不打算再讲 Harness Engineering 的定义,而是


基于 AST 与 Proxy沙箱 的局部代码热验证
July_lly2026/3/16

前言 在真实开发中系统中,我们常常会做/需要做一些代码运行或者检测工作。但是全量的代码运行消耗的时间是漫长的。那么我们有没有办法能够只处理我们修改的部分呢?答案是肯定的。 下面将验证介绍一种结合 AST (抽象语法树) 与 沙箱技术 的方案,局部代码热验证。 具体重服务mock代码会放在文章末尾 整体 -> 局部 我们切换一个方向:过去我们总是使用整体运行完拿到export的内容。在一些情况下,不论是 build 构建还是 dev 开发,我们通常都是全量编译打包一次。当然我们可以让他执行两次(比


GPT-5.4 API 上线了,在openClaw龙虾中试试
程序员陆通2026/3/7

突破性的前沿模型,现已全面开放 OpenAI 最新发布的 GPT-5.4 模型现已正式上线 WellAPI 平台!作为 OpenAI 迄今为止最强大的通用模型,GPT-5.4 在推理能力、编程水平和专业文档处理方面实现了质的飞跃,专为复杂专业工作场景打造 。 GPT-5.4 核心特性解析 1. 原生计算机操作能力 GPT-5.4 是 OpenAI 首个具备原生计算机使用能力的通用模型,这标志着 AI 代理(Agent)技术的重大突破。模型能够直接与计算机系统交互,为开发者和智能代理应用开辟了全新


实测UU远程云电脑:堪称游戏党专属“性能王”,游戏全程流畅,好用到出圈
啊阿狸不会拉杆2026/2/27

前言:本地设备性能拉胯,想畅玩《崩坏星穹铁道》《CSGO2》《鸣潮》《原神》?不用花大价钱组装高配电脑,UU远程云电脑直接帮你解决痛点!作为网易旗下主打游戏场景的云电脑工具,它凭借三款不同显卡机型、低延迟优化,稳居云电脑排行榜前列,堪称游戏党专属“性能王”,实测四款热门游戏全程流畅,好用到出圈。         UU远程云电脑核心优势的是精准适配游戏需求,目前推出三款显卡机型——GTX 1660S(入门款)、RTX 3660(主流款)、RTX 4070Ti/5070(旗舰款),按需选择灵活


IoT 平台可编程化:基于 Pydantic Monty 构建工业级智能自动化链路
Lupino2026/2/19

在万物互联的下半场,设备间的简单联动已无法支撑复杂的工业与商业场景。为了打破“配置化逻辑”的瓶颈,我们正式集成了 Pydantic Monty 运行时环境。这一演进赋予了开发者直接在云端编写 Python 脚本的能力,实现了从“被动连接”到“确定性逻辑自主”的跨越。 1. 核心底座:为什么是 Pydantic Monty? 我们选择了由 Pydantic 团队推出的 Monty 作为脚本引擎。它不仅是 Python 的子集,更是为高性能嵌入式场景量身定制的方案: 轻量级沙箱:相比庞大的标准 P


细说日常 Vibe coding 的十宗罪
mCell2026/2/10

同步至个人站点:细说我日常 AI coding 碰到的十个问题 这一年大量 vibe coding,经典翻车现场真的不少。有些是模型习惯问题,有些是 Agent 工具链缺陷,还有些属于“工程现实 vs 最佳实践”的冲突。下面这十个算是我最常遇到、也最容易让人 当场没绷住 的。 1. hardcode:类型系统被你当摆设 是的,很多 TS / Golang 项目,vibe coding 一顿猛改之后,总会冒出一堆 hardcode。 比如判断任务状态: 你会看到它写:taskResult.st


在 Arch Linux 中安装 **Xorg 服务器**
i建模2026/2/1

在 Arch Linux 中安装 Xorg 服务器(即 xorg-server)及相关组件的步骤如下: 一、核心安装命令 1. 安装 Xorg 服务器 sudo pacman -S xorg-server 此命令会安装 Xorg 的核心服务包,包含 X11 协议的实现和基础组件。 2. 安装显卡驱动(必选) 根据显卡类型选择驱动: Intel 集成显卡:sudo pacman -S xf86-video-intel AMD 显卡:sudo pacman -S xf86-video-amdg


Rust 所有权与借用:从堆栈开始建立心智模型
mCell2026/1/23

本文写作时,极大的借鉴了《The Rust Programming Language》(俗称“Rust 圣经”)中相关章节的内容和结构,在此表示感谢。 写 Rust 的第一道坎,不是语法,也不是宏,而是“我明明只是把变量传给你用一下,怎么它就不属于我了?” 这类困惑通常并不奇怪,因为我们习惯了别的语言那套“内存默认有人兜底”的模型,比如 Javascript、Golang 的自动垃圾回收机制。Rust 恰恰相反:它要求你把内存这件事想清楚,然后把规则写进类型系统,交给编译器在编译期强制执行——

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客