Vite 在开发环境下之所以能实现远超 Webpack 的“秒级”启动和热更新速度,其秘诀在于它颠覆了传统 bundler 的工作模式,充分利用了现代浏览器原生支持的 ES Modules (ESM)

传统的 Webpack Dev Server,在启动时必须先遍历所有模块,构建完整的依赖图,然后将整个应用打包到内存中,项目越庞大,这个初始的打包过程就越耗时。

Vite 则完全不同。它启动时,几乎不做任何打包工作。它直接以项目源码作为服务根目录,当浏览器发起请求时,例如请求 main.isVite Dev Server 会直接返回这个文件。浏览器会解析文件中的 import 语句,然后按需发起对其他模块(如 import App from './App.vue')的HTTP 请求。Vite 会拦截这些请求,即时(Just-in-Time)地对被请求的模块进行编译转换(如将 .vue 文件编译成 JavaScript),然后以原生 ESM 的格式返回给浏览器。

这种按需编译的模式,意味着只有当代码实际被请求时,Vite 才会去处理它。应用的启动时间不再与项目的大小成正比。而在热更新(HMR)时,Vite 只需让被修改的模块失效,并精确地通知浏览器重新请求这一个模块即可,无需重新构建整个 bundle。这种极致的效率,为前端开发带来了前所未有的流畅体验。当然,在生产环境中,Vite 还是会使用 Rollup 进行打包,以获得最佳的性能和兼容性。