Nuxt 生命週期

理解 Nuxt 應用程式的生命週期可以幫助你更深入地瞭解框架的運作方式,特別是對於伺服器端和客戶端渲染。

本章的目標是提供一個關於框架不同部分、它們的執行順序以及它們如何協同工作的高階概述。

伺服器

在伺服器端,對於你的應用程式的每個初始請求,會執行以下步驟:

步驟 1:設定 Nitro 伺服器和 Nitro 外掛(一次)

Nuxt 由Nitro一個現代伺服器引擎提供支援。

當 Nitro 啟動時,它會初始化並執行 /server/plugins 目錄下的外掛。這些外掛可以:

  • 捕獲和處理應用程式範圍的錯誤。
  • 註冊在 Nitro 關閉時執行的鉤子。
  • 註冊用於請求生命週期事件的鉤子,例如修改響應。
Nitro 外掛只在伺服器啟動時執行一次。在無伺服器環境中,伺服器會在每個傳入請求時啟動,Nitro 外掛也會如此。但是,它們不會被等待。
欲瞭解更多資訊,請參閱 文件 > 4 X > 指南 > 目錄結構 > Server#server Plugins

步驟 2:Nitro 伺服器中介軟體

初始化 Nitro 伺服器後,server/middleware/ 下的中介軟體會在每個請求中執行。中介軟體可用於身份驗證、日誌記錄或請求轉換等任務。

從中介軟體返回一個值將終止請求並將返回的值作為響應傳送。通常應避免這種行為,以確保正確的請求處理!
欲瞭解更多資訊,請參閱 文件 > 4 X > 指南 > 目錄結構 > Server#server Middleware

步驟 3:初始化 Nuxt 並執行 Nuxt App 外掛

首先建立 Vue 和 Nuxt 例項。之後,Nuxt 執行其伺服器外掛。這包括:

  • 內建外掛,例如 Vue Router 和 unhead
  • app/plugins/ 目錄中的自定義外掛,包括沒有後綴的(例如 myPlugin.ts)和帶有 .server 字尾的(例如 myServerPlugin.server.ts)。

外掛以特定順序執行,並且可能相互依賴。有關更多詳細資訊,包括執行順序和並行性,請參閱外掛文件

在此步驟之後,Nuxt 呼叫 app:created 鉤子,可用於執行額外邏輯。
請在文件 > 4 X > 指南 > 目錄結構 > 外掛中閱讀更多內容。

步驟 4:路由驗證

在初始化外掛和執行中介軟體之前,如果 definePageMeta 函式中定義了 validate 方法,Nuxt 會呼叫該方法。validate 方法可以是同步或非同步的,通常用於驗證動態路由引數。

  • 如果引數有效,validate 函式應返回 true
  • 如果驗證失敗,它應該返回 false 或包含 statusCode 和/或 statusMessage 的物件以終止請求。

有關更多資訊,請參閱路由驗證文件

欲瞭解更多資訊,請參閱 文件 > 4 X > 入門 > 路由#route Validation

步驟 5:執行 Nuxt App 中介軟體

中介軟體允許你在導航到特定路由之前執行程式碼。它通常用於身份驗證、重定向或日誌記錄等任務。

在 Nuxt 中,有三種類型的中介軟體:

  • 全域性路由中介軟體
  • 命名路由中介軟體
  • 匿名(或內聯)路由中介軟體

Nuxt 在初始頁面載入時(在伺服器和客戶端上)執行所有全域性中介軟體,然後在任何客戶端導航之前再次執行。命名和匿名中介軟體僅在相應頁面元件中定義的頁面(路由)元資料的 middleware 屬性中指定的路由上執行。

有關每種型別和示例的詳細資訊,請參閱中介軟體文件

伺服器上的任何重定向都將導致向瀏覽器傳送 Location: 頭;然後瀏覽器會向此新位置發出新的請求。除非持久化到 cookie 中,否則所有應用程式狀態都將在此時重置。

更多資訊請閱讀:文件 > 4 X > 指南 > 目錄結構 > App > Middleware

步驟 6:渲染頁面和元件

在此步驟中,Nuxt 渲染頁面及其元件,並使用 useFetchuseAsyncData 獲取任何所需資料。由於在伺服器上沒有動態更新和 DOM 操作,Vue 生命週期鉤子如 onBeforeMountonMounted 以及後續鉤子在 SSR 期間**不會**執行。

預設情況下,Vue 在 SSR 期間暫停依賴跟蹤以獲得更好的效能。

伺服器端沒有響應性,因為 Vue SSR 將應用程式自上而下地渲染為靜態 HTML,因此無法返回並修改已渲染的內容。
你應該避免在 <script setup> 的根作用域中生成需要清理的副作用程式碼。這種副作用的一個例子是使用 setInterval 設定計時器。在僅限客戶端的程式碼中,我們可能會設定一個計時器,然後在 onBeforeUnmountonUnmounted 中將其清除。然而,由於解除安裝鉤子在 SSR 期間永遠不會被呼叫,計時器將永遠存在。為了避免這種情況,請將副作用程式碼移到 onMounted 中。
觀看 Daniel Roe 解釋伺服器渲染和全域性狀態的影片。

步驟 7:生成 HTML 輸出

獲取所有所需資料並渲染元件後,Nuxt 將渲染的元件與 unhead 中的設定結合起來,生成一個完整的 HTML 文件。然後,此 HTML 以及相關資料會發送回客戶端以完成 SSR 過程。

將 Vue 應用程式渲染為 HTML 後,Nuxt 呼叫 app:rendered 鉤子。
在最終確定和傳送 HTML 之前,Nitro 將呼叫 render:html 鉤子。此鉤子允許你操作生成的 HTML,例如注入額外的指令碼或修改元標籤。

客戶端(瀏覽器)

生命週期的這一部分完全在瀏覽器中執行,無論你選擇哪種 Nuxt 模式。

步驟 1:初始化 Nuxt 並執行 Nuxt App 外掛

此步驟與伺服器端執行類似,包括內建外掛和自定義外掛。

app/plugins/ 目錄中的自定義外掛,例如沒有後綴的(例如 myPlugin.ts)和帶有 .client 字尾的(例如 myClientPlugin.client.ts),在客戶端執行。

在此步驟之後,Nuxt 呼叫 app:created 鉤子,可用於執行額外邏輯。
請在文件 > 4 X > 指南 > 目錄結構 > 外掛中閱讀更多內容。

步驟 2:路由驗證

此步驟與伺服器端執行相同,包括如果 definePageMeta 函式中定義了 validate 方法。

步驟 3:執行 Nuxt App 中介軟體

Nuxt 中介軟體在伺服器和客戶端上執行。如果你希望某些程式碼在特定環境中執行,請考慮使用 import.meta.client 用於客戶端,import.meta.server 用於伺服器來拆分程式碼。

欲瞭解更多資訊,請參閱 文件 > 4 X > 指南 > 目錄結構 > App > Middleware#when Middleware Runs

步驟 4:掛載 Vue 應用程式和水合

呼叫 app.mount('#__nuxt') 將 Vue 應用程式掛載到 DOM。如果應用程式使用 SSR 或 SSG 模式,Vue 會執行水合步驟以使客戶端應用程式具有互動性。在水合期間,Vue 會重新建立應用程式(伺服器元件除外),將每個元件與其相應的 DOM 節點匹配,並附加 DOM 事件監聽器。

為了確保正確的水合,保持伺服器和客戶端之間資料的一致性至關重要。對於 API 請求,建議使用 useAsyncDatauseFetch 或其他 SSR 友好的組合式函式。這些方法確保在水合期間重用伺服器端獲取的資料,避免重複請求。任何新的請求都應僅在水合後觸發,以防止水合錯誤。

在掛載 Vue 應用程式之前,Nuxt 呼叫 app:beforeMount 鉤子。
在掛載 Vue 應用程式之後,Nuxt 呼叫 app:mounted 鉤子。

步驟 5:Vue 生命週期

與伺服器不同,瀏覽器執行完整的Vue 生命週期.