前言
由于笔者接触的前端比较晚,接触后就一直在使用vite,对webpack的原理也是一知半解。这里将从多个角度分析总结,webpack和vite区别在哪里?为什么vite会比webpack快?还有学习过程中引发一些其他思考。
区别
1.设计理念的不同
webpack
- 传统的打包工具:webpack是一个功能全面的打包工具,它的核心思想是将所有的模块(包括JS/CSS/图片等等)打包成一个或者多个bundle(捆绑包)。
- 配置驱动:webpack的配置选项非常丰富,可以通过大量的插件和loader来处理各种构建需求和自定义需求。
- 构建过程:在开发和生产环境下,webpack都会执行整个构建过程,即将所有的模块进行打包处理,利用webpack-dev-server来提供热重载功能。
vite
- 现代的构建工具:vite是基于(原生ES模块和Rollup)的构建工具,目的是提高开发体验和构建效率。
- 按需编译:在开发模式下,利用浏览器原生的ES模块支持,按需编译,可以实现非常快的启动时间和热更新速度。
- 构建优化:在生产模式下,利用Rollup进行打包,提供优化和压缩功能,但是开发时不会进行打包操作。
2.底层的语言不同
webpack是基于node.js进行构建的,而vite是采用ESbuild进行预构建依赖(指在项目启动或构建前,对项目中所需的依赖进行预先处理。当项目实际运行时,可以直接使用这些预先处理好的依赖,提高开发和构建效率)的。ESbuild是采用go语言编写的,go的速度是纳秒级别,node.js是毫秒。
总体来说,开发环境下vite不需要整体打包再去运行,而且直接运行并且按需编译;vite利用了浏览器对原生ESmodules的支持,直接在浏览器执行相应模块;底层语言的差异,go比node.js快;优化了webpack的热更新机制。
思考
文中提到了vite在开发模式和生产模式下的采用不同的打包/构建方式,因为在生产环境下不会像开发环境有频繁的资源变更,所以按需编译就显得不那么重要了,还是应该去整体打包,vite采用的打包工具是Rollup,但是我们知道Rollup适合打包一些工具库,那么为什么Rollup适合打包一些工具库,不太适合打包一些大型应用项目呢?我们一起来看下
- 工具库:工具库一般采用ESmodules的形式去开发,并且关注代码的体积和性能的处理。Rollup特别适合这种场景,因为它可以实现深度的tree-shaking和代码优化,从而生成体积小且高效的打包产物。所以Rollup可以优化库文件,从而提升库的性能。
- 应用项目:当实际的系统应用项目部署到生产环境时,会涉及到大量的插件和特性(代码分割/动态加载等)。虽然Rollup也支持这些功能,但它的设计主要目标还是提供更优化的打包产物,而在处理一些繁杂的应用时,需要更多的配置和插件支持。
总体来说,Rollup专注于优化和处理ESmodules,从而生成高效的库文件;而对于实际的项目需求来说,需要强大的配置能力,丰富的插件系统和复杂需求的支持时,可能webpack更合适一点。