PRNext 0.1.22-alpha:性能大幅提升
PRNext 0.1.22-alpha 已在 npm 发布。在包含一千行数据的开发基准测试中,Flight 中位吞吐量达到原来的 7.7 倍,SSR 吞吐量达到原来的 3.97 倍,解码后的 Flight 载荷减少 72.1%。测试对比的是同一张表格在关闭和开启优化时的表现。
符合条件的展示组件会自动使用这项优化。无需添加“use presentation”指令:PRNext 传输可复用的结构和需要展示的值,计算仍在服务器上执行,首屏 HTML 也保持完整。更新 PRNext 并重新构建应用即可使用。
测试表格的 Flight 吞吐量最高达到原来的 7.7 倍
开发阶段在源码 270ae481 上比较完全相同的表格,分别关闭和启用优化。千行场景的 SSR 中位吞吐量从每秒 48.611 请求升至 192.765,约为 3.97 倍;Flight 从 80.472 升至 619.413,约为 7.70 倍。两者 p95 分别从 100.52 降至 28.78 毫秒、从 61.65 降至 8.806 毫秒。
表格 HTML 完全一致。解码后的 Flight 从 266,672 字节降至 74,353 字节,减少 72.1%;gzip 后减少 36.1%。编码后的浏览器 JavaScript 增加 606 字节,并多出两个请求。
本地测试使用 Windows x64、Node 24.22.1、两个 worker 和四个连接,运行在共享的 12 逻辑处理器、32 GiB PC 上。测试还包含一个百行 SSR 场景。三对交替测试,每个窗口预热一秒、测量三秒,共 18 个窗口,21,523 个响应全部通过验证且无错误。两种配置使用同一个重新构建的 0.1.21 原生二进制。这是开发源码测量,不是最终 npm 归档测量,也不是与 Next.js 的比较。内存表现因场景而异,浏览器收益尚无定论。SQL、业务逻辑和 DOM 工作不会因此快七倍。
只传输一次结构
Flight 将 React Server Components 的输出传给浏览器。当大量行共享结构时,逐一描述元素的开销可能超过实际显示的数据。PRNext 识别部分同步、纯展示组件,编译其静态标记,并通过 React 官方客户端引用传递紧凑的展示槽位。Flight 协议及解码器仍由受支持的 React 版本提供。
浏览器需要下载一个小型展示模块,因此仍有 JavaScript 传输和执行开销。服务端在模块加载前就输出完整 HTML。小列表或不兼容的值可以采用普通表示,不会仅因为表示格式变化就替换 DOM 根节点。
数据表格、目录以及长列表中的展示卡片往往包含大量重复标记。PRNext 将这些结构与展示值分开,减少在 Flight 中描述界面所需的工作。服务器仍然执行应用的计算和权限检查;实际收益取决于需要传输多少符合条件的展示内容。
私有计算留在服务端
在紧凑路径中,row.revenue-row.privateCost 这类表达式在服务端求值。浏览器只收到需要显示的结果,不会收到两个原始操作数或表达式。选择文本的条件同样如此。未使用的字段不会自动成为浏览器 props。
这项转换不会引入跨账户页面缓存,也不会替代权限检查。应用仍需授权所有展示数据。导入、Hook、副作用、自定义组件、交互控件、原始 HTML 以及未经验证的属性继续使用普通路径。
明确且保守的适用范围
自动编译适用于生产环境 Node App Router 构建。开发模式、Pages、Edge 和纯 HTML 输出保持现有行为。无法确认兼容性的自定义 webpack 或 JSX 流水线仍采用普通渲染,插件添加的 Hook 也包括在内。不要为了提高覆盖率而移除必要插件。
构建后的 .prnext/presentation-report.json 解释编译器决策,并不代表请求实际使用紧凑路径的比例。验证分别覆盖符合条件的紧凑负载,以及使用翻译流水线的 PostgreSQL 认证 SaaS,后者保留普通渲染。二十分钟诊断与两小时耐久测试是不同的证据。
升级并验证自己的应用
保留上一版源码、锁文件、配置和完整部署,以便回滚。安装版本后重新构建应用,并用版本一致的框架和原生包重启 worker。直接替换运行中进程下面的文件不会更新已加载代码。
要比较自己的应用,可在 prnext.config.mjs 设置 presentationComponents: false,然后分别重建。检查水合、导航、账户切换、表单、流取消,以及在部署和回滚期间始终打开的标签页。过期变更请求必须被拒绝,不能自动重放。PRNext 仍处于 alpha,且仅部分兼容 Next.js;真正重要的是自己应用的验证结果。
npm install @thomas.f/prnext@0.1.22-alpha
npx --no-install prnext check --production --json
npx --no-install prnext build