Skip to content

SSR / Nuxt 注意事项

@luxeanor/ui 全部组件遵循 SSR 安全纪律,可直接用于 Nuxt 3 / VitePress 等服务端渲染环境(本文档站本身就是 SSG 构建的)。

库内部的纪律(你可以依赖的保证)

  • 浏览器 API 只出现在 onMounted / 事件回调 / watch——模块顶层与 setup 同步段不触碰 window/document/localStorage
  • 浮层组件(Modal / Drawer / Dropdown / Select / Tooltip / Toast / Confirm) 使用 Teleport 挂到 body,并以 mounted 守卫(v-if="mounted")确保服务端不渲染浮层内容,避免注水不匹配
  • useTheme 在 SSR 下返回默认值、不读写 DOM 与存储

消费端要注意的

1. 主题属性的服务端一致性

服务端输出的 HTML 没有 data-theme/data-mode 时,首帧会闪默认主题。两种处理:

  • 固定主题:直接在服务端模板/htmlAttrs 写死属性(如 useHead({ htmlAttrs: { 'data-theme': 'ink', 'data-mode': 'light' } })
  • 跟随用户偏好:内联 themeBootScript<head>,CSS 解析前落属性

2. 引入方式

场景方式额外配置
普通项目 npm i @luxeanor/uidist 产物(ESM + d.ts)
monorepo workspace:* 引用源码直接吃 .vue/.ts 源码Nuxt 需 build.transpile: ['@luxeanor/ui']

3. 客户端专属逻辑

你的业务代码若配合 useMouseVarsuseReveal 等做视觉增强,注意它们依赖 IntersectionObserver/指针事件——库内已做环境守卫,SSR 下是空操作,无需你包 <ClientOnly>。真正需要 <ClientOnly> 的只有首帧状态依赖 localStorage 的组件(如 LxThemeSwitcher 挂在会被服务端渲染的位置时)。