You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无SSR静态站点下如何实现nuxt-content关联查询(深度抓取)?

根因说明

你此前的逻辑在nuxt generate阶段失效,大概率是把关联处理逻辑放在了客户端运行时(比如onMounted)或者页面异步请求的后置处理中,静态生成阶段不会执行客户端逻辑,导致预渲染的静态文件没有嵌套关联后的数据。

解决方案

直接使用@nuxt/content内置的内容解析钩子,在静态编译阶段就完成所有关联字段的注入,后续查询直接拿到完整嵌套结构,完美适配无SSR静态站点场景。

步骤1:修改nuxt配置文件

在nuxt.config.ts中配置content:file:afterParse钩子,递归处理所有JSON5文件的关联字段:

export default defineNuxtConfig({
  modules: ['@nuxt/content'],
  hooks: {
    async 'content:file:afterParse'(file) {
      // 仅处理JSON5格式的内容文件
      if (file._extension !== 'json5') return

      // 配置关联映射:键为要关联的字段名,值为对应内容文件所在的content子目录,根目录填空字符串
      const relationMap = {
        cars: '',
        parts: ''
      }

      // 递归关联解析函数
      const resolve = async (item) => {
        for (const [field, path] of Object.entries(relationMap)) {
          // 跳过不存在/非数组类型的关联字段
          if (!Array.isArray(item[field])) continue
          // 批量查询对应slug的内容文件
          item[field] = await Promise.all(
            item[field].map(async (slug) => {
              const [target] = await queryContent(path)
                .where({ _slug: slug })
                .find()
              // 递归处理当前关联项的内部关联字段
              if (target) await resolve(target)
              return target
            })
          )
        }
      }

      await resolve(file)
    }
  }
})

步骤2:页面直接查询使用

无需再额外写关联处理逻辑,直接查询即可拿到你期望的完整嵌套结构:

// 页面中查询data.json5的内容
const { data: pageData } = await useAsyncData('pageData', () => {
  return queryContent('/data').findOne()
})

此时pageData的结构就和你要求的完全一致,nuxt generate阶段会直接把处理完成的静态数据打包到输出文件中,不需要运行时二次处理。

注意事项

  • 避免出现循环关联(比如A文件关联B,B又关联A),会导致递归死循环,可自行加层级限制或已处理标记规避
  • 关联字段中存储的slug要和对应JSON5文件的文件名完全一致(忽略后缀),nuxt-content默认会用文件名作为_slug字段值
  • 如果你的内容文件存放在content的子目录下,比如车辆文件都放在content/cars/目录,只要把relationMap中cars对应的值改为/cars即可

内容的提问来源于stack exchange,提问作者Derian André

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:06:02