博客 / 詳情

返回

告別 Laravel 緩慢的 Blade!Livewire Blaze 來了,為你的 Laravel 性能提速

你已經優化了查詢,加了緩存層,該做的都做了——但頁面加載時總覺得哪裏不對勁。那種説不清道不明的輕微延遲?問題很可能不在數據庫,而在你的 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 的一個亮點是內置分析器。不用猜哪個組件拖慢了性能,你能直接拿到火焰圖、逐組件耗時和策略分解 —— 開箱即用。

Laravel Blaze Debug

一行代碼開啓:

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 性能提速

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.