22: 性能
一个遵循本指南中约定的 Phlo 应用程序在 Lighthouse 的评分上起点较高,因为其架构已经完成了审计所测量的大部分内容:服务器渲染的 HTML、一个小的延迟脚本、一个样式表、没有框架负载和没有第三方请求。本章将正确的 Phlo 使用与网络性能的最佳实践相对应,并涵盖了剩下的部分:图像、标记和测量。

22.1: 平台已经完成的功能
每个 view() 响应都是完整的服务器渲染 HTML。第一次绘制是真实内容,没有水合步骤,也不需要等待客户端渲染,因此第一次内容绘制和最大内容绘制由你的服务器时间和图像决定,而不是由框架决定。
资产同样简洁。构建将所有前端代码编译成一个 app.js(phlo.js 运行时加上你的编译脚本,通常只有几十千字节)和所有样式编译成一个 app.css。view() 使用 defer 包含脚本,因此它从不阻塞渲染,并为样式表、脚本和图标精灵发出 Link: rel=preload 头,以便浏览器在解析 HTML 之前开始获取它们。每个资产 URL 都携带来自 %app->version 的 ?version 缓存破坏器,这使得长缓存生命周期变得安全:在发布时增加版本号,每个客户端只会重新获取一次。
在此基础上,FrankenPHP 提供 HTTP/2 和 HTTP/3,自动启用 HTTPS,并在你的 vhost 启用时压缩响应(zstd、brotli、gzip)。这些都不需要在应用中进行配置。
22.2: 服务器时间:worker 模式
首次字节时间是唯一一个完全依赖于您服务器的 Lighthouse 指标。在生产环境中,以工作模式运行发布构建(在入口处使用 thread):应用程序保持编译状态并驻留在内存中,因此请求可以在没有任何引导的情况下执行您的 route。开发模式(build: true)会检查源代码,并可能在请求期间重新构建;这是开发的正确模式,而基准测试的错误模式。
除此之外,服务器时间是普通的后端规范:保持查询索引并尽量减少(第 8 章涵盖 ORM 缓存),并将慢速工作推离请求。对于真正缓慢的响应,chunk() 会逐行流式输出,因此浏览器会逐步渲染,而不是盯着空白页面。对于重复的工作,%app->tasks 会将其完全移出请求。
22.3: 图像
图像决定了大多数真实世界的 LCP 分数,而这仍然是你的责任。捆绑的 img 资源使用 GD 进行调整大小、裁剪和转换,因此请提供缩放后的文件(在显示缩略图的地方使用缩略图),并优先选择 WebP 输出。在标记中,为每个 <img> 提供 width 和 height(或 CSS aspect-ratio),以便在加载时布局不会发生位移,对于折叠下方的图像使用 loading=lazy,并且绝不要懒加载 LCP 图像本身。
静态文件应从 web 服务器发送长期缓存头(Cache-Control: public, immutable,并设置较长的 max-age);生成资产上的 ?version 破坏者使其安全,而在内容更改时更改的图像 URL 对于上传也有同样的效果。
22.4: 导航:没有框架费用的SPA
使用 DOM/link 资源(或您自己脚本中的 app.get()),应用内导航是一个 XHR 返回 apply() 命令:服务器仅发送 DOM 更改,客户端应用这些更改并且 path: 更新 URL。没有完全重新加载,没有重新下载 CSS 和 JS,后退和前进可以立即从历史记录中恢复快照。视图过渡在不增加往返成本的情况下动画化交换。
这就是 Phlo 的零依赖立场在性能和最佳实践审计中直接受益的地方:没有框架包需要下载、解析和执行,也没有第三方来源需要连接。阻塞时间指标(总阻塞时间、交互延迟)保持较低,因为页面上的总 JavaScript 是运行时加上您编写的内容,别无其他。
22.5: 其他三个审计
可访问性在很大程度上依赖于标记,而Phlo将标记直接交给你:没有生成的包装,没有合成的按钮。使用语义元素(<button>、<nav>、<main>),为图像提供有意义的alt文本,标记表单字段,并在主题中保持文本对比度。lang属性会自动从%app->lang设置。
最佳实践要求使用HTTPS,一个合理的控制台和没有过时的API。FrankenPHP的自动HTTPS覆盖了传输;security资源的CSP模式(第12章)覆盖了策略;而引擎的无弃用纪律保持了控制台的整洁。在每次发布的发布构建中检查控制台:资产上的一个孤立404会扣分,并且始终是一个真实的bug。
SEO是第17章:seo资源提供网站地图、robots、规范链接和从你已经定义的props中设置的meta。一个激活了seo并且正确设置了indexable的Phlo应用可以在没有进一步工作的情况下通过此审核。
22.6: 诚实地测量
在生产主机上,在私密窗口中,针对公共 URL 测量发布构建。开发模式会扭曲每一个数字:build: true 可能在请求期间重新构建,debug 会将调试负载附加到响应中,而开发虚拟主机可能缺少生产环境中的压缩和缓存头。Lighthouse 位于 Chrome DevTools 中;PageSpeed Insights 从 Google 的基础设施运行相同的审计,并在您的网站有流量时添加字段数据。
当分数下降时,在更改代码之前阅读 trace:审计会命名资源和毫秒。在正确配置的 Phlo 应用中,通常的嫌疑犯按顺序是:未缩放或非懒加载的图像、路由中的慢查询,以及静态文件上缺失的缓存头。这三者在瀑布图中都是可见的,而它们都不是框架的问题。