mcpField
N
nextjs-best-practices

nextjs-best-practices

github.com/davila7开发33.0k630 次安装今天更新
代码仓库

关于 nextjs-best-practices

nextjs-best-practices 为使用 Next.js App Router 的开发者整理开发原则,涉及组件选择、数据获取、路由、缓存和性能优化。

主要功能

  1. 01Server 与 Client Components 选择
  2. 02数据获取与缓存策略
  3. 03App Router 路由组织
  4. 04API 路由处理建议
  5. 05性能与元数据优化

适用场景

  1. 01规划 App Router 项目结构
  2. 02决定组件在服务端或客户端运行
  3. 03为请求配置缓存与重新验证
  4. 04检查 API 路由和 Server Actions

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/davila7/claude-code-templates --skill nextjs-best-practices

安装后在 Claude Code 中输入/nextjs-best-practices确认已加载。

详细介绍

Next.js 最佳实践

Next.js App Router 开发原则。


1. 服务端组件与客户端组件

决策树
Does it need...?
│
├── useState, useEffect, event handlers
│   └── Client Component ('use client')
│
├── Direct data fetching, no interactivity
│   └── Server Component (default)
│
└── Both? 
    └── Split: Server parent + Client child
默认选择
类型用途
服务端数据获取、布局、静态内容
客户端表单、按钮、交互式 UI

2. 数据获取模式

获取策略
模式用途
默认静态(构建时缓存)
重新验证ISR(基于时间刷新)
不缓存动态(每次请求)
数据流
来源模式
数据库服务端组件获取
API带缓存的 fetch
用户输入客户端状态 + 服务端操作

3. 路由原则

文件约定
文件用途
page.tsx路由 UI
layout.tsx共享布局
loading.tsx加载状态
error.tsx错误边界
not-found.tsx404 页面
路由组织
模式用途
路由组 (name)在不影响 URL 的情况下组织
并行路由 @slot多个同层级页面
拦截路由 (.)模态覆盖层

4. API 路由

路由处理器
方法用途
GET读取数据
POST创建数据
PUT/PATCH更新数据
DELETE删除数据
最佳实践
  • 使用 Zod 验证输入
  • 返回正确的状态码
  • 妥善处理错误
  • 尽可能使用 Edge 运行时

5. 性能原则

图片优化
  • 使用 next/image 组件
  • 为首屏内容设置 priority
  • 提供模糊占位符
  • 使用响应式尺寸
打包优化
  • 对重型组件使用动态导入
  • 基于路由的代码分割(自动)
  • 使用打包分析器进行分析

6. 元数据

静态与动态
类型用途
静态导出固定元数据
generateMetadata按路由动态生成
必要标签
  • title(50-60 个字符)
  • description(150-160 个字符)
  • Open Graph 图片
  • 规范 URL

7. 缓存策略

缓存层级
层级控制方式
请求fetch 选项
数据revalidate/tags
完整路由路由配置
重新验证
方法用途
基于时间revalidate: 60
按需revalidatePath/Tag
不缓存no-store

8. 服务端操作

使用场景
  • 表单提交
  • 数据变更
  • 触发重新验证
最佳实践
  • 使用 'use server' 标记
  • 验证所有输入
  • 返回带类型的响应
  • 处理错误

9. 反模式

❌ 不要✅ 要
到处使用 'use client'默认使用服务端
在客户端组件中获取数据在服务端获取
跳过加载状态使用 loading.tsx
忽略错误边界使用 error.tsx
庞大的客户端包动态导入

10. 项目结构

app/
├── (marketing)/     # Route group
│   └── page.tsx
├── (dashboard)/
│   ├── layout.tsx   # Dashboard layout
│   └── page.tsx
├── api/
│   └── [resource]/
│       └── route.ts
└── components/
    └── ui/

记住: 服务端组件作为默认选择是有原因的。从这里开始,仅在需要时添加客户端。

评论

支持 Markdown