浅理解Vite、webpack

161 阅读3分钟

1、实践感受vite的新特性

  • 快速启动:运行项目时启动速度快
  • 即时编译:修改页面不用手动刷新(Vite热模块替换的作用

那么 vite 和webpack的关系是怎么样的?

  • 先谈谈社区工具都有哪些?

webpack、rollup、parcel、esbuild、vite、vue-cli、create-react-app

打包工具webpackrollupparcelesbuild 功能:压缩、合并、转换、切割、打包等操作
项目搭建vue-clicreate-react-app 基于webpack的上层分封装 通过配置去搭建一个项目
项目搭建vite 开发环境依赖esbuild 进行预构建,生产环境依赖rollup进行打包,

webpack打包原理

webpack会根据我们配置文件(webpack.config.js) 中的入口文件(entry),分析出项目项目所有依赖关系,然后打包成一个文件(bundle.js),交给浏览器去加载渲染。

这样就会带来一个问题,项目越大,需要打包的东西越多,启动时间越长。

可以通过webpack-bundle-analyzer插件看到webpack的打包情况,安装包之,运行打包命令,在dist目录会产生一个report.html

image.png

vite运行项目时,首先会用esbuild进行预构建,将所有模块转换为es module,不需要对我们整个项目进行编译打包,而是在浏览器需要加载某个模块时,拦截浏览器发出的请求,根据请求进行按需编译,然后返回给浏览器。

在开发环境中,Vite主要使用esbuild来进行依赖预构建、代码转换和部分优化工作

这是esbuild 生成的文件,如下

image.png

在生产环境下的打包过程中,Vite会切换到使用Rollup。

编译时期的代码合运行的代码。在浏览器中是不同的 打包后的代码

image.png

运行时期的代码

image.png

运行时期的代码没有做更多的转换,比如js代码兼容低版本浏览器,等等操作都会在打包的时候去实现,所以vite打包运行要快一些。

再说说热更新 webpack

webpack项目中,每次修改文件,都会对整个项目重新进行打包

vite项目中,监听到文件变更后,会用websocket通知浏览器,重新发起新的请求,只对该模块进行重新编译,然后进行替换。 并且基于es module的特性,vite利用浏览器的缓存策略,针对源码模块(我们自己写的代码)做了协商缓存处理,意味着模块加载后,除非源代码改变,否则之后的请求会直接从缓存中读取,提高了性能 按需编译是指esbuild只编译和打包在应用程序运行时实际需要的代码 vite在启动时将所有模块转换为ES Modules (ESM),在浏览器访问某个路由时,去按需编译对应的模块,按需编译是指esbuild只编译和打包在应用程序运行时实际需要的代码 。