_meta.js 文件
在 Nextra 中,站点和单个页面结构可以通过同级的 _meta 文件进行配置。这些配置会影响 Nextra 主题的整体布局,特别是导航栏和边栏:

组织文件
Nextra 允许您以以下方式组织文件:
-
在 Next.js 的
app目录 中:
Nextra 会收集所有page文件,包括page.md和page.mdx文件,以及_meta文件。 -
在 Nextra 的
content目录 中:
Nextra 会收集所有.md和.mdx文件,以及_meta文件。
以下是针对 content 和仅 app 目录的相同基于文件的路由结构表示:
- Using
- layout.jsx
- _meta.js
- index.mdx
- legal.md
- _meta.js
- contact.md
- index.mdx
content directory- Using
- _meta.js
- page.mdx
- _meta.js
- layout.jsx
- page.mdx
page.mdx files您可以为项目结合两种组织方式:
- 使用
.mdx文件的content目录 - 使用
page文件的app目录
pageMap 结构
随后,Nextra 会生成一个 pageMap 数组,其中包含有关整个站点路由和目录结构的信息。诸如导航栏和边栏等功能可以基于 pageMap 信息生成。
生成的 pageMap 将是:
[
// content/_meta.js
{ "data": {} },
{
// content/index.mdx
"name": "index",
"route": "/",
"title": "Index",
"frontMatter": {}
},
{
// content/contact.md
"name": "contact",
"route": "/contact",
"title": "Contact",
"frontMatter": {}
},
{
// content/about
"name": "about",
"route": "/about",
"title": "About",
"children": [
// content/about/_meta.js
{ "data": {} },
{
// content/about/index.mdx
"name": "index",
"route": "/about",
"title": "Index",
"frontMatter": {}
},
{
// content/about/legal.md
"name": "legal",
"route": "/about/legal",
"title": "Legal",
"frontMatter": {}
}
]
}
]全局 pageMap 将被 Nextra 导入到每个页面中。然后,配置的主题将使用该 pageMap 渲染实际的 UI。
API
页面在边栏/导航栏中显示的标题和顺序可以在 _meta 文件中配置为键值对。
import type { MetaRecord } from 'nextra'
/**
* type MetaRecordValue =
* | TitleSchema
* | PageItemSchema
* | SeparatorSchema
* | MenuSchema
*
* type MetaRecord = Record<string, MetaRecordValue>
**/
const meta: MetaRecord = {
// ...
}
export default metatitle 类型
在 _meta 文件中指定 title 时,您可以将其定义为简单的字符串或 JSX 元素。
type TitleSchema = string | ReactElement对于以下文件结构:
- Using
- layout.jsx
- _meta.js
- about.mdx
- contact.mdx
- index.mdx
content directory- Using
- _meta.js
- layout.jsx
- page.mdx
page.mdx files以下 _meta 文件定义了页面标题:
import { GitHubIcon } from 'nextra/icons'
export default {
index: 'My Homepage',
// You can use JSX elements to change the look of titles in the sidebar, e.g. insert icons
contact: (
<Italic className="my-class">
<GitHubIcon height="20" />
Contact Us
</Italic>
),
about: {
// Alternatively, you can set title with `title` property
title: 'About Us'
// ... and provide extra configurations
}
}
// Custom component for italicized text
function Italic({ children, ...props }) {
return <i {...props}>{children}</i>
}页面
在 _meta 文件中,您可以定义页面在边栏中的显示方式,例如对于以下文件结构:
- Using
- layout.jsx
- _meta.js
- about.mdx
- contact.mdx
- index.mdx
content directory- Using
- _meta.js
- layout.jsx
- page.mdx
page.mdx filesexport default {
index: 'My Homepage',
contact: 'Contact Us',
about: 'About Us'
}如果任何路由未在 _meta 文件中列出,它们将被追加到边栏的末尾,并按字母顺序排序(除了 index 键,如果未在 _meta 文件中指定,它将排在首位)。
type PageItemSchema = {
type: 'page' | 'doc' // @default 'doc'
display: 'normal' | 'hidden' | 'children' // @default 'normal'
title?: TitleSchema
theme?: PageThemeSchema
}type: 'page' 选项
通过将顶级页面或文件夹定义为 type: 'page',它将作为特殊页面显示在导航栏中,而不是边栏。使用此功能,您可以拥有多个“子文档”,以及始终可见的特殊页面或链接,例如“Contact Us”。
例如,您可以在项目中拥有 2 个文档文件夹 frameworks 和 fruits。在顶级 _meta 文件中,您可以将所有内容设置为页面,而不是普通的边栏项:
- Using
- layout.jsx
- react.mdx
- svelte.mdx
- vue.mdx
- apple.mdx
- banana.mdx
- _meta.js
- about.mdx
- index.mdx
content directory- Using
- _meta.js
- layout.jsx
- page.mdx
page.mdx filesexport default {
index: {
title: 'Home',
type: 'page'
},
frameworks: {
title: 'Frameworks',
type: 'page'
},
fruits: {
title: 'Fruits',
type: 'page'
},
about: {
title: 'About',
type: 'page'
}
}它将如下所示:
您也可以使用 display: 'hidden' 选项从导航栏隐藏诸如 Home 之类的链接。
您可以在导航栏中添加外部链接,类似于 链接部分:
export default {
contact: {
title: 'Contact Us',
type: 'page',
href: 'https://example.com/contact'
}
}display: 'hidden' 选项
默认情况下,文件系统中的所有 MDX 路由都会显示在边栏中。但您可以使用 display: 'hidden' 配置隐藏特定页面或文件夹:
export default {
contact: {
display: 'hidden'
}
}该页面仍然可以通过 /contact URL 访问,但不会显示在边栏中。
theme 选项
您可以使用 theme 选项为每个页面配置主题。例如,您可以为特定页面禁用或启用特定组件:
export default {
about: {
theme: {
sidebar: false
}
}
}如果为文件夹设置此选项,它将被所有子页面继承。
布局
默认情况下,每个页面的主题配置中都有 layout: 'default',这是默认行为。您可能希望以全容器宽度和高度渲染某些页面,但保留所有其他样式。您可以使用 'full' 布局来实现:
export default {
about: {
theme: {
layout: 'full'
}
}
}排版
typesetting 选项控制排版细节,如字体特性、标题样式以及 <li> 和 <code> 等组件。在文档主题中,有 'default' 和 'article' 两种排版可用。
默认排版适合大多数情况,如文档,但您可以使用 'article' 排版使其看起来像优雅的文章页面:
export default {
about: {
theme: {
typesetting: 'article'
}
}
}文件夹
文件夹可以以与页面相同的方式配置。
例如,以下顶级 _meta 文件包含顶级页面和文件夹的元信息。
嵌套的 _meta 文件包含同一文件夹中页面的元信息:
- Using
- layout.jsx
- _meta.js
- apple.mdx
- banana.mdx
- _meta.js
- about.mdx
- contact.mdx
- index.mdx
content directory- Using
- _meta.js
- _meta.js
- layout.jsx
- page.mdx
page.mdx filesexport default {
index: 'My Homepage',
contact: 'Contact Us',
fruits: 'Delicious Fruits',
about: 'About Us'
}export default {
apple: 'Apple',
banana: 'Banana'
}您可以移动目录而无需更改 _meta 文件,因为页面信息在目录中分组在一起。
带有 /index 页面的文件夹
要创建带有索引页面的文件夹,请在其 frontmatter 中添加 asIndexPage: true。
例如,要创建 /fruits 路由,设置 asIndexPage: true 会告诉 Nextra /fruits 是一个带有索引页面的文件夹。在边栏中点击文件夹将展开它并显示 MDX 页面。
- Using
- layout.jsx
- _meta.js
- apple.mdx
- banana.mdx
- index.mdx
- _meta.js
- about.mdx
- contact.mdx
- index.mdx
content directory- Using
- _meta.js
- page.mdx
- _meta.js
- layout.jsx
- page.mdx
page.mdx files---
title: All Fruits
sidebarTitle: 🍒 Fruits
asIndexPage: true
---链接
type LinkSchema = {
href: string
title?: TitleSchema
}您可以通过在 _meta 文件中添加带有 href 的项,将外部链接添加到边栏:
export default {
github_link: {
title: 'Nextra',
href: 'https://github.com/shuding/nextra'
}
}您也可以使用此选项链接到相对内部链接。
分隔符
type SeparatorSchema = {
type: 'separator'
title?: TitleSchema
}您可以使用带有 type: 'separator' 的“占位符”项,在边栏中的项之间创建分隔线:
export default {
'###': {
type: 'separator',
title: 'My Items' // Title is optional
}
}菜单
您也可以使用 type: 'menu' 和 items 选项将菜单添加到导航栏:

type MenuItemSchema =
| TitleSchema
| { title: TitleSchema }
| (LinkSchema & { type?: 'page' | 'doc' })
| SeparatorSchema
type MenuSchema = {
type: 'menu'
title?: TitleSchema
items: Record<string, MenuItemSchema>
}export default {
company: {
title: 'Company',
type: 'menu',
items: {
about: {
title: 'About',
href: '/about'
},
contact: {
title: 'Contact Us',
href: 'mailto:hi@example.com'
}
}
}
}回退
在上文的 type: 'page' 选项 中,我们必须为每个页面定义 type: 'page' 选项。为了简化,您可以使用 '*' 键为该文件夹中的所有项定义回退配置:
export default {
'*': {
type: 'page'
},
index: 'Home',
frameworks: 'Frameworks',
fruits: 'Fruits',
about: 'About'
}它们相当于所有项都设置了 type: 'page'。
_meta.global 文件
您也可以在单个 _meta 文件中定义所有页面,该文件以 .global 结尾。API 与文件夹特定的 _meta 文件相同,有 1 个例外:文件夹项必须包含 items 字段。
对于以下结构,您可能使用以下 _meta 文件:
- Using
- layout.jsx
- _meta.js
- apple.mdx
- banana.mdx
- _meta.js
- index.mdx
content directory- Using
- _meta.js
- _meta.js
- layout.jsx
- page.mdx
page.mdx filesexport default {
fruits: {
type: 'page',
title: '✨ Fruits'
}
}export default {
apple: '🍎 Apple',
banana: '🍌 BaNaNa'
}使用单个 _meta.global 文件,可以如下定义:
export default {
fruits: {
type: 'page',
title: '✨ Fruits',
items: {
apple: '🍎 Apple',
banana: '🍌 BaNaNa'
}
}
}您不能在项目中使用 _meta.global 和 _meta 文件两者。
好记
排序页面
您可以使用 ESLint 的内置 sort-keys 规则,在 _meta 文件顶部添加 /* eslint sort-keys: error */ 注释,您将收到有关顺序错误的 ESLint 错误。
_meta 键的类型
您的 _meta 键的类型始终应该是字符串而不是数字,因为 数字总是在 JavaScript 对象中排在首位 。
例如,考虑以下内容:
export default {
foo: '',
1992_10_21: '',
1: ''
}将被转换为:
export default {
'1': '',
'19921021': '',
foo: ''
}_meta 文件可以使用 .js、.jsx 或 .tsx 文件扩展名。