你已經優化了查詢,加了緩存層,該做的都做了——但頁面加載時總覺得哪裏不對勁。那種説不清道不明的輕微延遲?問題很可能不在數據庫,而在你的 Blade 組件。
好消息是:Livewire 團隊剛剛發佈了 Laravel 社區期待已久的解決方案 —— Blaze。
Blaze 是什麼?
Blaze 是一個 Laravel 包,目標明確:通過編譯時優化讓 Blade 組件渲染速度大幅提升。它不再在每次請求時都重新評估靜態組件,而是在編譯階段就預渲染好 —— 等用户訪問頁面時,繁重的計算工作早已完成。
他們用數據證明了這一點:
渲染 25,000 個可摺疊按鈕組件:
- 未使用 Blaze:████████████████████████████████████████ 750ms
- 使用 Blaze:██ 45ms
約 17 倍更快。這不是筆誤。
Blade 為什麼會變慢?
每次你調用 <x-button>、<x-card> 或任何 Blade 組件,Laravel 都要走一遍流程:解析模板、評估屬性、執行 PHP 邏輯、輸出 HTML。做一兩次沒問題。但想象一下,一個儀表盤頁面有幾百行表格數據、一個帶 80 個選項的多選下拉框、或者每個卡片上都散佈着圖標 —— 這些組件每次請求都要從頭處理一遍。
這正是 Blaze 要消除的開銷。
安裝 —— 兩分鐘上手
開始只需要一條命令:
composer require livewire/blaze:^1.0
Blaze 的工作原理 —— 三級優化策略
Blaze 沒有采用一刀切的方案,而是提供了三種不同的優化策略,你可以根據需要選擇。
優化編譯器(默認)
這是基礎策略。Blaze 用一個更高效的編譯器替換 Blade 默認的編譯器,把你的模板編譯成更精簡的 PHP 函數。不需要額外配置 —— 裝完就能受益。根據文檔,僅這一項就能為符合條件的組件減少高達 97% 的渲染開銷。
記憶化(可選)
適合那些用相同屬性反覆出現的組件 —— 比如圖標、頭像縮略圖、狀態徽章或標籤碎片。Blaze 第一次渲染時緩存輸出結果,之後每次用相同屬性調用時都直接複用。不用重新渲染,不用重複計算。
編譯時摺疊(可選)
這是最強力的策略。不是在運行時渲染,Blaze 在 Blade 編譯階段就把組件預渲染成純靜態 HTML。等應用真正運行時,這些組件在某種意義上已經"不存在"了 —— 它們早已被解析完畢。零運行時成本。
@blaze 指令 —— 比你想象的簡單
要在組件上啓用優化,只需在模板文件頂部加上 @blaze:
{{-- resources/views/components/button.blade.php --}}
@blaze
@props(['variant' => 'primary'])
<button type="button" class="btn btn-{{ $variant }}">
{{ $slot }}
</button>
如果你想精細控制啓用哪些策略:
{{-- 啓用全部(等同於只寫 @blaze) --}}
@blaze(fold: true, memo: true, aware: true)
{{-- 跳過摺疊,但保留記憶化 --}}
@blaze(fold: false, memo: true, aware: false)
想一次性優化整個目錄而不動單個文件?也可以:
Blaze::optimize()
->in(resource_path('views/components/app'))
->in(resource_path('views/components/admin'));
什麼時候該用 @blaze?
這是真正關鍵的部分。不是所有組件都適合加 @blaze —— 用錯了地方可能導致難以追蹤的隱蔽 Bug。
Blaze 提供了一個簡單的判斷標準。問自己這幾個問題:
- 對每個用户渲染結果都一樣嗎?(不用
auth(),不用按用户區分的數據) - 每次請求渲染結果都一樣嗎?(不用 CSRF 令牌,不用
request()->is()) - 任何時間點渲染結果都一樣嗎?(不用
now(),不用相對時間戳) - 只使用你顯式傳入的屬性嗎?(不用 session 數據,不查數據庫)
- 它渲染的所有子組件也滿足上述條件嗎?
全部符合 → 加 @blaze。有任何一條不符合 → 跳過。
一個簡單的判斷思路:如果你能把組件丟進設計系統或 Storybook 裏、不需要任何應用上下文就能正確渲染,那它就是合適的候選。按鈕、卡片、徽章、圖標、佈局網格 —— 這些是最佳場景。
以下情況絕對不要用 @blaze:
{{-- ❌ CSRF 令牌每次請求都變 --}}
<form method="POST">
@csrf
<button type="submit">Submit</button>
</form>
{{-- ❌ 認證狀態是用户特定的 --}}
@auth
<p>Welcome back!</p>
@endauth
{{-- ❌ Session 數據是動態的 --}}
<div>Hello, {{ session('username') }}</div>
{{-- ❌ 激活鏈接狀態依賴請求 --}}
@props(['href'])
<a href="{{ $href }}" @class(['active' => request()->is($href)])>
{{ $slot }}
</a>
聰明的逃生艙:@unblaze
你可能會遇到這種場景:一個表單輸入組件幾乎完全是靜態的 —— 唯獨需要顯示驗證錯誤信息。這些錯誤來自請求,意味着整個組件沒法摺疊,對吧?
這就是 @unblaze 的用武之地。你可以在靜態組件裏"打洞",讓特定區塊保持運行時評估,同時保留周圍所有標記的優化:
{{-- ✅ 表單輸入配合 @unblaze 處理錯誤信息 --}}
@blaze
@props(['name', 'label'])
<div>
<label>{{ $label }}</label>
<input type="text" name="{{ $name }}">
@unblaze
@if($errors->has($name))
<span class="text-red-500">{{ $errors->first($name) }}</span>
@endif
@endunblaze
</div>
底層實現上:<div>、<label> 和 <input> 在編譯時被摺疊成靜態 HTML。@unblaze 區塊保持動態。魚與熊掌 —— 優化和功能兼得。
需要把組件屬性傳進 @unblaze 區塊?用 scope 參數:
@blaze
@props(['userId', 'showStatus' => true])
<div>
{{-- 這裏是一大段靜態標記 --}}
@unblaze(scope: ['userId' => $userId, 'showStatus' => $showStatus])
@if($scope['showStatus'])
<div>User #{{ $scope['userId'] }} - Last seen: {{ session('last_seen') }}</div>
@endif
@endunblaze
</div>
你也可以在一個組件裏放多個 @unblaze 區塊 —— 每個都創建一個獨立的動態區域,其餘部分保持摺疊。
內置分析器 —— 快速定位瓶頸
Blaze 的一個亮點是內置分析器。不用猜哪個組件拖慢了性能,你能直接拿到火焰圖、逐組件耗時和策略分解 —— 開箱即用。

一行代碼開啓:
Blaze::debug();
這在給應用做優化前後審計時特別有用,或者當你想知道為什麼某個特定組件沒有被摺疊時。
Flux 用户的福音
如果你已經在用 Flux(Livewire 團隊出品的 UI 組件庫),這基本就是白撿的優化。所有符合條件的 Flux 組件已經標註了 @blaze —— 所以你一裝上 Blaze,一切就自動開始工作,無需額外配置。
實際的性能預期
那個 17 倍的基準測試是真實的,但要説明背景:那是用 25,000 個完全相同的可摺疊組件一次性渲染測出來的。真實應用裏,你不太可能遇到這種場景。
根據官方文檔,更現實的預期是:
- 普通頁面(幾百個組件):提升 10–30ms
- 組件密集型頁面(數據表格、大型下拉框、重複的卡片網格):提升 50–100ms 以上
聽起來可能不誇張,但如果你當前渲染時間是 300ms,降到 240ms,那就是 20% 的提升 —— 乘以每天每個用户的每次請求,累積起來很可觀。
小結
Blaze 不是萬能藥 —— 它也沒想做成萬能藥。它是一個專注、設計精良的工具,解決了很多 Laravel 應用在成長過程中默默遇到的特定問題。
它值得嘗試的地方在於:對你的要求極低。不用重寫模板,不用大規模重構,不用配置負擔。如果某個組件無法優化,Blaze 會優雅地回退到正常渲染並繼續。它只管幹活。
如果你在用 Laravel 構建有大量可複用 UI 組件的應用 —— 尤其是什麼設計系統之類的東西 —— Blaze 今天就可以加入你的工具箱。
告別 Laravel 緩慢的 Blade!Livewire Blaze 來了,為你的 Laravel 性能提速