跳转到内容

Vite 5.1 发布了!

2024年2月8日

Vite 5.1 Announcement Cover Image

Vite 5 于去年11月发布,它代表了 Vite 和整个生态系统的又一次重大飞跃。几周前,我们庆祝了 npm 每周下载量突破 1000 万次,以及 Vite 仓库拥有 900 位贡献者。今天,我们很高兴地宣布 Vite 5.1 的发布。

快速链接:文档更新日志

其他语言文档:简体中文, 日本語, Español, Português, 한국어, Deutsch

在 StackBlitz 在线试用 Vite 5.1:vanilla, vue, react, preact, lit, svelte, solid, qwik

如果您是 Vite 的新手,建议先阅读入门功能指南。

要了解最新动态,请在 XMastodon 上关注我们。

Vite Runtime API

Vite 5.1 为全新的 Vite Runtime API 增加了实验性支持。它允许通过先用 Vite 插件处理代码来运行任何代码。它与 server.ssrLoadModule 不同,因为运行时实现与服务器解耦了。这使得库和框架作者能够实现自己的服务器和运行时之间的通信层。这个新 API 旨在在稳定后取代 Vite 当前的 SSR 原语。

新 API 带来了许多好处

  • 支持在 SSR 期间进行热更新(HMR)。
  • 它与服务器解耦,因此不受单个服务器连接客户端数量的限制——每个客户端都有自己的模块缓存(您甚至可以使用您想要的任何方式与之通信——使用消息通道、fetch 调用、直接函数调用或 websocket)。
  • 它不依赖于任何 Node/Bun/Deno 的内置 API,因此可以在任何环境中运行。
  • 它很容易与拥有自己代码运行机制的工具集成(例如,您可以提供一个运行器来使用 eval 而不是 new AsyncFunction)。

最初的构想由 Pooya Parsa 提出,并由 Anthony Fu 作为 vite-node 包实现,用于驱动 Nuxt 3 开发环境下的 SSR,后来也成为了 Vitest 的基础。因此,vite-node 的总体构想已经经过了相当长时间的实战检验。这是由 Vladimir Sheremet 对该 API 进行的全新迭代,他已经在 Vitest 中重新实现了 vite-node,并汲取了经验,使 API 在加入 Vite Core 时变得更加强大和灵活。该 PR 开发历时一年,您可以在这里查看其演变过程以及与生态系统维护者的讨论。

信息

Vite Runtime API 演变成了 Module Runner API,在 Vite 6 中作为环境 API(Environment API)的一部分发布。

功能

改进对 .css?url 的支持

现在,将 CSS 文件作为 URL 导入可以稳定且正确地工作。这是 Remix 迁移到 Vite 的最后一个障碍。见 (#15259)。

build.assetsInlineLimit 现在支持回调函数

用户现在可以提供一个回调函数,返回布尔值来选择开启或关闭特定资源的内联。如果返回 undefined,则应用默认逻辑。见 (#15366)。

改进循环导入的热更新(HMR)

在 Vite 5.0 中,循环导入中被接受的模块即使在客户端可以正常处理,也会触发全页面重载。现在这一限制已放宽,允许在不进行全页面重载的情况下应用 HMR,但如果 HMR 期间发生任何错误,页面仍将重新加载。见 (#15118)。

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

历史上,Vite 会外部化除链接包(linked packages)之外的所有包。此新选项可用于强制外部化所有包,包括链接包。这在 monorepo 的测试中非常有用,因为我们希望模拟所有包都被外部化的通常情况;或者在使用 ssrLoadModule 加载任意文件时,我们希望始终外部化包,因为我们不关心 HMR。见 (#10939)。

预览服务器中公开 close 方法

预览服务器现在公开了一个 close 方法,它将正确关闭服务器,包括所有打开的套接字连接。见 (#15630)。

性能提升

Vite 在每个版本中都在不断变快,Vite 5.1 包含了多项性能改进。我们使用 vite-dev-server-perf 测量了从 Vite 4.0 开始的所有次要版本的 10K 模块(25 层深树)的加载时间。这是衡量 Vite 无打包(bundle-less)方法效果的一个很好的基准。每个模块都是一个包含计数器和对树中其他文件导入的小型 TypeScript 文件,因此这主要衡量的是作为独立模块进行请求所需的时间。在 Vite 4.0 中,在 M1 MAX 上加载 10K 模块耗时 8 秒。在 Vite 4.3 中我们专注于性能并取得了突破,我们将加载时间缩短到了 6.35 秒。而在 Vite 5.1 中,我们又实现了一次性能飞跃。Vite 现在仅需 5.35 秒即可提供 10K 模块。

Vite 10K Modules Loading time progression

此基准测试的结果是在无头 Puppeteer 上运行的,是比较不同版本的好方法。然而,它们并不代表用户体验到的时间。在 Chrome 隐身窗口中运行相同的 10K 模块时,结果如下:

10K 模块Vite 5.0Vite 5.1
加载时间2892ms2765ms
加载时间(缓存)2778ms2477ms
全量重载2003ms1878ms
全量重载(缓存)1682ms1604ms

在线程中运行 CSS 预处理器

Vite 现在支持在线程中运行 CSS 预处理器(需手动开启)。您可以通过 css.preprocessorMaxWorkers: true 启用它。对于一个 Vuetify 2 项目,开启此功能后开发启动时间减少了 40%。PR 中有其他设置的性能比较。见 (#13584)。提供反馈

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

您可以设置 optimizeDeps.holdUntilCrawlEnd: false 以切换到一种新的依赖项优化策略,这可能有助于大型项目。我们正在考虑将来默认使用此策略。提供反馈。 (#15244)

通过缓存检查实现更快的解析

fs.cachedChecks 优化现在默认启用。在 Windows 上,tryFsResolve 因此快了约 14 倍,并且在三角形基准测试中,总体 ID 解析速度提升了约 5 倍。 (#15704)

内部性能改进

开发服务器进行了几项增量性能提升。增加了用于 304 短路的新中间件 (#15586)。我们在热点路径中避免了 parseRequest (#15617)。Rollup 现在可以正确进行懒加载 (#15621)。

弃用

我们继续尽可能减少 Vite 的 API 面,以确保项目的长期可维护性。

弃用 import.meta.glob 中的 as 选项

标准已经转向 导入属性 (Import Attributes),但我们目前不打算用新选项替换 as。建议用户改用 query。见 (#14420)。

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

Vite 3 中添加的实验性功能“构建时预打包”已被移除。随着 Rollup 4 将其解析器切换为原生代码,以及 Rolldown 的开发,该功能的性能优势和开发与构建不一致的问题已不再存在。我们希望继续改善开发/构建的一致性,并得出结论:使用 Rolldown 进行“开发时预打包”和“生产环境构建”是未来的更好选择。Rolldown 在构建时可能还会以比依赖预打包效率高得多的方式实现缓存。见 (#15184)。

参与其中

我们衷心感谢 900 位 Vite Core 贡献者,以及插件、集成、工具和翻译的维护者,他们不断推动生态系统向前发展。如果您喜欢 Vite,欢迎参与并帮助我们。查看我们的 贡献指南,投入到 分类 Issue审查 PR、在 GitHub Discussions 中回答问题,并在 Vite Land 中帮助社区中的其他人。

鸣谢

Vite 5.1 的实现离不开我们的贡献者社区、生态系统中的维护者以及 Vite 团队。向资助 Vite 开发的个人和公司致敬。StackBlitzNuxt LabsAstro 聘请了 Vite 团队成员。同时也感谢在 Vite 的 GitHub SponsorsVite 的 Open Collective 以及 Evan You 的 GitHub Sponsors 上资助的朋友们。