Webpack和vite对比

155 阅读3分钟

主要差异

开发服务器启动方式及热模块更新

  • Webpack 需要对整个项目进行分析和打包构建,生成一个或多个 bundle 包,过程包含大量的文件读取、解析、转换、优化。修改一个小模块需要重新执行整个打包过程。
  • Vite 利用现代浏览器对 ES Modules 的原生支持,实现了“按需编译”的策略。只对修改模块进行更新便编译,并发送给浏览器。

依赖处理

  • Webpack 项目自身模块和 node_modules 三方模块,都进入打包流程,需要对所有文件引进的依赖进行解析、转换和合并,无论代码有没有用到,增加了不必要的处理时间和计算资源消耗。
  • Vite 充分利用浏览器的缓存机制。当浏览器请求一个第三方依赖模块时,如果该模块已经在之前的请求中被加载过并且未发生变化,浏览器会直接从缓存中获取,无需再次向服务器请求。

构建优化

  • Vite 在构建生产环境时会进行预构建,将常用的第三方依赖或者复杂的模块提前进行处理和优化,减少运行时的计算量。同时 Vite 也能够有效地进行代码分割,根据模块的使用场景和频率,将代码分割成多个小块,实现按需加载,进一步提高了应用的性能。
  • Webpack 也有类似的优化功能,但 Vite 在这些方面的实现方式更加高效和简洁,能够在更短的时间内生成性能更优的构建产物。

Vite 精准判断哪个模块更新原因

利用 ES Modules 的特性

ES Modules 具有明确的模块依赖关系和模块标识。如果模块 moduleA.js 的内容发生了修改,其模块标识(通常是基于文件路径和内容的哈希值)就会与之前不同,Vite 可以通过监测这些模块标识符的变化来确定具体哪个模块被更新。

开发服务器的实时监听

Vite 的开发服务器会实时监听项目中文件的变化。当文件被修改保存时,服务器能够立即捕获到这个事件。

高效的文件系统监测

Vite 可能使用了操作系统提供的高效文件系统监测机制,能够快速准确地获取文件的修改信息。

依赖关系的清晰记录

项目初始化时,Vite 会分析并记录各个模块之间的依赖关系。当一个模块更新时,根据已记录的依赖关系,可以快速确定可能受到影响的其他模块。

浏览器的请求机制

浏览器在请求模块时,会发送特定的请求头信息。Vite 可以通过解析这些请求头,结合模块的状态信息,判断是否需要返回更新后的模块内容。