> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Blaze 包介绍

> 介绍如何使用 Livewire 官方的 Blaze 包加速 Blade 组件渲染。涵盖 compile / memo / fold 的选择标准、引入方法、限制事项以及内部工作原理。

<Info>
  本文以 [livewire/blaze](https://github.com/livewire/blaze) 的 README 为一手信息进行整理。目前 laravel.com 上还没有 Blaze 的专用文档。
</Info>

## Blaze 是什么

[Blaze](https://github.com/livewire/blaze) 是 Livewire 官方公开的 Blade 组件加速包。目标不仅是 Livewire 组件,也包含普通的匿名 Blade 组件。

README 中给出了匿名组件渲染 25,000 次的基准数据:**500ms → 13ms**(约 **97.4% 削减**)。按场景分别测试,削减幅度也在 91\~97% 之间。

## 三种优化策略

Blaze 提供 `compile`(默认)、`memo`、`fold` 三种策略。

```mermaid theme={null}
flowchart LR
    A["组件调用"] --> B["compile<br>函数编译"]
    A --> C["memo<br>相同 props 记忆化"]
    A --> D["fold<br>编译期转为 HTML"]
    B --> E["兼容性广,提升明显"]
    C --> F["重复渲染场景效果强"]
    D --> G["性能最高但需谨慎"]
```

### 该选哪一个

| 策略        | 何时选用                  | 优点             | 注意事项               |
| --------- | --------------------- | -------------- | ------------------ |
| `compile` | 首选的标准策略               | 兼容性高,无需配置即可加速  | 通用限制需要留意           |
| `memo`    | 用相同 props 反复渲染的图标、徽章等 | 可以降低首次之后的重渲染成本 | 带 slot 的组件不能使用     |
| `fold`    | 想让静态 UI 达到最高性能时       | 几乎完全去除运行时开销    | 全局状态和动态值处理不当会导致不一致 |

如果拿不准,推荐从 **`compile` 开始**,等定位到瓶颈后再对具体地方应用 `memo` / `fold`,这样比较安全。

## 安装与启用

```bash theme={null}
composer require livewire/blaze:^1.0
```

有两种启用方式。

### 1) 在单个组件上加 `@blaze`

```blade theme={null}
@blaze

<button {{ $attributes }}>
    {{ $slot }}
</button>
```

需要时可切换策略。

```blade theme={null}
@blaze(memo: true)
@blaze(fold: true)
```

### 2) 用 `Blaze::optimize()` 按目录启用

```php theme={null}
use Livewire\Blaze\Blaze;

public function boot(): void
{
    Blaze::optimize()
        ->in(resource_path('views/components'));
}
```

启用后清理已编译视图。

```bash theme={null}
php artisan view:clear
```

<Tip>
  `@blaze` 适合"先试一试"的场景,`Blaze::optimize()` 适合"在生产中广泛应用"的场景。README 中也推荐先从限定的目录开始逐步铺开。
</Tip>

## 限制事项

以下是 README 中明确说明的限制:

* 不支持基于类的组件
* 无法使用 `$component` 变量
* View composers / creators / lifecycle events 不会触发
* 不支持 `View::share()` 变量的自动注入(如果需要,请显式使用 `$__env->shared('key')`)
* 跨越 Blade 和 Blaze 的 `@aware` 有限制(父子两侧都必须在 Blaze 中使用)
* 无法通过 `view()` 直接渲染 Blaze 组件(只能通过组件标签)

## 与 Flux UI 的兼容性

Blaze README 说明,如果你正在使用 [Flux UI](https://fluxui.dev/docs/installation),**只需安装 Blaze,无需其他配置即可开始使用**。

## 工作原理概述

普通的 Blade 每次渲染都会经过包含组件解析和属性处理的整套渲染管线。Blaze 的 `compile` 将其编译成优化过的 PHP 函数并直接调用,从而大幅削减管线的开销。

README 中说,概念上有如下差异:

* 普通:每次都执行 Blade 的标准渲染流程
* Blaze `compile`:直接调用编译好的函数
* Blaze `fold`:在编译期就嵌入 HTML,进一步减少运行时计算

`fold` 速度最快,但只要有破坏静态化前提的因素(认证状态、依赖请求的值、依赖会话的值、依赖时间的值等),就可能引发问题。请只针对高负载位置使用,并在验证行为的同时分阶段推进。


## Related topics

- [Laravel Wayfinder 介绍](/zh/blog/wayfinder-introduction.md)
- [使用 Inertia.js 构建 SPA](/zh/blog/inertia-introduction.md)
- [Laravel Pennant 实战用例](/zh/blog/laravel-pennant.md)
- [Laravel Telescope 实战技巧](/zh/blog/telescope-introduction.md)
- [用 Pest PHP 开始 Laravel 测试](/zh/blog/pest-introduction.md)
