您正在阅读 Nuxt 内容 V1 文档。阅读最新版本
配置
您可以在您的 nuxt.config.js 中使用 content 属性配置 @nuxt/content。
export default {
  content: {
    // My custom configuration
  }
}
在深入研究各个属性之前,请先查看 模块的默认设置。
合并默认值
您可以将每个选项定义为函数或静态值(基本类型、对象、数组等)。如果您使用函数,则默认值将作为第一个参数提供。
如果您不使用函数来定义您的属性,该模块将尝试将它们与默认值合并。这对 markdown.remarkPlugins、markdown.rehypePlugins 等等很有用,因为默认值相当合理。如果您不想包含默认值,只需使用函数即可。
属性
apiPrefix
- 类型:string
- 默认值:'/_content'
将用于客户端 API 调用和 SSE 的路由。
content: {
  // $content api will be served on localhost:3000/content-api
  apiPrefix: 'content-api'
}
dir
- 类型:string
- 默认值:'content'
用于编写内容的目录。您可以提供绝对路径,如果相对路径,则将使用 Nuxt srcDir 解析。
content: {
  dir: 'my-content' // read content from my-content/
}
fullTextSearchFields
- 类型:Array
- 默认值:['title', 'description', 'slug', 'text']
需要索引才能搜索的字段,详细了解搜索 这里。
text 是一个特殊键,包含您的 Markdown 在解析为 AST 之前的内容。
content: {
  // Only search in title and description
  fullTextSearchFields: ['title', 'description']
}
nestedProperties
- 类型 Array
- 默认值:[]
- 版本:>= v1.3.0
注册嵌套属性以处理点符号表示法和深度过滤。
content: {
  nestedProperties: ['categories.slug']
}
liveEdit
- 类型 boolean
- 默认值:true
- 版本:>= v1.5.0
在开发中禁用实时编辑模式
content: {
  liveEdit: false
}
markdown
该模块在幕后使用 remark 和 rehype 将 Markdown 文件编译成 JSON AST,这些文件将存储在 body 变量中。
remarkPlugins 和 rehypePlugins要配置模块如何解析 Markdown,您可以
- 向默认值添加一个新插件
export default {
  content: {
    markdown: {
      remarkPlugins: ['remark-emoji']
    }
  }
}
- 覆盖默认插件
export default {
  content: {
    markdown: {
      remarkPlugins: () => ['remark-emoji']
    }
  }
}
- 使用本地插件
export default {
  content: {
    markdown: {
      remarkPlugins: [
        '~/plugins/my-custom-remark-plugin.js'
      ]
    }
  }
}
- 在定义中直接提供选项
export default {
  content: {
    markdown: {
      remarkPlugins: [
        ['remark-emoji', { emoticon: true }]
      ]
    }
  }
}
- 使用插件名称以 camelCase形式在camelCase中提供选项
export default {
  content: {
    markdown: {
      // https://github.com/remarkjs/remark-external-links#options
      remarkExternalLinks: {
        target: '_self',
        rel: 'nofollow'
      }
    }
  }
}
yarn add remark-emoji
export default {
  content: {
    markdown: {
      remarkPlugins: ['remark-emoji']
    }
  }
}
markdown.tocDepth
- 类型:number
- 默认值:3
- 版本:>= v1.11.0
您可以更改目录中包含的最大标题深度。
markdown.remarkPlugins
- 类型:Array
- 默认值:['remark-squeeze-paragraphs', 'remark-slug', 'remark-autolink-headings', 'remark-external-links', 'remark-footnotes']
- 版本:>= v1.4.0
您可以查看 remark 插件 列表。
markdown.rehypePlugins
- 类型:Array
- 默认值:['rehype-minify-whitespace', 'rehype-sort-attribute-values', 'rehype-sort-attributes', 'rehype-raw']
- 版本:>= v1.4.0
您可以查看 rehype 插件 列表。
markdown.basePlugins
markdown.remarkPlugins 作为函数。markdown.plugins
markdown.remarkPlugins 作为数组。markdown.prism.theme
- 类型:string
- 默认值:'prismjs/themes/prism.css'
该模块使用 PrismJS 处理 Markdown 内容中的代码突出显示。
它会自动将所需的 PrismJS 主题推送到您的 Nuxt.js 配置中,因此如果您想使用与默认主题不同的主题,例如 prism-themes
yarn add prism-themes
content: {
  markdown: {
    prism: {
      theme: 'prism-themes/themes/prism-material-oceanic.css'
    }
  }
}
要禁用主题的包含,请将 prism 设置为 false
content: {
  markdown: {
    prism: {
      theme: false
    }
  }
}
markdown.highlighter
- 类型:Highlighter|PromisedHighlighter
- 版本:>=1.9.0
您可以使用此选项更改 Markdown 内容中的默认代码突出显示器。例如,我们使用 highlight.js。
import highlightjs from 'highlight.js'
export default {
  content: {
    markdown: {
      highlighter(rawCode, lang) {
        const highlightedCode = highlightjs.highlight(rawCode, { language: lang }).value
        // We need to create a wrapper, because
        // the returned code from highlight.js
        // is only the highlighted code.
        return `<pre><code class="hljs ${lang}">${highlightedCode}</code></pre>`
      }
    }
  }
}
定义 markdown.highlighter 时,它会自动禁用 Prism 主题的包含。
如果您定义 markdown.highlighter,请不要忘记手动添加相应的样式。
它返回一个 string 或 HAST(超文本抽象语法树)。您可以通过传递第四个参数来构建 HAST。它由 h、node 和 u 组成。
import highlightjs from 'highlight.js'
export default {
  content: {
    markdown: {
      highlighter(rawCode, lang, _, { h, node, u }) {
        const highlightedCode = highlightjs.highlight(rawCode, { language: lang }).value
        // We can use ast helper to create the wrapper
        const childs = []
        childs.push(
          h(node, 'pre', [
            h(node, 'code', { className: ['hljs', lang] }, [
              u('raw', highlightedCode)
            ])
          ])
        )
        return h(
          node,
          'div',
          { className: 'highlighted-with-highlightjs' },
          childs
        )
      }
    }
  }
}
使用 nuxt-content 组件渲染后,它将如下所示
<div class="highlighted-with-highlightjs">
  <pre class="language-<lang>">
    <code>
      ...
    </code>
  </pre>
</div>
您还可以从第三个参数中获取行突出显示和文件名值。将它们与 HAST 结合起来,您可以将其传递给客户端。
import highlightjs from 'highlight.js'
export default {
  content: {
    markdown: {
      highlighter(rawCode, lang, { lineHighlights, fileName }, { h, node, u }) {
        const highlightedCode = highlightjs.highlight(rawCode, { language: lang }).value
        const childs = []
        const props = {
          className: `language-${lang}`,
          dataLine: lineHighlights,
          dataFileName: fileName
        }
        childs.push(
          h(node, 'pre', [
            h(node, 'code', props, [
              u('raw', highlightedCode)
            ])
          ])
        )
        return h(
          node,
          'div',
          { className: 'highlighted-with-highlightjs' },
          childs
        )
      }
    }
  }
}
然后返回的代码将如下所示
<div class="highlighted-with-highlightjs">
  <pre class="language-<lang>" data-line="<line>" data-file-name="<file-name>">
    <code>
      ...
    </code>
  </pre>
</div>
您可以从 mdast-util-to-hast、通用语法树 和 unist-builder 中了解有关
h、node和u的更多信息
如果您需要从承诺返回的包/函数中获取突出显示器,您可以这样做
import { getHighlighter } from 'example-highlighter'
export default {
  content: {
    markdown: {
      async highlighter() {
        const highlighter = await getHighlighter()
        return (rawCode, lang) => {
          return highlighter.highlight(rawCode, { language: lang })
        }
      }
    }
  }
}
您可以前往 代码片段 - 自定义突出显示器 部分查看更多示例。
yaml
- 类型:object
- 默认值:{}
该模块使用 js-yaml 解析 .yaml、.yml 文件。您可以查看此处了解 选项。
请注意,我们强制执行 json: true 选项。
xml
- 类型:object
- 默认值:{}
该模块使用 xml2js 解析 .xml 文件。您可以查看此处了解 选项。
csv
- 类型:object
- 默认值:{}
该模块使用 node-csvtojson 解析 csv 文件。您可以查看此处了解 选项。
extendParser
- 类型:object
- 默认 {}
使用此选项,您可以为其他文件类型定义自己的解析器。您还可以覆盖默认解析器!
要添加自定义解析器,请编写一个函数,该函数以文件内容作为参数并返回提取的数据。
示例
const parseTxt = file => file.split('\n').map(line => line.trim())
// in Config:
{
  extendParser: {
    '.txt': parseTxt
  }
}
editor
您可以在开发中提供一个自定义编辑器来编辑您的 Markdown 文件。将 editor 选项设置为编辑器组件的路径。您可以在 此处 找到默认编辑器的代码。
content: {
  editor: '~/path/to/editor/component.vue'
}
您的组件应实现以下内容
- v-model用于获取 Markdown 代码。
- prop isEditing是一个布尔值,包含有关是否已开始编辑以及组件是否显示的信息。(这是可选的)
- 编辑完成后,您的组件必须发出 endEdit
您应该意识到,您会获得完整的 Markdown 文件内容,因此这包括前置内容。您可以使用 gray-matter 来拆分和合并 Markdown 和前置内容。
useCache
- 类型:boolean
- 默认值:false
当 true 时,生产服务器 (nuxt start) 将使用内容的缓存版本(在运行 nuxt build 后生成),而不是解析文件。这将缩短应用程序启动时间,但会使应用程序无法感知任何内容更改。
默认值
export default {
  content: {
    editor: '~/.nuxt/content/editor.vue',
    apiPrefix: '_content',
    dir: 'content',
    fullTextSearchFields: ['title', 'description', 'slug', 'text'],
    nestedProperties: [],
    liveEdit: true,
    useCache: false,
    markdown: {
      remarkPlugins: [
        'remark-squeeze-paragraphs',
        'remark-slug',
        'remark-autolink-headings',
        'remark-external-links',
        'remark-footnotes'
      ],
      rehypePlugins: [
        'rehype-minify-whitespace',
        'rehype-sort-attribute-values',
        'rehype-sort-attributes',
        'rehype-raw'
      ],
      prism: {
        theme: 'prismjs/themes/prism.css'
      }
    },
    yaml: {},
    csv: {},
    xml: {},
    extendParser: {}
  }
}