Vinext 1.0 发布:让 Next.js 应用运行在 Vite 之上

Cloudflare AI Bl1 天前

Vinext 1.0 发布:Next.js 与 Vite 的新组合

Vinext 1.0 正式发布。这个项目最初是一次为期一周的 AI 驱动实验,目标是探索能否在 Vite 之上复刻 Next.js 框架能力。经过约七个月迭代后,Vinext 已被用于生产环境中的高流量动态应用。

Vinext 的目标是让现有 Next.js 应用具备更好的可移植性:无论项目使用 Pages Router 还是 App Router,都可以迁移到 Vinext,并部署到不同 Web 平台,包括 Cloudflare Workers 免费计划、Netlify 或 AWS Lambda。

对于已有 Next.js 项目,迁移流程被设计为两步:

npx vinext check
npx vinext init

前者用于检查当前 Next.js 安装和项目修改是否兼容,后者用于设置 Vite 与部署配置,同时保留原有 Next.js 项目结构。

从实验走向 1.0

Vinext 初次亮相时仍不完整。后续开发重点主要集中在两方面:

  • 改进 App Router 兼容性;
  • 扩展对 Pages Router 应用的支持。

不少团队仍在维护大型 Pages Router 项目,迁移到 App Router 并非一步完成。因此 Vinext 并不只面向使用最新 App Router 特性的项目,而是尝试覆盖两套路由体系及混合应用场景。

项目团队称,对于客户重点要求的功能,当前测试兼容性已超过 99%。为了避免回归,Vinext 建立了覆盖两套路由、开发服务器、生产服务器、Node.js 与 Cloudflare Workers 部署目标的测试体系,并在夜间运行 Next.js 端到端测试套件,以持续监测兼容性变化。

Vinext 的难点不只是实现同名 API,而是复刻 Next.js 的行为。例如 revalidatePath 这样的功能,不仅要能调用,还必须正确影响渲染页面、缓存条目和后续请求。

1.0 版重点能力

Vinext 1.0 并未试图完整覆盖 Next.js 近年来推出的所有能力,而是优先强化开发者实际迁移时更依赖的核心部分。

1. App Router、Pages Router 与混合应用

Vinext 支持两套路由路径,包括:

  • React Server Components;
  • Server Actions;
  • API Routes;
  • Route Handlers;
  • Middleware;
  • 客户端导航。

这意味着它不仅适合新项目,也试图覆盖仍在使用 Pages Router 的长期项目。

2. 页面完整生命周期

Next.js 页面可能以多种方式生成:

  • 服务端渲染;
  • 构建时预渲染;
  • 导出为静态资源;
  • 使用页面级 ISR(Incremental Static Regeneration)缓存。

Vinext 1.0 支持 App Router 与 Pages Router 在构建期间预渲染路由,并通过页面级 ISR 提供响应,同时支持按路径或标签失效缓存。对于完全静态站点,也支持 output: "export"。

3. 缓存能力

Vinext 在 App Router、Pages Router 和受支持运行时之间提供统一的缓存函数,并进一步支持使用 Workers Cache。

4. 可观测性

Vinext 提供与 Next.js 兼容的 tracing,覆盖两套路由。因此,已有 OpenTelemetry 和 Sentry 配置可以继续工作。在 Cloudflare Workers 上,trace 还可与原生 Workers Observability 集成。

5. Next.js 生态兼容

Vinext 实现了公开的 next/* 接口,并支持常见 Next.js 使用模式,包括:

  • 身份认证;
  • MDX;
  • 图片优化;
  • 字体;
  • metadata;
  • 环境变量等。

6. Workers 运行时支持

Vinext 虽然设计为可运行在多个平台,但在开发和生产环境中,服务端代码也可以直接运行在 Cloudflare 的 workerd 运行时,并访问图片优化、Hyperdrive 等绑定能力。

预渲染与缓存预热

Vinext 早期版本支持首次请求后的 ISR,但尚不支持构建期间渲染页面。许多应用会通过 generateStaticParams() 和 getStaticPaths() 标识构建时应渲染的页面,并期望这些初始响应能够与后台重新验证、按需重新验证协同工作。

Vinext 1.0 已支持这一生命周期。不过,项目团队也提出了一个问题:为什么预渲染一定要发生在构建机器上?

对于拥有数万甚至数十万个可能 URL 的站点,构建时逐个渲染页面可能耗费大量时间,而其中不少页面实际流量很低。构建过程无法判断长尾流量,也难以优先处理更关键的页面。

Vinext 的方案是缓存预热:将页面预渲染从构建机器转移到 Cloudflare 网络中。开发者仍可使用 Next.js 的原有机制标识需要预渲染的页面,Vinext 也可以额外识别高流量页面并加入预热列表。

部署流程中,会先上传新的 Worker 版本,并将其部署到 0% 生产流量,然后专门请求该版本的页面。这样可以在真实用户访问新版本之前完成渲染和缓存填充。缓存准备完成后,再安全地提升部署版本。

对 Cache Components 的支持仍有限

Next.js 16 将 Cache Components 视为框架未来的重要方向之一。不过,项目团队在与使用者沟通后发现,许多团队尚未使用该能力,也并不将其视为迁移前提。

因此,Vinext 目前对驱动 Cache Components 的 use cache 指令支持仍然有限。后续会继续改进兼容性,但当前重点仍放在路由、页面生命周期、缓存、可观测性和生态兼容等核心能力上。

后续方向:自动跟踪上游变化

Vinext 接下来的重点是持续跟进 Next.js 上游变化。Next.js canary 每天都会有新提交,Vinext 项目会通过自动化流程审查变更、获取 diff,并为可能影响 Vinext 的内容创建跟踪事项。

同时,兼容性矩阵会随着夜间测试重新生成。当测试或跟踪事项暴露差距时,自动化代理可以识别两个代码库之间的变化,构建复现案例,迁移相关测试,并提出修复方案。

目前,这套流程已经用于发现缺失场景、不安全缓存行为,以及开发服务器与生产服务器之间的行为差异。

适合关注什么问题?

Vinext 1.0 对以下开发者更值得关注:

  • 希望将现有 Next.js 项目迁移到 Vite 工具链;
  • 仍在维护 Pages Router 大型应用;
  • 需要同时支持 App Router 与 Pages Router 的混合项目;
  • 希望将 Next.js 应用部署到更多 Web 平台;
  • 对 ISR、预渲染、缓存预热和边缘运行时有实际需求。

不过,如果项目高度依赖 Next.js 最新实验性能力,尤其是 Cache Components,仍需要仔细评估当前兼容性。

评论

请登录后发表观点

暂无数据