前端开发
用 Next.js 16 + shadcn/ui…
在用 Next.js + shadcn/ui 搭前端(新建项目、加 UI 组件、样式化页面、写 App Router 数据/缓存/Server Actions 代码)时,按这套约定与命令执行。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
用 Next.js 16 + shadc特定
解决思路
- 在新视图写第一个组件之前先加载 `frontend-design` 技能:排版、配色和页面「大胆」的重点元素是创建时决定,事后返工比一开始就定好更贵。
- 在浏览器中检查构建出的视图,而不是看截图:从 DOM 里读点击目标尺寸、对比度和溢出,因为截图无法反映计算样式,甚至可能根本没渲染出来。
- 遵循 4 条核心原则:减少噪音(用图标传达信息,不要堆标签);不做通用 AI 界面(避免紫色渐变、过多阴影、可预测布局);用内容而非装饰(每个元素都有目的);主题一致(用 `globals.css` 的 CSS 变量,绝不硬编码颜色)。
- 新建项目运行:`bunx --bun shadcn@latest init --template next --base base`。
- 用 `--base` 选择原语库:`base`(Base UI,2026 年 7 月起的默认)、`radix`(已在 Radix 的项目,仍完全支持、未废弃)、`aria`(React Aria)。同一组件在不同 base 下 props 不同——Base UI 用 `render={<Link href="/" />}`,Radix 用 `asChild`——且文档按 base 分域(`/docs/components/base/sidebar` vs `/docs/components/radix/sidebar`)。
- 做自定义设计系统时,先在 `shadcn/create` 生成 preset code,再运行 `bunx --bun shadcn@latest init --preset <CODE> --template next` 应用。
- 改动已有项目之前先运行 `bunx --bun shadcn@latest info --json`(查看 base、框架、别名、已安装组件)和 `bunx --bun shadcn@latest docs <component>`(解析到本项目 base 的 API 参考),而不是凭记忆写组件代码。
- 组件划分:共享导航/布局外壳放进 layouts,路由特定内容留在 pages;名为 `(protected)` 的路由组本身并不执行鉴权。
- 客户端边界:把 `"use client"` 边界保持得尽量窄(providers 和交互子树可能需要更高层边界);props 必须可序列化(数据或 Server Actions,不能传函数/类);用 `children` 传服务器内容。
- 导入别名:绝不使用相对路径(`../../lib/utils`);新项目默认用 `@/` 别名(`@/lib/utils`);已有项目读 `components.json` 并遵循已配置的别名风格(shadcn 也支持 Node 包导入如 `#components/ui/button`);两种风格绝不混用。
- 合并条件 Tailwind 类时使用项目的 `cn()` 辅助函数;路由特定代码放在路由附近,共享组件放在已有的共享目录里,不要给成熟应用强加新的目录树。
- Next.js 16 异步 params:把 `params`、`searchParams` 声明为 `Promise<...>`,在组件里 `await` 后再取值。
- 读取数据优先用 Server Components 或 Route Handlers,变更用 Server Actions;Server Actions 虽能读数据,但客户端派发是为变更设计的、调用可能被串行化,不应作为通用读查询传输。
- 缓存:`"use cache"`、`cacheTag`、`cacheLife` 需要开启 `cacheComponents: true`;`updateTag` 仅限 Server Actions 使用,但本身不要求该 flag,也能失效 fetch tags;依据新鲜度和鉴权要求来选择缓存,而不是仅因为函数读数据就缓存。
- 用 Server Actions 做变更:写入前先对调用方做鉴权和授权,并用 zod 等校验输入;写入后调用 `updateTag("posts")` 实现 read-your-writes,或调用 `revalidateTag("posts", "max")` 做 SWR 风格再验证。
- 用 `proxy.ts` 做请求拦截(替代 middleware),放在项目根目录(与 `app/` 同级),导出 `proxy(request: NextRequest)` 函数与 `config.matcher`。
- 在 Next.js 16 项目中建议用户把 `next-devtools-mcp` 加入 `.mcp.json`(`command: npx`,`args: ["-y", "next-devtools-mcp@latest"]`),并优先用它的工具取信息而非让用户复制粘贴报错:`get_errors`(实时构建/运行时/类型错误,尤其适合 hydration 不匹配)、`get_logs`、`get_routes`、`get_page_metadata`、`get_project_metadata`、`get_server_action_by_id`、`get_compilation_issues` / `compile_route`(仅 Turbopack);它同时是文档网关,指向 `node_modules/next/dist/docs/` 中版本准确的文档。
- 渲染 markdown / LLM 输出用 typeset,不要手写 CSS:`<div className="typeset typeset-chat">{markdown}</div>`;一个自有 CSS 文件、三个变量(`--typeset-size`、`--typeset-leading`、`--typeset-flow`)、每个上下文一个 preset;对流式输出稳定,新块不会重设前面块的样式。
- 不确定的文本状态("Thinking…")用 `className="shimmer"`;`Skeleton` 只用于形状已知的占位符;两者不要叠加使用。
- 柔和的滚动容器边缘用 `className="scroll-fade overflow-y-auto"`。
- 包管理器:新项目一律用 bun,绝不用 npm 或 npx——`bun install`、`bun add`、`bunx --bun`;已有仓库则遵循其 `packageManager` 字段和 lockfile,不要切换成 bun。
- 需要更多细节时查阅参考文件:`references/architecture.md`、`references/styling.md`、`references/shadcn-platform.md`、`references/sidebar.md`、`references/project-setup.md`;用 `bunx --bun skills add shadcn/ui` 安装官方 shadcn skill 作为项目配置与 CLI/registry 参考;CLI 不可用时回退到 shadcn/ui 的 `llms.txt`,但仍优先 `shadcn docs <component>`。
适用边界 · 注意事项
- 已有仓库中不要切换到 bun、不要混用相对路径与 `@/`/`#` 两种导入风格、不要强加新的目录树——应遵循既有 `packageManager`、`components.json` 与目录约定。
- 不要依赖名为 `(protected)` 的路由组做授权,鉴权必须在 Server Action / 服务端代码里显式校验。
- 不要为 markdown 渲染和加载态手写 CSS(改用 typeset、shimmer、scroll-fade),也不要把 shimmer 与 Skeleton 叠加;不要凭记忆写组件 API 或让用户手动复制粘贴报错信息,应先查 `shadcn docs` 或 MCP 工具。