chenfei-hnu / Blog

个人整理的跟前端相关的文档 ( This is some front-end development related documentation )
9 stars 2 forks source link

Vite 学习总结 #56

Open chenfei-hnu opened 3 years ago

chenfei-hnu commented 3 years ago

背景:使用webpack打包时,需要将入口相关的文件都打到一个bundle.js文件中,所以每个很小的改动都需要进行整个模块重新打包,效率较低。因此产生以ESM 为理论基础的打包构建工具,要求项目完全由ES模块组成。根据入口文件的import语句,进行引用模块的加载,加载的模块记录,将被放置在模块图中。这意味着后续用到此模块的组件都从此处请求,从该映射中拉出复用,解析时附带对应的状态转换成模块实例进行使用。因为不需要打包,在开发环境下速度很快,生产环境通常还是借助webpack bundle式的打包。

Vite的基本实现原理,就是启动一个Koa服务拦截浏览器对ES模块的请求。通过查找目录下对应文件的文件做一定的处理最终以ES模块格式返回给客户端,使用esbuild进行打包。因为底层使用go这样的静态语言开发,因此打包效率较高。

通俗来讲,执行npm run dev命令后,Vite先把本地server启动,之后通过项目的入口收集依赖,把没有提供esm格式的依赖和内部大量的依赖提前打包,这个过程成为:预优化(Pre-Bundling)。预优化后在页面需要加载依赖时,通过http方式把资源请求回来,做到了真正的按需加载。

特点 1.快速的冷服务器启动 2.即时热模块更换 3.真正的按需编译

由于模块依赖了另一些模块,依赖的模块又基于另一些模块,会出现页面初始化时一次发送多个模块请求的情况。为了优化这个情况,可以直接使用vite Optimize使用它,提前将package.json中依赖项打包成一个esmodule模块,这样在页面初始化时能减少大量请求。

由于 Vite 在启动的时候不需要打包,也就意味着不需要分析模块的依赖、不需要编译。因此启动速度非常快。当浏览器请求某个模块时,再根据需要对模块内容进行编译。

这种按需动态编译的方式,极大的缩减了编译时间,项目越复杂、模块越多,Vite 的优势越明显。

在 HMR(热更新)方面,当改动了一个模块后,仅需让浏览器重新请求该模块即可,不像webpack那样需要把该模块的相关依赖模块全部编译一次,效率更高。

已有项目迁移,使用 cli 工具:wp2vite