初始化 shadcn-docs-nuxt 组件库文档
以"最小可用 + 快速稳定"为目标,给任意项目建立可长期维护的 shadcn-docs-nuxt 文档站。
本技能拆分为三层:
- SKILL.md — 导航与流程
- references/ — 排错手册与配置说明
- templates/ — 可直接复制的代码模板(含完整注释,注释即文档)
执行时按流程推进,遇到配置细节查 reference,需要代码直接读 template。
模板文件索引(templates/)
代码模板包含完整的注释说明,注释中记录了每个配置项的根因、不配置的后果、以及历史事故。使用时直接读取模板文件,不要跳过注释。
| 模板文件 | 对应文档站文件 | 说明 |
| ------------------------------------------------------------------------ | ------------------------- | -------------------------------- |
| templates/nuxt.config.minimal.ts | nuxt.config.ts | 最小启动骨架 |
| templates/nuxt.config.full.ts | nuxt.config.ts | 生产基线(默认保留 Nitro trace) |
| templates/app.config.ts | app.config.ts | 站点元信息与 UI 配置 |
| templates/tailwind.config.js | tailwind.config.js | 完整 Tailwind + shadcn-vue 主题 |
| templates/assets/css/tailwind.css | assets/css/tailwind.css | CSS 入口 + 亮/暗主题变量 |
| templates/assets/css/main.css | assets/css/main.css | 自定义样式示例 |
| templates/shims/debug.ts | shims/debug.ts | debug ESM 兼容 shim |
| templates/workspace-aliases.ts | workspace-aliases.ts | 组件库源码别名函数 |
| templates/plugins/ui-lib.ts | plugins/xxx.ts | Nuxt Plugin 注册模式 |
| templates/package.json | package.json | 依赖与脚本基线 |
| templates/prettierrc.json | .prettierrc | MDC 防护(兜底方案) |
| templates/prettierignore | .prettierignore | MDC 防护(主方案) |
参考文档索引(references/)
| 文件 | 内容 |
| ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| references/nuxt-config.md | 按需补丁策略、禁改项清单 |
| references/compat.md | ESM/CJS 兼容速查表、排查顺序、常见误判表 |
| references/tailwind-css.md | content 扫描规则、CSS 变量格式、常见样式问题排查 |
| references/mdc-prettier.md | MDC 标准语法、5 种错误写法对照、hydration mismatch 因果链 |
| references/windows.md | 构建假卡死、子进程链清理、EPERM 文件锁、单进程复现法 |
| references/workspace.md | 别名顺序陷阱、依赖矩阵、plugin 注册、i18n 单语、OG Image、目录结构 |
| references/incident-repair.md | Nuxt Content/H3 版本漂移、prerender 钩子历史与构建故障分层排查 |
| references/dependency-triage.md | 依赖提升层排查、packageExtensions/overrides/patch 决策、optimizeDeps 盲区、fork 治理、平台二进制追踪 |
| references/ssr-hydration.md | 水合诊断工具链、非 SSR-safe 包隔离手法、hoisted 组件解析陷阱、HTTP 200 假象、SSR 验收清单 |
| references/production-graph-and-runtime-closure.md | production graph、final Nitro OOM、standalone MODULE_NOT_FOUND、Turbo cache 与 artifact 验收 |
| references/README.md | 九份现行参考的信号导航与迁移台账 |
核心原则(6 条铁律)
- 保持精简:
nuxt.config.ts和app.config.ts先最小化,不先堆功能。 - 先跑通再美化:优先确保
dev/build稳定,再做样式和内容扩展。 - 先修运行链再修样式:交互异常(暗黑模式、侧边栏折叠失效)先查 hydration 和模块导入报错,不要先改 CSS。
- 避免错误扩展:不要第一时间折腾 i18n / icon 自定义方案,先使用模板默认可用路径。
- 内容语法严格:MDC 容器语法要标准化,参见
references/mdc-prettier.md。 - 生产闭包先证据后配置:Vercel
READY只代表部署编排完成,不代表 Function runtime 可用;必须把部署包 manifest、最终 artifact、远端请求和运行日志串成证据链。
历史事故强约束(22 条记忆)
执行本技能时,必须默认带着这些"已发生过"的事故记忆:
- 不要假设 workspace 组件库已经先构建完成;文档站需要能直接从源码启动。→ 见
references/workspace.md - 不要把交互失效先归因到样式;先排除 hydration 被模块导入错误打断。→ 见
references/compat.md - 不要让 prettier 改写
content/**/\*.md的 MDC 结构。→ 见references/mdc-prettier.md - 不要在 Windows 下把"日志停住"直接判定为"进程卡死",先排查残留子进程。→ 见
references/windows.md - 不要一开始就重写 i18n / icon 体系;先拿模板默认链路跑通。→ 见
references/nuxt-config.md - 不要直接启用
ogImage模块;会触发vue.runtime.mjs does not provide an export named toValue的 500 错误。→ 见references/nuxt-config.md - 核心运行时包要按兼容矩阵固定:至少同时审查
shadcn-docs-nuxt、@ztl-uwu/nuxt-content、nuxt、h3,不能只看主题的传递依赖范围。 prerender:routes不是无条件禁用项,而是历史 workaround:它曾用于缓解 Windows 构建长尾,但对 document-driven Nuxt Content 会导致内容数据库为空;只有确认项目不依赖 Content prerender 且完成等价验证时才可讨论。→ 见references/incident-repair.md- final Nitro OOM 与 standalone
MODULE_NOT_FOUND必须回到首个失败门:前者需要测量堆与产物阶段,后者需要区分 Vite SSR transform、Nitro inline、trace 与 manifest,不能用宽配置掩盖。→ 见references/production-graph-and-runtime-closure.md - Turbo cache 命中不等于 runtime closure 可信:只有诊断 cache 可信度或 cache/artifact 证据冲突时,才执行
turbo run <task> --force;常规生产验收不执行该命令,但必须启动.outputserver 并完成 HTTP smoke。→ 见references/production-graph-and-runtime-closure.md nuxt-og-image也属于 Nuxt 世代边界:Nuxt 3 保守基线必须将nuxt-og-image固定为5.1.9;5.1.10+可能解析 Nuxt 4 的@nuxt/kit/H3 v2。仅固定h3: 1.15.11不足以约束这个传递模块,必须在根package.json使用pnpm.overrides,并用pnpm why nuxt-og-image @nuxt/kit h3复核实际树。→ 见references/incident-repair.md- Vercel
READY不等于 runtime 通过:READY 后必须请求部署 URL 的页面与 Content cache/search API,并读取 Function runtime 日志;没有 HTTP/日志证据时只能标记candidate或needs_check,不能写“生产通过”。→ 见references/production-graph-and-runtime-closure.md - 修改前后保护 dirty tree:先记录
git status --short --untracked-files=all与目标 diff;禁止在时间压力下无授权git add .、覆盖、reset 或把用户脏改动混入验证/提交。→ 见references/production-graph-and-runtime-closure.md - 构建工具 override 必须按包和 registry 证据收窄:
tsdown@0.3.1>rolldown仅用于复现rolldown@nightlyregistry 解析阻断;禁止用 root 全局rolldownoverride 掩盖 peer/API 不兼容,必须先检查pnpm why/list、manifest、lockfile 与 clean fresh install。→ 见references/production-graph-and-runtime-closure.md - 依赖提升层污染(2026-09-05 ai-vue-doc 实证):monorepo 中任一包引入新版传递依赖(如 h3 v2)会翻转 pnpm 提升层,所有「未声明该依赖却裸导入」的包同时中招;
pnpm why显示单版本 ≠ 运行时单实例。修复用packageExtensions逐包注入,禁用全局 override。→ 见references/dependency-triage.md - optimizeDeps 预构建盲区(2026-09-05 实证):
.client插件导入与插件内动态导入的包不在扫描入口,CJS 传递依赖无 interop → 整站不水合且 console 常无错。修复用vite.optimizeDeps.include显式纳入(嵌套>语法)。→ 见references/dependency-triage.md - HTTP 200 ≠ 内容正常(catch-all 假象):
pages/[...slug].vue会把 404 UI 以 200 返回;验证必须断言<title>或正文内容。→ 见references/ssr-hydration.md - 模块执行失败不一定走 console(水合诊断工具链):判定水合用
__vue_app__;抓真实错误用动态import(entry + '?v=diag');定位导入链用 CDPNetwork.requestWillBeSent的initiator.url;Chrome 152 自动启动失败时走手动 CDP 降级路径。→ 见references/ssr-hydration.md - 客户端/服务端组件注册不对称(hoisted 解析陷阱):Vue 把组件解析 hoist 到 render 开头,
v-if为假也执行;client-only 注册的组件被 SSR 引用必警告,静态 import 修复会把非 SSR-safe 包拉进 SSR 图致 500,标准解法是defineAsyncComponent。→ 见references/ssr-hydration.md - fork 包改名的硬编码自引用残留(2026-09-05 实证):fork 的 dist 内可能硬编码旧包名前缀的
optimizeDeps.include条目,vite 必然解析失败;用pnpm patch修正前缀(先确认依赖链物理完整)。引入 fork 后先 grep 其 dist 自引用字符串。→ 见references/dependency-triage.md - 非 SSR-safe 包的隔离与 UI 配置陷阱:非 SSR-safe 包(顶层 DOM API、dist 内 CSS 导入)一律走
.client边界;UI 配置(logo 等)修改必须过桌面视口浏览器验收,源码v-if分支推断不可靠。→ 见references/ssr-hydration.md - 构建期平台二进制警告先验证再定性,且禁用 traceInclude:
sharp binaries cannot be found不一定是缺依赖——nitrotrace: false下追踪目录必然为空;先验证 sharp 可加载性再定性。任何平台都勿配置traceInclude: ["sharp"](Vercel linux 生产实机证伪:nft emitDependency 对 resolve 出的伪路径抛硬错误,构建失败)。→ 见references/dependency-triage.md
故障检修入口(命中信号后必须执行)
当出现 Content cache/search API 500、ERR_INVALID_URL、H3 sendError 导出缺失、
entities/decode 或 @vueuse/core 缺包、registerMessageResolver、Nitro prerender 失败、
page._id 为空、Windows 构建长时间无输出等信号时,先读取
references/incident-repair.md,再修改配置或内容。
出现依赖解析类信号——Failed to resolve dependency、整批包同时报同一依赖的导出缺失、
sharp binaries ... cannot be found、fork 包升级后批量 WARN、pnpm why 与实际行为矛盾——
先读取 references/dependency-triage.md。
出现 SSR/水合类信号——页面 200 但交互全死、console 干净却不水合、
Failed to resolve component: X、SSR 渲染非 SSR-safe 包致 500、
暗黑模式/侧栏失效且组件注册在 .client 插件——先读取
references/ssr-hydration.md。
出现 final Nitro OOM、standalone MODULE_NOT_FOUND、production graph 被 alias 或宽 externalization 放大、
Turbo cache 与 .output 不一致、artifact 无法启动或 HTTP smoke 失败时,先读取
references/production-graph-and-runtime-closure.md。
修改任何 nuxt.config.ts、manifest 或 lockfile 前,先读取当前工作树状态;部署验证时必须区分本地、CI、Vercel 和浏览器四类证据。
检修时必须先回答四件事:
- 实际安装的
shadcn-docs-nuxt、@ztl-uwu/nuxt-content、nuxt、h3、nuxt-og-image、@nuxt/kit是否属于同一兼容世代;提升层.pnpm/node_modules的版本与裸导入的解析目标是否与pnpm why一致; - 当前错误属于 Content/H3 运行时失配、依赖提升层/预构建盲区(→ dependency-triage.md)、SSR/水合边界(→ ssr-hydration.md)、Windows OOM/NFT 构建长尾,还是 production graph 的 Vite SSR transform、Nitro inline、trace/manifest 闭包;
- 当前配置是否误用了历史
prerender:routes/routes.clear()、无条件trace: false或全量inline; - 验证口径是否包含内容断言、水合判定、浏览器桌面视口截图与交互闭环(状态码 200 与 console 干净都不足为证)。
不要用单次首页 200 或本地 Windows 构建成功替代 Content API、fresh 依赖树和 Linux/Vercel 验证。
推荐参考仓库优先级
按以下顺序学习并抽取配置(从高到低):
nuxt-umami-docs(真实项目的稳定配置范式)shadcn-docs-nuxt-starter(最小骨架)shadcn-docs-nuxt(框架源码,仅用于查默认行为)shadcn-docs-ui-thing(组件库扩展思路,谨慎吸收)
每个仓库重点优先阅读这 6 个文件:package.json → nuxt.config.ts → app.config.ts → tailwind.config.* → assets/css/* → content/index.md
标准落地流程
第 1 步:建立最小骨架
docs-site/
├─ package.json
├─ nuxt.config.ts
├─ app.config.ts
├─ tailwind.config.js
├─ assets/css/
│ ├─ tailwind.css
│ └─ main.css
├─ content/
│ └─ index.md
├─ shims/ ← 按需,仅当 debug 兼容问题出现时
│ └─ debug.ts
├─ components/content/ ← 按需,自定义 MDC 组件
└─ plugins/ ← 按需,注册 workspace 组件库
如果是重构已有文档站,先保留现有 content/ 层级,不要和"底座重建"混在一次改动里。
第 2 步:依赖与脚本
详见 references/workspace.md § package.json 基线。
核心要点:
- 依赖:
nuxt、shadcn-docs-nuxt、vue、vue-router、tailwindcss、tailwindcss-animate - Nuxt 3 文档站还必须固定
nuxt-og-image: 5.1.9;若主题传递依赖声明了更宽范围,在根package.json增加pnpm.overrides.nuxt-og-image: 5.1.9 - 如需消费 workspace 组件库,补
workspace:*依赖 - devDependencies:
@iconify-json/lucide(Nuxt Icon 必需) - 脚本必须包含
predev/prebuild/postinstall三处nuxt prepare - fresh install 后必须检查实际解析树,并提交 lockfile;不要让
^2.13.9之类的传递范围决定 Content 版本
第 3 步:Nuxt 配置
先用最小骨架启动,遇到客户端报错再按"按需补丁"策略逐项补兼容。
第 4 步:Tailwind + CSS
详见 references/tailwind-css.md。
硬性检查:content 扫描必须覆盖 node_modules/shadcn-docs-nuxt,否则主题类缺失、暗黑样式异常。
第 5 步:MDC 内容
详见 references/mdc-prettier.md。
第 6 步:验证
执行后至少提供以下证据:
| 验证项 | 方法 |
| -------------- | ------------------------------------------------------------------------------------------------------------------- |
| 启动 | pnpm --filter <pkg> dev → 首页 HTTP 200 |
| 依赖 | pnpm list / pnpm why h3 → 核心包实际版本可解释 |
| Nuxt 世代 | pnpm why nuxt-og-image @nuxt/kit h3 → nuxt-og-image@5.1.9 且不出现 Nuxt 4/H3 v2 混入 |
| Content | fresh dev 请求 cache/search API → HTTP 200 且索引非空 |
| 构建 | pnpm --filter <pkg> build → 有 .output 产物 |
| 生产图 | 以首个失败门检查 alias、externalization、inline、trace 与实际部署包 manifest |
| 产物 | 必须启动 .output server → 关键页面与 Content API HTTP smoke 通过 |
| 缓存诊断 | 只有诊断 cache 可信度或 cache/artifact 证据冲突时,才执行 turbo run <task> --force;常规生产验收不执行该命令 |
| 交互 | 暗黑模式切换、侧边栏折叠可用 |
| 内容 | 抽查至少 1 个 ::demo-playground 页面,无裸 marker 文本 |
| console | 无阻断 hydration 的 error |
| Vercel runtime | READY 后记录部署 URL、Function 日志、页面与 Content API 响应;未实测不得标记完成 |
| 浏览器 | 使用可见浏览器走首页/组件 demo 用户路径,记录 console、hydration 与至少一个交互结果;没有浏览器工具时明确标记未完成 |
生产闭包硬门(必须执行)
按以下顺序推进,不得跳过或把后一个阶段的绿灯当成前一个阶段的修复:
- 保护写集:保存 dirty-tree 快照,确认目标文件和用户改动边界。
- 锁定解析树:fresh install 后运行
pnpm why/list,核对文档包 manifest、root trace 入口与 lockfile。 - 定位首错阶段:将错误归属到 Vite SSR transform、Nitro Rollup、NFT trace、Function manifest 或 runtime startup。
- 最小变更:优先修 manifest/入口;只有 exact error 证实所属阶段需要时才加窄
noExternal、inline或 alias;生产默认不添加nitro.externals。 - 本地产物:启动
.output/server/index.mjs,请求页面与 Content cache/search,记录 PID、响应体和日志。 - 远端闭环:Linux/Vercel 构建、Function artifact、部署 URL、HTTP smoke、运行日志和可见浏览器证据必须分别记录。
- 状态口径:缺任何外部门时写
candidate/needs_check;只有所有可运行门通过后才写verified,并保留 deployment ID/SHA。
compatibilityDate 必须与 nitro-api-development 技能保持同一对象契约:同时列出 Cloudflare 与 Vercel 两个平台、各自的官方说明链接,并固定为 2024-09-19。它只代表目标 Nitro provider 的兼容基线,不是 entities/decode 或其他 runtime closure 的修复;不要退化为单字符串或从另一个项目盲抄日期。
文档站 runtime verified 与 npm/插件发布是两条独立链路;本技能不把 changeset、registry、tarball 或 GitHub Release 的成功当作文档站运行时通过。任务同时要求发布时,另按项目发布技能建立独立证据链。
常见故障排查顺序
交互失效(暗黑模式切换失败、侧栏按钮无效)时,严格按此顺序:
- 先看浏览器 console 是否有模块导入错误 →
references/compat.md - 再按首个错误修依赖入口兼容(alias / optimizeDeps / dedupe /
ssr.noExternal);Vite SSR transform、Nitro inline 与 trace/manifest 不能互相替代。→references/production-graph-and-runtime-closure.md - 最后再做 Tailwind / 主题样式检查 →
references/tailwind-css.md
Content API 500、H3 导出错误或版本漂移时 → references/incident-repair.md
final Nitro OOM、standalone MODULE_NOT_FOUND、artifact 启动失败或 Turbo cache 不可信时 → references/production-graph-and-runtime-closure.md
构建卡住时 → references/windows.md
MDC 裸文本 / hydration mismatch → references/mdc-prettier.md
禁改项(无明确证据前不动)
extends: ["shadcn-docs-nuxt"](它通常不是根因)- 内容目录层级(底座改造阶段避免和内容重排耦合)
- i18n 多语言路线(单语文档站先保持最小配置)
- icon 体系大改(先沿用模板可用默认方案)
ogImage: { enabled: false }(直接启用会触发 500)- 生产模板不得默认配置
nitro.externals;Windows trace workaround 只能按references/windows.md作为本地、可回滚的诊断开关使用。 - 不得把
tsdown的 registry 解析 workaround 扩大成 root 全局rolldownoverride。
反模式清单
- 先写大量"自定义配置",最后才验证能否启动。
- 用样式改动掩盖运行时导入错误。
- 批量格式化
content/**/*.md后不做页面与 console 回归。 - 在同一轮同时重排内容架构 + 重构底座,导致回归不可定位。
- 只报"看起来好了",不附任何可重复验证证据。
- 把
::demo-playground写成## ::demo-playground。 - 在 Windows 下把"日志停住"直接判定为"进程卡死"而不先清理旧进程。
- 把历史上的
prerender:routes清空钩子当成所有shadcn-docs-nuxt项目的默认配置;应先判断是否使用 document-driven Content。 - 把 Vercel
READY、单次页面200或本地 build 结果写成生产 runtime 通过。 - 未检查 dirty tree 就覆盖配置、执行
git add .或把用户改动带入 release/验证。 - 用 root 全局
rolldownoverride 让pnpm install暂时成功,却没有验证 tsdown 的 peer/range/API 兼容性。
输出要求
执行本技能时,最终至少给出:
- 关键改动文件列表(配置、样式、内容)
- 运行与构建验证结果
- 若有风险项,给出下一步最小补救建议
- 明确状态是
verified、candidate还是needs_check,并列出未完成的 provider/浏览器证据门