构建工具是2022年Vite流行后的前端面试常驻题。面试官要看你懂架构本质——浏览器现在原生支持ES模块,dev服务器不用打包——而不是"Vite新所以快"。
Webpack dev:启动先建完整依赖图,每个文件跑一遍所有loader(babel、ts、css),生成完整bundle。中大型应用冷启动10-60秒。HMR每次改动要从改动的模块往上重新走图。
Vite dev:完全不打包。以原生ES模块形式直接把源文件通过HTTP发给浏览器。浏览器按需请求每个模块,Vite现场转换(TS→JS、JSX→JS、CSS→JS import),用的是esbuild,比Babel快一两个数量级。第三方依赖用esbuild预打包成单个ESM文件一次性解决。
为什么快:冷启动近乎瞬时,什么都没提前打包。HMR瞬时,只需重新转换单个文件不走图。浏览器的模块加载器干剩下的活。
生产环境:Vite用Rollup打成传统chunked bundle——真实用户访问不能每次几百个HTTP请求。所以Vite是"dev原生ESM,prod Rollup打包",两种模式。
怎么选:2026年新项目默认Vite。Webpack仍适合:超大遗留项目(迁移成本高)、复杂自定义loader管道、Module Federation等Vite还没完全追上的场景。Rspack是Rust版Webpack-compatible,想要Vite速度但不想重写配置的选它。
Webpack和Vite解决同样的问题——把源码变成浏览器能跑的东西——但dev模式走了相反的路。Webpack的dev server要打包。启动时建完整依赖图,每个文件跑一遍所有loader(babel-loader、ts-loader、css-loader等),产出一个bundle,再serve。中等规模应用冷启动10-30秒。每次保存文件,HMR从改动模块沿着图走,重新生成受影响的chunk。Vite走了完全不同的思路。dev模式下Vite根本不打包,直接以原生ES模块形式通过HTTP把源文件发给浏览器。浏览器加载index.html时看到import语句,为每个模块发独立HTTP请求;Vite现场转换每个请求(TS→JS、JSX→JS、CSS→JS import),用的是esbuild,比Babel快一两个数量级。第三方依赖——React、lodash等——用esbuild预打包成每个依赖一个ESM文件,因为node_modules里一个包可能有几百个小文件,让浏览器一个个请求太慢。所以Vite的dev冷启动近乎瞬时——什么都没提前打包。HMR也瞬时——改动只需重新转换单个文件,不走任何图。为什么Webpack不照做?浏览器原生ESM最近才实用化,Webpack的架构是围绕打包设计的。生产环境Vite反而会打包——用Rollup产出传统chunked bundle,因为真实用户访问不能每页几百个HTTP请求。所以Vite是"dev ESM,prod Rollup"两个模式。选型:2026年新项目默认Vite。Webpack继续适合:巨型遗留代码迁移代价超过收益的、复杂自定义loader链或Module Federation等Webpack工具链更深的场景。Rspack是Rust重写的Webpack兼容版,想要Vite速度又不想重写Webpack配置的团队选它。
"Webpack预打包 vs Vite原生ESM按需"的对比是答题核心。
能讲esbuild预打包第三方依赖是Vite快的另一半原因。
指出"Vite prod用Rollup不用ESM"是很多候选人漏掉的细节。
临场忘了esbuild、Rollup这些名字,即答侠可以实时提示。
Vercel的Rust打包器,主要配Next.js,增量构建更强。2026还在稳定中。
是。Vite框架无关,Vue、React、Svelte、Solid都有官方插件。
支持,且是一等公民。Nuxt 3、SvelteKit、Remix都基于Vite SSR。