Menu

文档贡献指南

欢迎来到 Next.js 文档贡献指南!我们很高兴你在这里。

本页面提供了如何编辑 Next.js 文档的说明。我们的目标是确保社区中的每个人都能够参与进来,改进我们的文档。

为什么要贡献?

开源工作永无止境,文档也是如此。为文档做出贡献是初学者参与开源的好方法,也是经验丰富的开发者澄清复杂主题并分享知识给社区的好机会。

通过为 Next.js 文档做出贡献,你正在帮助我们为所有开发者构建一个更强大的学习资源。无论你发现了一个错别字、一个令人困惑的部分,还是意识到某个主题缺失,我们都欢迎并感谢你的贡献。

如何贡献

文档内容可以在 Next.js 仓库 中找到。要贡献,你可以直接在 GitHub 上编辑文件,或者克隆仓库并在本地编辑文件。

GitHub 工作流程

如果你是 GitHub 新手,我们推荐阅读 GitHub 开源指南 以学习如何 fork 仓库、创建分支和提交拉取请求。

值得注意的是: 文档代码位于一个私有代码库中,该代码库与 Next.js 公共仓库同步。这意味着你无法在本地预览文档。然而,在合并拉取请求后,你将在 nextjs.org 上看到你的更改。

编写 MDX

文档是用 MDX 编写的,这是一种支持 JSX 语法的 Markdown 格式。这使我们能够在文档中嵌入 React 组件。有关 Markdown 语法的快速概述,请参阅 GitHub Markdown 指南

VSCode

本地预览更改

VSCode 有一个内置的 Markdown 预览器,你可以用来在本地查看你的编辑。要为 MDX 文件启用预览器,你需要在用户设置中添加一个配置选项。

打开命令面板(在 Mac 上是 ⌘ + ⇧ + P,在 Windows 上是 Ctrl + Shift + P)并搜索 Preferences: Open User Settings (JSON)

然后,在你的 settings.json 文件中添加以下行:

settings.json
{
  "files.associations": {
    "*.mdx": "markdown"
  }
}

接下来,再次打开命令面板,并搜索 Markdown: Preview FileMarkdown: Open Preview to the Side。这将打开一个预览窗口,你可以在其中看到格式化的更改。

扩展

我们还推荐以下 VSCode 用户使用的扩展:

  • MDX: 为 MDX 提供智能感知和语法高亮。
  • Prettier: 保存时格式化 MDX 文件。

审核流程

一旦你提交了贡献,Next.js 或开发者体验团队将审核你的更改,提供反馈,并在准备就绪时合并拉取请求。

请在 PR 的评论中告诉我们你是否有任何问题或需要进一步的帮助。感谢你为 Next.js 文档做出贡献,并成为我们社区的一员!

提示: 在提交 PR 之前运行 pnpm prettier-fix 以运行 Prettier。

文件结构

文档使用文件系统路由/docs 中的每个文件夹和文件代表一个路由段。这些段用于生成 URL 路径、导航和面包屑。

文件结构反映了你在网站上看到的导航,默认情况下,导航项按字母顺序排序。然而,我们可以通过在文件夹或文件名前添加两位数字(如 00-)来改变项目的顺序。

例如,在 functions API 参考 中,页面按字母顺序排序,因为这使得开发者更容易找到特定函数:

03-functions
├── cookies.mdx
├── draft-mode.mdx
├── fetch.mdx
└── ...

但在 路由部分 中,文件前缀为两位数字,按开发者应学习这些概念的顺序排序:

02-routing
├── 01-defining-routes.mdx
├── 02-pages-and-layouts.mdx
├── 03-linking-and-navigating.mdx
└── ...

要快速找到页面,你可以使用 ⌘ + P(Mac)或 Ctrl + P(Windows)在 VSCode 中打开搜索栏。然后,输入你要查找的页面的 slug。例如 defining-routes

为什么不使用清单文件?

我们考虑过使用清单文件(另一种生成文档导航的流行方式),但我们发现清单文件很快会与文件不同步。文件系统路由迫使我们思考文档的结构,并感觉更贴近 Next.js。

元数据

每个页面在文件顶部都有一个由三个破折号分隔的元数据块。

必填字段

以下字段是必填的:

字段描述
title页面的 <h1> 标题,用于 SEO 和 OG 图片。
description页面的描述,用于 <meta name="description"> 标签的 SEO。
required-fields.mdx
---
title: 页面标题
description: 页面描述
---

限制页面标题为 2-3 个单词(例如 优化图片),描述为 1-2 句话(例如 学习如何在 Next.js 中优化图片)是一个好习惯。

可选字段

以下字段是可选的:

字段描述
nav_title在导航中覆盖页面的标题。当页面标题太长时很有用。如果没有提供,则使用 title 字段。
source将内容拉入共享页面。参见 共享页面
related文档底部的一组相关页面。这些将自动转换为卡片。参见 相关链接
optional-fields.mdx
---
nav_title: 导航项标题
source: app/building-your-application/optimizing/images
related:
  description: 参见图片组件 API 参考。
  links:
    - app/api-reference/components/image
---

AppPages 文档

由于 App RouterPages Router 中的大多数功能完全不同,它们的文档分别保存在不同的部分(02-app03-pages)。然而,有一些功能是它们共享的。

共享页面

为了避免内容重复和内容不同步的风险,我们使用 source 字段将内容从一个页面拉入另一个页面。例如,<Link> 组件在 AppPages 中的行为大部分相同。我们不是复制内容,而是从 app/.../link.mdx 拉入 pages/.../link.mdx

app/.../link.mdx
---
title: <Link>
description: <Link> 组件的 API 参考。
---
 
这个 API 参考将帮助你理解如何使用 Link 组件的属性和配置选项。
pages/.../link.mdx
---
title: <Link>
description: <Link> 组件的 API 参考。
source: app/api-reference/components/link
---
 
{/* 不要编辑此页面。 */}
{/* 此页面的内容从上面的源拉入。 */}

因此,我们可以在一个地方编辑内容,并在两个部分中反映出来。

共享内容

在共享页面中,有时可能会有特定于 App RouterPages Router 的内容。例如,<Link> 组件有一个仅在 Pages 中可用但在 App 中不可用的 shallow 属性。

为了确保内容仅在正确的路由器中显示,我们可以将内容块包裹在 <AppOnly><PagesOnly> 组件中:

app/.../link.mdx
这部分内容在 App 和 Pages 之间共享。
 
<PagesOnly>
 
这部分内容将仅在 Pages 文档中显示。
 
</PagesOnly>
 
这部分内容在 App 和 Pages 之间共享。

你可能会为示例和代码块使用这些组件。

代码块

代码块应包含一个可以复制粘贴的最小工作示例。这意味着代码无需任何额外配置即可运行。

例如,如果你展示如何使用 <Link> 组件,你应该包括 import 语句和 <Link> 组件本身。

app/page.tsx
import Link from "next/link";
 
export default function Page() {
  return <Link href="/about">About</Link>;
}

在提交之前,始终在本地运行示例。这将确保代码是最新的并且可以工作。

语言和文件名

代码块应有一个包含语言和 filename 的头。添加 filename 属性以渲染一个特殊的终端图标,帮助用户确定在哪里输入命令。例如:

code-example.mdx
```bash filename="Terminal"
npx create-next-app
```

文档中的大多数示例是用 tsxjsx 编写的,少数用 bash。然而,你可以使用任何支持的语言,这里是 完整列表

编写 JavaScript 代码块时,我们使用以下语言和扩展组合。

语言扩展名
带有 JSX 代码的 JavaScript 文件```jsx.js
不带 JSX 代码的 JavaScript 文件```js.js
带有 JSX 代码的 TypeScript 文件```tsx.tsx
不带 JSX 代码的 TypeScript 文件```ts.ts

TS 和 JS 切换器

添加语言切换器以在 TypeScript 和 JavaScript 之间切换。代码块应首先使用 TypeScript,并提供 JavaScript 版本以适应用户。

目前,我们编写 TS 和 JS 示例一个接一个,并用 switcher 属性链接它们:

code-example.mdx
```tsx filename="app/page.tsx" switcher
 
```
 
```jsx filename="app/page.js" switcher
 
```

值得注意的是: 我们计划在未来自动将 TypeScript 片段编译为 JavaScript。目前,你可以使用 transform.tools

行高亮

可以高亮代码行。当你想吸引注意特定部分的代码时,这很有用。你可以通过传递一个数字到 highlight 属性来高亮行。

单行: highlight={1}

app/page.tsx
import Link from "next/link";
 
export default function Page() {
  return <Link href="/about">About</Link>;
}

多行: highlight={1,3}

app/page.tsx
import Link from "next/link";
 
export default function Page() {
  return <Link href="/about">About</Link>;
}

行范围: highlight={1-5}

app/page.tsx
import Link from "next/link";
 
export default function Page() {
  return <Link href="/about">About</Link>;
}

图标

以下图标可用于文档中:

mdx-icon.mdx
<Check size={18} />
<Cross size={18} />

输出:

我们不在文档中使用表情符号。

注释

对于重要但非关键的信息,使用注释。注释是添加信息而不分散用户注意力的好方法。

notes.mdx
> **值得注意的是**: 这是一行注释。
 
> **值得注意的是**:
>
> - 我们也使用这种格式进行多行注释。
> - 有时有多个值得了解或记住的项目。

输出:

值得注意的是: 这是一行注释。

值得注意的是:

  • 我们也使用这种格式进行多行注释。
  • 有时有多个值得了解或记住的项目。

相关链接

相关链接通过添加指向逻辑下一步的链接来指导用户的学习旅程。

  • 链接将以卡片的形式显示在页面主要内容的下方。
  • 对于有子页面的页面,链接将自动生成。例如,优化 部分有指向其所有子页面的链接。

使用页面元数据中的 related 字段创建相关链接。

example.mdx
---
related:
  description: 学习如何快速开始你的第一个应用程序。
  links:
    - app/building-your-application/routing/defining-routes
    - app/building-your-application/data-fetching
    - app/api-reference/file-conventions/page
---

嵌套字段

字段必填?描述
title可选卡片列表的标题。默认为 下一步
description可选卡片列表的描述。
links必填指向其他文档页面的链接列表。每个列表项应为相对 URL 路径(不带前导斜杠),例如 app/api-reference/file-conventions/page

图表

图表是解释复杂概念的好方法。我们使用 Figma 创建图表,遵循 Vercel 的设计指南。

图表现在我们私有 Next.js 网站的 /public 文件夹中。如果你想更新或添加图表,请打开一个 GitHub 问题 并提出你的想法。

自定义组件和 HTML

以下是文档可用的 React 组件:<Image />(next/image)、<PagesOnly /><AppOnly /><Cross /><Check />。我们不允许在文档中使用原始 HTML,除了 <details> 标签。

如果你有新的组件想法,请打开一个 GitHub 问题

样式指南

本节包含为新手编写文档的指南。

页面模板

虽然没有严格的页面模板,但你会看到文档中重复出现的页面部分:

  • 概述: 页面的第一段应告诉用户该功能是什么以及它的用途。接下来是一个最小工作示例或其 API 参考。
  • 约定: 如果该功能有约定,应在此处解释。
  • 示例: 展示如何使用该功能的不同用例。
  • API 表格: API 页面应在页面顶部有一个概览表格,并尽可能提供跳转到部分的链接。
  • 下一步(相关链接): 添加指向相关页面的链接,以指导用户的学习旅程。

根据需要自由添加这些部分。

页面类型

文档页面也分为两类:概念性和参考性。

  • 概念性页面用于解释概念或功能。它们通常较长,包含更多信息。在 Next.js 文档中,概念性页面位于 构建你的应用程序 部分。
  • 参考性页面用于解释特定的 API。它们通常较短,更专注。在 Next.js 文档中,参考性页面位于 API 参考 部分。

值得注意的是: 根据你贡献的页面类型,你可能需要遵循不同的语调和风格。例如,概念性页面更具指导性,使用单词 来称呼用户。参考性页面更技术性,使用更多命令式词汇如 "创建, 更新, 接受",并且倾向于省略单词

语调

以下是一些保持文档一致风格和语调的指南:

  • 编写清晰、简洁的句子。避免离题。
    • 如果你发现自己使用了很多逗号,考虑将句子分成多个句子或使用列表。
    • 用简单的词汇替换复杂的词汇。例如,使用 而不是 利用
  • 注意单词 。它可能含糊不清且令人困惑,如果不清,不要害怕重复句子中的主语。
    • 例如,Next.js 使用 React 而不是 Next.js 使用这个
  • 使用主动语态而不是被动语态。主动句更容易阅读。
    • 例如,Next.js 使用 React 而不是 React 被 Next.js 使用。如果你发现自己使用单词如 ,你可能在使用被动语态。
  • 避免使用诸如 容易, 快速, 简单, 只是 等词汇。这是主观的,可能会让用户感到沮丧。
  • 避免使用否定词汇如 不要, 不能, 不会 等。这可能会让读者感到沮丧。
    • 例如,"你可以使用 Link 组件在页面之间创建链接" 而不是 "不要使用 <a> 标签在页面之间创建链接"
  • 用第二人称(你/你的)写作。这更个人化且更具吸引力。
  • 使用性别中立的语言。使用 开发者, 用户, 或 读者 来指代受众。
  • 如果添加代码示例,确保它们格式正确且可以工作。

虽然这些指南并不详尽,但它们应该能帮助你开始。如果你想深入了解技术写作,可以查看 Google 技术写作课程

感谢你为文档做出贡献,并成为 Next.js 社区的一员!