探索 Astro:為內容驅動的網站而生
1. 我們真的需要那麼多 JavaScript 嗎?
React、Vue、Svelte 等現代前端框架大幅提升了建構複雜 Web 應用程式的開發體驗。但當我們將它們用於建構部落格、作品集、文件或行銷網站時,一個問題也隨之而來:這些以內容呈現為主的網站,真的需要將整個頁面作為單頁應用程式(SPA)來載入嗎?
答案通常是「否」。對於這類網站,使用者的核心需求是快速取得內容,過多的 JavaScript 反而會拖慢頁面的可互動時間(TTI),影響使用者體驗和 SEO。
Astro 正是為了解決這個問題而誕生的。
2. Astro 的核心理念:內容優先,預設零 JS
Astro 是一個現代化的靜態網站產生器(SSG),它的核心理念是內容優先。它旨在盡可能將更多工作放在建置時完成,向瀏覽器傳送盡可能少的 JavaScript。
為了實現這一點,Astro 提出了兩大創新:
- 預設零 JavaScript(Zero-JS by Default):Astro 會將你的所有 UI 元件(無論使用 React、Vue 還是 Svelte 編寫)在建置時算繪成純粹的 HTML。如此一來,瀏覽器收到的就是靜態頁面,無須載入任何框架的 JS 執行環境,載入速度極快。
- 島嶼架構(Islands Architecture):這是 Astro 的精髓所在。在一個由靜態 HTML 構成的「海洋」中,任何需要用戶端互動的元件都可以被標記為一座「島嶼」。Astro 會獨立為這些島嶼打包並載入所需的 JavaScript,而頁面的其餘部分則保持純靜態。
3. 「島嶼」是如何運作的?
在 Astro 中,你可以透過加入 client:* 指令,將一個元件標記為互動式島嶼。
例如,我們有一個用 React 編寫的計數器元件 Counter.jsx。在 Astro 頁面中可以這樣使用它:
---
// src/pages/index.astro
import Counter from '../components/Counter.jsx';
---
<html>
<body>
<h1>Astro 示例</h1>
<p>这是一个静态的段落,它不会加载任何 JS。</p>
{/* 这个组件是一个交互式岛屿 */}
<Counter client:load />
<p>这是另一个静态段落。</p>
</body>
</html>client:load 指令告訴 Astro:
- 在伺服器端算繪
Counter元件的初始 HTML。 - 為
Counter元件建立一個獨立的 JS 套件。 - 在頁面載入時,自動載入這個 JS 套件並「啟用」(hydrate)該元件,使其具備互動性。
Astro 還提供了更精細的載入指令,例如 client:idle(瀏覽器閒置時載入)和 client:visible(元件進入視窗時載入),讓效能最佳化更進一步。
4. 框架無關性
Astro 的另一大魅力在於它對 UI 框架的包容性。你可以在同一個 Astro 專案中,同時使用來自 React、Vue、Svelte、SolidJS、Lit 等不同框架的元件。這為團隊協作和技術選型提供了極大的彈性。
結論
Astro 並非要取代 React 或 Vue,而是為特定情境提供了更好的解法。如果你的專案是一個以內容為核心、對效能和 SEO 有極高要求的網站(例如這個部落格本身就是使用 Astro 建構的!),那麼 Astro 無疑是一個值得深入探索的絕佳選擇。它將靜態網站的效能優勢與現代框架的開發體驗完美地結合在一起。