協定

本頁包含 Inertia 協定的詳細規格。請務必先閱讀 運作方式 頁面以獲得高階概述。

HTML 回應

對 Inertia 應用程式的第一個請求只是一個常規的完整頁面瀏覽器請求,沒有特殊的 Inertia 標頭或資料。對於這些請求,伺服器會返回完整的 HTML 文件。

此 HTML 回應包含網站資源 (CSS、JavaScript),以及頁面主體中的根 <div>。根 <div> 作為客戶端應用程式的掛載點,並包含一個 data-page 屬性,其中包含初始頁面的 JSON 編碼 頁面物件。Inertia 使用此資訊來啟動您的客戶端框架並顯示初始頁面組件。

請求
GET: http://example.com/events/80
Accept: text/html, application/xhtml+xml
回應
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
<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&apos;s 36th birthday party!"}},"url":"/events/80","version":"c32b8e4965f418ad16eaebba1d4e960f"}'></div>

</body>
</html>
雖然初始回應是 HTML,但 Inertia 不會伺服器端渲染 JavaScript 頁面組件。

Inertia 回應

一旦 Inertia 應用程式啟動後,對網站的所有後續請求都會透過 XHR 發出,並帶有 X-Inertia 標頭設定為 true。此標頭表示請求是由 Inertia 發出,而不是標準的完整頁面瀏覽。

當伺服器偵測到 X-Inertia 標頭時,它會返回帶有編碼 頁面物件 的 JSON 回應,而不是回應完整的 HTML 文件。

請求
GET: http://example.com/events/80
Accept: text/html, application/xhtml+xml
X-Requested-With: XMLHttpRequest
X-Inertia: true
X-Inertia-Version: 6b16b94d7c51cbe5b1fa42aac98241d5
回應
HTTP/1.1 200 OK
Content-Type: application/json
Vary: X-Inertia
X-Inertia: true
{
  "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 透過頁面物件在伺服器和客戶端之間共享資料。此物件包含渲染頁面組件、更新瀏覽器歷史狀態以及追蹤網站資源版本所需的資訊。頁面物件包含以下四個屬性

  1. component: JavaScript 頁面組件的名稱。
  2. props: 頁面 props (資料)。
  3. url: 頁面 URL。
  4. version: 目前的資源版本。

在標準的完整頁面訪問中,頁面物件會以 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 此資料。

請求
GET: http://example.com/events/80
Accept: text/html, application/xhtml+xml
X-Requested-With: XMLHttpRequest
X-Inertia: true
X-Inertia-Version: 6b16b94d7c51cbe5b1fa42aac98241d5
回應
409: Conflict
X-Inertia-Location: http://example.com/events/80

部分重新載入

當發出 Inertia 請求時,部分重新載入選項可讓您在後續訪問相同頁面組件時,從伺服器請求 props (資料) 的子集。如果某些頁面資料可以過時,這會是一個有用的效能最佳化。

當發出部分重新載入請求時,Inertia 會在請求中包含兩個額外的標頭 X-Inertia-Partial-DataX-Inertia-Partial-Component

X-Inertia-Partial-Data 標頭是一個以逗號分隔的清單,其中包含應該返回的所需 props (資料) 鍵。

X-Inertia-Partial-Component 標頭包含正在部分重新載入的組件名稱。這是必要的,因為部分重新載入僅適用於對相同頁面組件發出的請求。如果最終目的地因故不同 (例如,使用者已登出,現在位於登入頁面),則不會發生部分重新載入。

請求
GET: http://example.com/events
Accept: text/html, application/xhtml+xml
X-Requested-With: XMLHttpRequest
X-Inertia: true
X-Inertia-Version: 6b16b94d7c51cbe5b1fa42aac98241d5
X-Inertia-Partial-Data: events
X-Inertia-Partial-Component: Events
回應
HTTP/1.1 200 OK
Content-Type: application/json
{
  "component": "Events",
  "props": {
    "auth": {...},       // NOT included
    "categories": [...], // NOT included
    "events": [...]      // included
  },
  "url": "/events/80",
  "version": "c32b8e4965f418ad16eaebba1d4e960f"
}