通过 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>你好世界</acme-button>,Nuxt/Vue 实际生成和使用的代码将是 <LitWrapper><acme-button>你好世界</acme-button></LitWrapper>

服务器端的 LitWrapper 组件 使用 @lit-labs/ssrLitElementRenderer 来渲染带有 声明式 Shadow DOM 的包装 Lit 元素。 这使得 Lit 组件在浏览器上正确渲染,而无需加载和执行 JS,并在服务器 HTML 解析后立即渲染。

客户端的 LitWrapper 组件 不执行任何操作,并让正常的客户端水合发生。

注意事项

Lit 组件在 Node 端通过应用 微型 DOM shim 到 Node 进行 SSR。并非所有 DOM API 都可用。例如,获取分配的插槽或子节点、调度自定义事件、在 在服务器端调用的生命周期钩子 上添加事件侦听器将不起作用。在服务器运行的代码上避免此类客户端活动将使您受益匪浅。

另请查看 @lit-labs/ssr库状态 以获取更多信息。