本文以 livewire/blaze 的 README 为一手信息进行整理。目前 laravel.com 上还没有 Blaze 的专用文档。
Blaze 是什么
Blaze 是 Livewire 官方公开的 Blade 组件加速包。目标不仅是 Livewire 组件,也包含普通的匿名 Blade 组件。 README 中给出了匿名组件渲染 25,000 次的基准数据:500ms → 13ms(约 97.4% 削减)。按场景分别测试,削减幅度也在 91~97% 之间。三种优化策略
Blaze 提供compile(默认)、memo、fold 三种策略。
该选哪一个
| 策略 | 何时选用 | 优点 | 注意事项 |
|---|---|---|---|
compile | 首选的标准策略 | 兼容性高,无需配置即可加速 | 通用限制需要留意 |
memo | 用相同 props 反复渲染的图标、徽章等 | 可以降低首次之后的重渲染成本 | 带 slot 的组件不能使用 |
fold | 想让静态 UI 达到最高性能时 | 几乎完全去除运行时开销 | 全局状态和动态值处理不当会导致不一致 |
compile 开始,等定位到瓶颈后再对具体地方应用 memo / fold,这样比较安全。
安装与启用
1) 在单个组件上加 @blaze
2) 用 Blaze::optimize() 按目录启用
限制事项
以下是 README 中明确说明的限制:- 不支持基于类的组件
- 无法使用
$component变量 - View composers / creators / lifecycle events 不会触发
- 不支持
View::share()变量的自动注入(如果需要,请显式使用$__env->shared('key')) - 跨越 Blade 和 Blaze 的
@aware有限制(父子两侧都必须在 Blaze 中使用) - 无法通过
view()直接渲染 Blaze 组件(只能通过组件标签)
与 Flux UI 的兼容性
Blaze README 说明,如果你正在使用 Flux UI,只需安装 Blaze,无需其他配置即可开始使用。工作原理概述
普通的 Blade 每次渲染都会经过包含组件解析和属性处理的整套渲染管线。Blaze 的compile 将其编译成优化过的 PHP 函数并直接调用,从而大幅削减管线的开销。
README 中说,概念上有如下差异:
- 普通:每次都执行 Blade 的标准渲染流程
- Blaze
compile:直接调用编译好的函数 - Blaze
fold:在编译期就嵌入 HTML,进一步减少运行时计算
fold 速度最快,但只要有破坏静态化前提的因素(认证状态、依赖请求的值、依赖会话的值、依赖时间的值等),就可能引发问题。请只针对高负载位置使用,并在验证行为的同时分阶段推进。