当前位置: 首页 > article >正文

vite之---为什么选vite

为什么选vite

1、缓慢的服务器启动

当冷启动开发服务器时,基于打包器的方式启动必须优先抓取并构建你的整个应用,然后才能提供服务

Vite 通过在一开始将应用中的模块区分为 依赖 和 源码 两类,改进了开发服务器启动时间。

  • 依赖 大多为在开发时不会变动的纯 JavaScript。一些较大的依赖(例如有上百个模块的组件库)处理的代价也很高。依赖也通常会存在多种模块化格式(例如 ESM 或者 CommonJS)。

    Vite 将会使用 esbuild 预构建依赖。esbuild 使用 Go 编写,并且比以 JavaScript 编写的打包器预构建依赖快 10-100 倍。

  • 源码 通常包含一些并非直接是 JavaScript 的文件,需要转换(例如 JSX,CSS 或者 Vue/Svelte 组件),时常会被编辑。同时,并不是所有的源码都需要同时被加载(例如基于路由拆分的代码模块)。

    Vite 以 原生 ESM 方式提供源码。这实际上是让浏览器接管了打包程序的部分工作:Vite 只需要在浏览器请求源码时进行转换并按需提供源码。根据情景动态导入代码,即只在当前屏幕上实际使用时才会被处理。

2、缓慢的更新

基于打包启动时,当源文件被修改后,重新构建整个包是低效的,原因显而易见:更新速度会随着应用体积的增加而线性下降。

  • 一些打包器的开发服务器将构建内容存入内存,这样它们只需要在文件更改时使模块图的一部分失活[1],但它也仍需要整个重新构建并重载页面。这样代价很高,并且重新加载页面会消除应用的当前状态,所以打包器支持了动态模块热替换(HMR):允许一个模块 “热替换” 它自己,而不会影响页面其余部分。这大大改进了开发体验 —— 然而,在实践中我们发现,即使采用了 HMR 模式,其热更新速度也会随着应用规模的增长而显著下降。
  • 在 Vite 中,HMR 是在原生 ESM 上执行的。当编辑一个文件时,Vite 只需要精确地使已编辑的模块与其最近的 HMR 边界之间的链失活[1](大多数时候只是模块本身),使得无论应用大小如何,HMR 始终能保持快速更新。
  • Vite 同时利用 HTTP 头来加速整个页面的重新加载(再次让浏览器为我们做更多事情):源码模块的请求会根据 304 Not Modified 进行协商缓存,而依赖模块请求则会通过 Cache-Control: max-age=31536000,immutable 进行强缓存,因此一旦被缓存它们将不需要再次请求。

为什么生产环境仍需打包

  • 尽管原生 ESM 现在得到了广泛支持,但由于嵌套导入会导致额外的网络往返,在生产环境中发布未打包的 ESM 仍然效率低下(即使使用 HTTP/2)。为了在生产环境中获得最佳的加载性能,最好还是将代码进行 tree-shaking、懒加载和 chunk 分割(以获得更好的缓存)。
  • 要确保开发服务器和生产环境构建之间的最优输出和行为一致并不容易。所以 Vite 附带了一套 构建优化 的 构建命令,开箱即用。

为何生产环境不用 ESBuild 打包?

  • 虽然 Vite 利用 esbuild 在开发中预打包一些依赖,但 Vite 不会在生产构建中使用 esbuild 作为打包工具。
  • Vite 目前的插件 API 与使用 esbuild 作为打包器并不兼容。尽管 esbuild 速度更快,但 Vite 采用了 Rollup 灵活的插件 API 和基础建设,这对 Vite 在生态中的成功起到了重要作用。目前来看,我们认为 Rollup 提供了更好的性能与灵活性方面的权衡。
  • Rollup 已经开始着手改进性能,在 v4 中将其解析器切换到 SWC。同时还有一个正在进行中的工作,即构建一个名为 Rolldown 的 Rust 版本的 Rollup。一旦 Rolldown 准备就绪,它就可以在 Vite 中取代 Rollup 和 esbuild,显著提高构建性能,并消除开发和构建之间的不一致性。

http://www.kler.cn/a/503686.html

相关文章:

  • FPGA的 基本结构(Xilinx 公司Virtex-II 系列FPGA )
  • 银河麒麟服务器操作系统桌面任务栏网络图标消失问题
  • Docker Desktop 构建java8基础镜像jdk安装配置失效解决
  • 【STM32-学习笔记-9-】SPI通信
  • 解析OVN架构及其在OpenStack中的集成
  • Idea-离线安装SonarLint插件地址
  • seleniun 自动化程序,python编程 我监控 chrome debug数据后 ,怎么获取控制台的信息呢
  • 使用Docker模拟PX4固件的无人机用于辅助地面站开发
  • MCP Server开发的入门教程(python和pip)
  • 服务器宕机原因?该怎么处理?
  • AOSP 14及以上userdebug无法调试的问题
  • wireshark开启对https密文抓包
  • c语言注意事项(不断完善版)
  • 大师课程:专业角色AE+AI动画动态设计关键帧学院视频课程 Key Frame Academy – Character Animation Launchpad
  • Java全栈项目-学生创新创业项目管理系统
  • 通过外部链接启动 Flutter App(详细介绍及示例)
  • 3D目标检测数据集——Nusence数据集
  • Linux:Makefile 以及实现第一个程序:进度条
  • 梁雨茜:用镜头架起文化桥梁,定格跨界艺术之美
  • ASP.NET Core 中的高效后台任务管理
  • 【区间DP】【hard】力扣1312. 让字符串成为回文串的最少插入次数
  • dp--校训
  • Python 扫描枪读取发票数据导入Excel
  • 教育邮箱的魔力:免费获取Adobe和JetBrains软件
  • 云原生作业1
  • 使用 WPF 和 C# 将纹理应用于三角形