vite概念及设计思想

204 阅读3分钟

vite

  • 是一种新型前端构建工具,能够显著提升前端开发体验。
  • vite 由两部分组成
    • 一个开发服务,(基于原生ES模块提供了丰富的内置功,服务于开发环境,类似于webpack的devServe)服务于开发环境,ESM + HMR(实现模块的热更新)
    • 一套构建指令,服务于生产环境,用Rollup打包(预配置,可输出用于生产环境)
  • 类似于webpack+cli,即提供了打包功能又提供了一些本地启动开发服务的功能,同时还提供了类似Rollup生产环境打包的功能。是一个比较集成化的工具。不与任何框架绑定(vue提供了完善的API;react是一个偏向函数式的理念,页面完全由数据驱动。)

打包的概念

使用工具、处理并将我们的源码模块串联成可以在浏览器中运行的文件

  • 常用前端打包工具
    • webpack 开发环境启动devServe来做接口的代理,本地mock数据的构建,本地服务代理;生产环境打包成umd格式的入口文件
    • rollup 多打包类库
    • parcel 比较少用
    • gulp 类似于前端的串联工具,类库中串联流程
  • 问题
    • 缓慢的服务启动
      • 当冷启动开发服务器时,基于打包器的方式启动必须优先于抓取并构建你的整个应用,然后才能提供服务
    • 缓慢的更新
      • 基于打包器启动时,重建整个包的效率很低。原因显而易见:因为这样更新速度会随着应用体积增长而直线下降

vite打包原理

  • vite 将模块区分为依赖和源码两类,提升开发服务启动时间
    • 依赖:在开发时不会变动的纯JavaScript,Vite会使用esbuild预构建依赖(用go编写的)
    • 源码:通常为jsx、css或者vue Sfc等,时常会被编辑,需要转换,基于路由拆分
  • vite 以原生ESM 方式提供源码,让浏览器接管打包工作
    • vite只需要在浏览器请求源码时,进行转换并且按需提供源码,然后根据情景动态倒入代码,在当前屏幕实际使用时才会被处理,基于打包器启动时重建的整个包的时候效率比较低,在vite中html其实是在原生的ems上执行的,当编辑一个文件时vite只需要精确的使以边界的模块以及最近的html链失活。同时vit会利用http头加速页面的重新加载。源码模块的请求会根据304这样的请求来进行协商缓存,而依赖模块的请求会通过强缓存。
  • vite在生产环境下用Rollup打包的原因
    • 尽管原生的ems得到了广泛的支持,但是由于嵌套导入会导致额外的网络往返。在生产环境中发布为打包的EMS效率任然是低下的,并且浏览器支持也不太好,为了在生产环境中获得最佳的性能,最好还是使用Rollup这样的工具进行UMD格式的打包