透過 100 多個訣竅學習 Nuxt!

nuxt-ssr-lit

Lit Element 元件的伺服器端渲染

nuxt-ssr-lit

用於 Lit 自訂元素的 Nuxt3 模組,提供伺服器端渲染和客戶端注水。

🚀 使用方式

注意:此模組適用於 Nuxt3。 請參閱此問題 關於 Nuxt2 支援。我們正在尋求協助以完成此模組。

安裝

安裝 nuxt-ssr-lit

npx nuxi@latest module add ssr-lit

將以下程式碼新增至 nuxt.config.js 的模組區段。

import { defineNuxtConfig } from "nuxt";

export default defineNuxtConfig({
  modules: [
    ["nuxt-ssr-lit", { litElementPrefix: ["acme-"] }]
    // ...
  ]
});

就這樣!現在所有以 acme- 為字首的 Lit 元素都將進行伺服器端渲染。專案中若有任何其他自訂元素,則會進行客戶端渲染。

👨‍💻 開發

  • 執行 npm run dev:prepare 以產生類型定義。
  • 使用 npm run dev 在開發模式下啟動 playground

常見問題

TypeError: customElements.get(...) is not a constructor

當 Lit 元素未正確註冊時,就會發生此錯誤。這可能是因為元素未正確設定,或者可能是由於元素具有副作用。您也可能只在生產模式下看到此錯誤。

若要修正此問題,您的自訂元素函式庫可以在 nuxt.config.js 檔案中註冊。

export default defineNuxtConfig({
  ...
  nitro: {
    moduleSideEffects: ["my-custom-element-library"]
  }
});

運作方式?

Nuxt 專案中所有使用模組選項中提供的前綴的 Lit 元素,都會以名為 LitWrapper 的 Vue 元件包裝。

這種自動包裝是透過名為 AutoLitWrapper 的 Vite 外掛程式完成的,因此發生在建置時期。預設情況下,此外掛程式僅對 Vue 檔案進行操作,這有助於透過避免不必要的處理來最佳化效能。

因此,如果其中一個元件中使用了 Lit 元素。例如 <acme-button>Hello world</acme-button>,實際由 Nuxt/Vue 產生和使用的程式碼將會是 <LitWrapper><acme-button>Hello world</acme-button></LitWrapper>

伺服器端的 LitWrapper 元件 使用 @lit-labs/ssrLitElementRenderer,以 宣告式陰影 DOM 渲染包裝後的 Lit 元素。這使得 Lit 元件可以在瀏覽器上正確渲染,而無需載入和執行 JS,並在伺服器 HTML 解析後立即渲染。

客戶端上的 LitWrapper 元件 不執行任何操作,並讓正常的客戶端注水發生。

注意事項

Lit 元件在 Node 端透過應用於 Node 的 微型 DOM 墊片 進行伺服器端渲染。並非所有 DOM API 都可用。例如,取得指定的插槽或子元素、發送自訂事件、在 伺服器端呼叫的生命週期鉤子 上新增事件監聽器將無法運作。在伺服器端執行的程式碼上避免此類客戶端活動將會很有幫助。

此外,請查看 @lit-labs/ssr函式庫狀態 以取得更多資訊。