Vite 5.1 正式发布,前端构建工具

来源: 投稿
作者: News Bot
2024-02-10 09:25:00

Vite 团队官宣 Vite 5.1 正式上线

Vite(法语意为 "快速的",发音/vit/,发音同 "veet")是一种新型前端构建工具,能够显著提升前端开发体验。它主要由两部分组成:

  • 一个开发服务器,它基于原生 ES 模块提供了丰富的内建功能,如速度快到惊人的模块热更新(HMR)。

  • 一套构建指令,它使用Rollup打包你的代码,并且它是预配置的,可输出用于生产环境的高度优化过的静态资源。

Vite 提供了强大的扩展性,可通过其插件 API和JavaScript API进行扩展,并提供完整的类型支持。

Vite 运行时 API

Vite 5.1 新增了对全新 Vite Runtime API 的实验性支持。它允许首先使用 Vite 插件处理任何代码,然后再运行。这与server.ssrLoadModule截然不同,因为运行时实现与服务器解耦了。这使得库和框架作者可以在服务器和运行时之间实现自己的通信层。全新的 Vite Runtime API 旨在稳定后,取代 Vite 现在的 SSR primitives(服务端渲染原语)。

全新的 Vite Runtime API 带来了一大波龙年福利:

  • SSR 期间支持 HMR(热模块替换)

  • 它与服务器解耦,因此没有限制可以使用单个服务器的客户端数量,每个客户端都有自己的模块缓存,我们甚至可以按照个人喜好与其通信,包括但不限于使用消息信道/fetch调用/直接的函数调用/websocket。

  • 它不依赖任何node/bun/deno的内置 API,因此可以在任何环境中运行。

  • 它可以轻而易举地与具有自己的运行代码机制的工具集成,举个栗子,我们可以提供一个运行程序,使用eval取代new AsyncFunction

初始想法由 P.P. 提出,并由 AntFu 作为vite-node包实现,驱动了 Nuxt 3 Dev SSR,后来也作为 Vitest 的基建。所以vite-node的整体思想已经经过“路遥知码力”的长期考验。此乃 V.S. 对 API 的全新迭代,它已经在 Vitest 中重现了vite-node,并在将其集成到 Vite 核心库时痛改前非,使 Vite Runtime API 更灵活给力。此 PR(拉取请求)已经沉淀了整整一年。


功能

改进了.css?url的支持

将 CSS 文件作为 URL 导入现在可以码到成功。此乃 Remix 向 Vite 迁移的最后一个阻碍。

build.assetsInlineLimit现在支持回调

用户现在可以提供一个返回布尔值的回调函数,选用或弃用特定资源的内联。如果返回了undefined,那就应用默认逻辑。

改进了循环导入的 HMR

在 Vite 5.0 中,循环导入中接受的模块总是会触发整页重载,即使它们可以在客户端被妥善处理。现在此问题已经放飞自我,允许在无需重载整页时应用 HMR,但如果在 HMR 期间发生任何错误,页面则会重载。

支持ssr.external: true外部化所有 SSR 包

从历史上看,除了链接包之外,Vite 会外部化所有软件包。这个全新的ssr.external: true选项可用于强制外部化所有包,包括链接包。在我们想模拟所有外部包的常见情况的 monorepos(多库开发)测试中,这十分方便,或者当使用ssrLoadModule加载任意文件,且我们希望始终使用外部包时,因为我们不关心 HMR。

在预览服务器中暴露close方法

预览服务器现在暴露了一个close方法,该方法会妥善拆除服务器,包括所有开启的 socket(套接字)连接。

性能优化

Vite 每次发布都变得越来越快,且 Vite 5.1 充满了性能优化。我们使用vite-dev-server-perf测量了 Vite 4.0 以来所有次版本的 10K 模块(25层深度树)加载时间。这是一个衡量 Vite 无打包方案效果的优秀基准测试。每个模块都是一个携带计数器的迷你 TS 文件,并导入到模块树中的其他文件,因此这主要测量对单独模块执行请求的时间开销。在 Vite 4.0 中,在轻薄游戏本上加载 10K 模块耗时8秒。我们在聚焦性能的 Vite 4.3 更胜一筹,我们能在6.35秒内加载它们。在 Vite 5.1 中,我们又双叒叕实现了性能飞跃。Vite 现在可以在5.35秒内服务 10K 模块。

该基准测试的结果在 Headless Puppeteer 上运行,这是版本跑分的优秀方案。但它们并不代表用户的经历时长。当在 Chrome 的隐身窗口中运行相同数量的 10K 模块时,如下所示:

10K 模块 Vite 5.0 Vite 5.1
加载时间 2892ms 2765ms
加载时间(缓存) 2778ms 2477ms
完全重载 2003ms 1878ms
完全重载(缓存) 1682ms 1604ms

在线程中运行 CSS 预处理器

Vite 现在可选择支持在线程中运行 CSS 预处理器。我们可以使用css.preprocessorMaxWorkers: true启用它。对于 Vuetify 2 项目,启用此功能后,开发启动时间狂跌 40%。

改进服务器冷启动的新选项

我们可以设置optimizeDeps.holdUntilCrawlEnd: false切换到新型依赖优化策略,这可能有助于大型项目。我们正在考虑将来默认切换到此策略。

缓存检查更快解析

fs.cachedChecks优化现在默认启用。在 Windows 中,tryFsResolve的速度爆涨约14倍,并且在三角基准测试中解析 id 的速度全面爆涨约5倍。

内部性能优化

开发服务器的性能斩获了若干增量提升。一个新型中间件可以在 304 时短路。我们避免了热路径的parseRequest。Rollup 现已被正确懒加载。


废弃功能

我们会继续尽量减少 Vite 的 API 接口,使 Vite 能够长期维护。

已弃用import.meta.globas选项

标准已移至import Attributes(导入属性),但我们目前不打算使用新选项取代as。相反,我们建议用户切换到query

移除的实验性构建时预打包

构建时预打包是 Vite 3 增加的一项实验性功能,现已被移除。随着 Rollup 4 将其解析器切换到原生,且 Rolldown 正在研发中,此功能的性能和开发与构建不一致的情况都不再有效。我们希望继续改良开发/构建的一致性,并得出结论,使用 Rolldown 进行“开发时预打包”和“生产构建”是更优选择。Rolldown 还可能在构建时实现缓存,这比依赖预打包更高效。

来源:https://mp.weixin.qq.com/s/bEQbMjK22y3UlbM-zqoERw

展开阅读全文
点击引领话题📣 发布并加入讨论🔥
0 评论
1 收藏
分享
返回顶部
顶部