本頁包含 Inertia 協定的詳細規格。請務必先閱讀 運作方式 頁面以獲得高階概述。
對 Inertia 應用程式的第一個請求只是一個常規的完整頁面瀏覽器請求,沒有特殊的 Inertia 標頭或資料。對於這些請求,伺服器會返回完整的 HTML 文件。
此 HTML 回應包含網站資源 (CSS、JavaScript),以及頁面主體中的根 <div>
。根 <div>
作為客戶端應用程式的掛載點,並包含一個 data-page
屬性,其中包含初始頁面的 JSON 編碼 頁面物件。Inertia 使用此資訊來啟動您的客戶端框架並顯示初始頁面組件。
<html>
<head>
<title>My app</title>
<link href="/css/app.css" rel="stylesheet">
<script src="/js/app.js" defer></script>
</head>
<body>
<div id="app" data-page='{"component":"Event","props":{"event":{"id":80,"title":"Birthday party","start_date":"2019-06-02","description":"Come out and celebrate Jonathan's 36th birthday party!"}},"url":"/events/80","version":"c32b8e4965f418ad16eaebba1d4e960f"}'></div>
</body>
</html>
一旦 Inertia 應用程式啟動後,對網站的所有後續請求都會透過 XHR 發出,並帶有 X-Inertia
標頭設定為 true
。此標頭表示請求是由 Inertia 發出,而不是標準的完整頁面瀏覽。
當伺服器偵測到 X-Inertia
標頭時,它會返回帶有編碼 頁面物件 的 JSON 回應,而不是回應完整的 HTML 文件。
{
"component": "Event",
"props": {
"event": {
"id": 80,
"title": "Birthday party",
"start_date": "2019-06-02",
"description": "Come out and celebrate Jonathan's 36th birthday party!"
}
},
"url": "/events/80",
"version": "c32b8e4965f418ad16eaebba1d4e960f"
}
Inertia 透過頁面物件在伺服器和客戶端之間共享資料。此物件包含渲染頁面組件、更新瀏覽器歷史狀態以及追蹤網站資源版本所需的資訊。頁面物件包含以下四個屬性
在標準的完整頁面訪問中,頁面物件會以 JSON 編碼到根 <div>
中的 data-page
屬性中。在 Inertia 訪問中,頁面物件會作為 JSON 酬載返回。
單頁應用程式的一個常見挑戰是,當網站資源變更時重新整理這些資源。Inertia 透過可選地追蹤網站資源的當前版本,讓這個過程變得容易。如果資源發生變更,Inertia 將會自動進行完整頁面訪問,而不是 XHR 訪問。
Inertia 頁面物件包含 version
識別符。此版本識別符是在伺服器端設定,可以是數字、字串、檔案雜湊或任何其他代表網站資源目前「版本」的值,只要當網站資源更新時,該值就會變更。
每當發出 Inertia 請求時,Inertia 都會在 X-Inertia-Version
標頭中包含目前的資源版本。當伺服器收到請求時,它會比較 X-Inertia-Version
標頭中提供的資源版本與目前的資源版本。這通常會在伺服器端框架的中介層處理。
如果資源版本相同,則請求會照常繼續。但是,如果資源版本不同,則伺服器會立即返回 409 Conflict
回應,並在 X-Inertia-Location
標頭中包含 URL。此標頭是必要的,因為可能已發生伺服器端重新導向。這會告訴 Inertia 最終的目標 URL 是什麼。
請注意,409 Conflict
回應僅針對 GET
請求發送,而不是針對 POST/PUT/PATCH/DELETE
請求發送。也就是說,如果其中一個請求後發生 GET
重新導向,則會發送這些回應。
如果當發生 409 Conflict
回應時存在「flash」會話資料,則 Inertia 的伺服器端框架轉接器會自動重新 flash 此資料。
當發出 Inertia 請求時,部分重新載入選項可讓您在後續訪問相同頁面組件時,從伺服器請求 props (資料) 的子集。如果某些頁面資料可以過時,這會是一個有用的效能最佳化。
當發出部分重新載入請求時,Inertia 會在請求中包含兩個額外的標頭 X-Inertia-Partial-Data
和 X-Inertia-Partial-Component
。
X-Inertia-Partial-Data
標頭是一個以逗號分隔的清單,其中包含應該返回的所需 props (資料) 鍵。
X-Inertia-Partial-Component
標頭包含正在部分重新載入的組件名稱。這是必要的,因為部分重新載入僅適用於對相同頁面組件發出的請求。如果最終目的地因故不同 (例如,使用者已登出,現在位於登入頁面),則不會發生部分重新載入。
{
"component": "Events",
"props": {
"auth": {...}, // NOT included
"categories": [...], // NOT included
"events": [...] // included
},
"url": "/events/80",
"version": "c32b8e4965f418ad16eaebba1d4e960f"
}