您正在阅读 Nuxt 内容 V1 文档。阅读最新版本

入门

高级

学习 @nuxt/content 模块的高级用法。

编程方式使用

$content 可从 **@nuxt/content** 访问。

注意,您只能在 **模块加载后** 从 Nuxt 访问它。 require('@nuxt/content') 应该在钩子或内部 Nuxt 方法中执行。

export default {
  modules: [
    '@nuxt/content'
  ],
  generate: {
    async ready () {
      const { $content } = require('@nuxt/content')
      const files = await $content().only(['slug']).fetch()
      console.log(files)
    }
  }
}

静态站点生成

从 Nuxt 2.14+ 开始,nuxt generate 集成了一个爬虫功能,它将爬取您所有的链接并根据这些链接生成您的路由。 因此,您无需执行任何操作即可让您的动态路由被爬取。

此外,nuxt generate 将在没有代码更改时自动跳过 webpack 构建步骤,并使用缓存使用之前的构建。 内容模块与此功能集成,以忽略 content/ 文件夹内部的更改。 换句话说,当更改网站的内容并部署时,构建将被跳过。

在此了解更多信息 这篇文章.

当使用 Nuxt <= 2.12 时,您可能需要使用 generate.routes 指定动态路由。

示例

nuxt.config.js
export default {
  modules: [
    '@nuxt/content'
  ],
  generate: {
    async routes () {
      const { $content } = require('@nuxt/content')
      const files = await $content({ deep: true }).only(['path']).fetch()

      return files.map(file => file.path === '/index' ? '/' : file.path)
    }
  }
}

建议使用 Nuxt 2.14+ 以及 nuxt generate,因为它很棒!

钩子

该模块添加了一些您可以使用的钩子。

content:file:beforeParse

允许您在文件由解析器处理之前修改文件的内容。

参数

  • 文件
  • 类型: object
  • 属性
    • 路径: string
    • 扩展名: string (例如: .md)
    • 数据: string

示例

更改所有 Markdown 文件中所有 react 的外观为 vue

nuxt.config.js
hooks: {
  'content:file:beforeParse': (file) => {
    if (file.extension !== '.md') return
    file.data = file.data.replace(/react/g, 'vue')
  }
}

content:file:beforeInsert

允许您在存储文档之前向文档添加数据。

参数

示例

在构建博客时,您可以使用 file:beforeInsert 来使用 reading-time 向文档添加 readingTime

text 是 markdown 文件在转换为 JSON AST 之前的正文内容。 您可以在此时使用它,但它不会被 API 返回。

nuxt.config.js
export default {
  modules: [,
    '@nuxt/content'
  ],
  hooks: {
    'content:file:beforeInsert': (document) => {
      if (document.extension === '.md') {
        const { time } = require('reading-time')(document.text)

        document.readingTime = time
      }
    }
  }
}

示例

您可能希望在 .json 文件内解析 markdown。 您可以从 database 对象访问解析器。

nuxt.config.js
export default {
  modules: [,
    '@nuxt/content'
  ],
  hooks: {
    'content:file:beforeInsert': async (document, database) => {
      if (document.extension === '.json' && document.body) {
        const data = await database.markdown.toJSON(document.body)

        Object.assign(document, data)
      }
    }
  }
}

content:options

扩展内容选项,这对希望在规范化时读取内容选项并对其实施更新的模块很有用。

参数

  • 选项
    • 类型: object
    • 属性

示例

nuxt.config.js
export default {
  modules: [,
    '@nuxt/content'
  ],
  hooks: {
    'content:options': (options) => {
      console.log('Content options:', options)
    }
  }
}

处理热重载

当您处于开发模式时,该模块将自动调用 nuxtServerInit 存储操作(如果已定义)和 $nuxt.refresh() 以刷新当前页面。

如果您想监听事件以执行更多操作,可以使用 $nuxt.$on('content:update') 在客户端监听 content:update 事件。

plugins/update.client.js
export default function ({ store }) {
  // Only in development
  if (process.dev) {
    window.onNuxtReady(($nuxt) => {
      $nuxt.$on('content:update', ({ event, path }) => {
        // Refresh the store categories
        store.dispatch('fetchCategories')
      })
    })
  }
}

然后在您的 nuxt.config.js 中添加您的插件。

nuxt.config.js
export default {
  plugins: [
    '@/plugins/update.client.js'
  ]
}

现在,每次更新 content/ 目录中的文件时,它也会调度 fetchCategories 方法。 这份文档实际上使用了它。 您可以通过查看 plugins/init.js 了解更多信息。

API 端点

此模块在开发中公开了 API 端点,因此您可以轻松查看每个目录或文件的 JSON,它位于 https://127.0.0.1:3000/_content/。 前缀默认情况下为 _content,并且可以使用 apiPrefix 属性进行配置。

示例

-| content/
---| articles/
------| hello-world.md
---| index.md
---| settings.json

将在 localhost:3000 上公开。

  • /_content/articles: 列出 content/articles/ 中的文件。
  • /_content/articles/hello-world: 获取 hello-world.md 作为 JSON。
  • /_content/index: 获取 index.md 作为 JSON。
  • /_content/settings: 获取 settings.json 作为 JSON。
  • /_content: 列出 indexsettings

该端点可在 GETPOST 请求上访问,因此您可以使用查询参数:https://127.0.0.1:3000/_content/articles?only=title&only=description&limit=10.

从 **v1.4.0** 开始,该端点还支持查询参数中的 where

  • 所有不属于任何默认键的键都将应用于 where

https://127.0.0.1:3000/_content/articles?author=...

  • 您可以使用 $operators 以及 _

https://127.0.0.1:3000/_content/articles?author_regex=...

此模块在内部使用 LokiJS。 您可以在此处查看 查询示例.

https://127.0.0.1:3000/_content/products?categories.slug_contains=top

您可以在 lib/middleware.js 中了解更多关于该端点的信息。