2026-10-30 18:45:29
Vite底层使用的Rollup构建原理Rollup是Vite在构建阶段的核心引擎,负责将项目中的模块打包成浏览器可理解的格式。其设计目标针对现代JavaScript的模块化特性(尤其是ES Modules),提供高效的打包解决方案。
Rollup构建流程概览Rollup的构建流程可分为以下阶段:
读取源代码并转换为抽象语法树(AST)。
遍历AST并应用插件提供的转换规则(如Babel转译)。
确定模块间的依赖关系(如import语句指向的路径)。
创建项目中所有模块的依赖关系图。
从模块图生成最终输出代码(如合并模块、处理导入/导出)。
将生成的代码写入文件系统(如dist/bundle.js)。
Rollup的插件机制是其核心扩展能力,插件可通过以下钩子影响构建过程:
示例:通过插件处理不同文件类型
// rollup.config.jsimport json from '@rollup/plugin-json';import typescript from '@rollup/plugin-typescript';export default { input: 'src/main.js', plugins: [json(), typescript()], output: { file: 'dist/bundle.js', format: 'esm' }};Rollup构建原理的深入示例假设项目结构如下:
src/├── main.js└── lib/ └── index.js代码内容:
// src/main.jsimport { sayHello } from './lib/index';sayHello();// src/lib/index.jsexport function sayHello() { console.log('Hello, Rollup!'); }构建过程:
通过动态import()实现按需加载,减少初始包体积:
// app.jsbutton.addEventListener('click', async () => { const chunk = await import('./chunk.js'); chunk.default();});配置:
// rollup.config.jsexport default { input: 'src/app.js', output: { dir: 'dist', format: 'esm' } // 自动分割代码};2. 自定义输出格式Rollup支持多种输出格式(如iife、cjs、umd),适应不同环境:
output: { file: 'dist/bundle.js', format: 'iife', // 立即执行函数 name: 'MyApp' // 全局变量名(用于UMD/IIFE)}3. Tree-shaking优化Rollup默认启用Tree-shaking,移除未使用的代码。需确保:
支持多个入口文件,生成多个输出包:
export default { input: ['src/main.js', 'src/admin.js'], output: { dir: 'dist', format: 'esm' }};自定义Rollup配置与Vite集成Vite在生产构建时默认使用Rollup,可通过vite.config.js自定义配置:
// vite.config.jsimport { defineConfig } from 'vite';import rollupOptions from './rollup.custom.config';export default defineConfig({ build: { rollupOptions: { // 覆盖或扩展Rollup配置 output: { manualChunks: { vendor: ['lodash'] } } // 代码分割 } }});关键点:
通过理解Rollup的构建原理和高级特性,可以更灵活地控制Vite项目的打包行为,适应复杂场景需求。