Исходный код сетки-описание тега добавления файловой системы

#graphql #gridsome #yaml-front-matter #gridsome-plugin #gridsome-source-filesystem

#graphql #gridsome #yaml-front-matter #gridsome-плагин #исходный код сетки-файловая система

Вопрос:

Я использую @gridsome/source-filesystem с этой конфигурацией:

 {
  use: '@gridsome/source-filesystem',
  options: {
    typeName: 'Post',
    path: 'content/posts/**/*.md',
    refs: {
      tags: {
        typeName: 'Tag',
        create: true
      },
      author: {
        typeName: 'Author',
        create: true
      }
    }
  },
}
  

Теперь я хочу добавить description только для одного тега, поэтому я создал новый документ в content/posts/my-tag.md :

 ---
title: Tag-Title
description:tag description
---
  

Как я могу подключить этот документ к allTags коллекции?

Или любым другим способом (например, без @gridsome/source-filesystem for Tags ) добавить description к exists node в collection ?

Ответ №1:

Если вы хотите просто добавить allTags , вы можете создать markdown для этого.

в gridsome.config.js

 ...
    {
      use: '@gridsome/source-filesystem',
      options: {
        path: 'content/tags/**/*.md',
        typeName: 'Tag'
      },
    }
...
  

добавить файл content/tags/my-tag.md

 ---
title: Tag-Title
description: tag description
---
  

вы можете использовать

 {
  allTag {
    edges {
      node {
        id
        title
        description
      }
    }
  }
}
  
 {
  "data": {
    "allTag": {
      "edges": [
        {
          "node": {
            "id": "******", // random hash
            "title": "Tag-Title",
            "description": "tag description"
          }
        },
        {
          "node": {
            "id": "foo",
            "title": "foo",
            "description": ""
          }
        },
...
  

но это не позволяет подключиться к вашему Post .

или просто добавить описание в Tag , вы можете использовать addSchemaResolvers . в gridsome.server.js

 module.exports = function(api) {
  api.loadSource(async ({ addSchemaResolvers }) => {
    addSchemaResolvers({
      Tag: {
        description: {
          type: "String",
          resolve(obj) {
            if (!obj.description) {
              // coding your logic
              return "set description";
            } else {
              return obj.description;
            }
          }
        }
      }
    });
  });
};
  

Комментарии:

1. Это кажется хорошим направлением. Я понимаю, что логика будет выполняться при каждом обращении к свойству. Невозможно загрузить всю информацию один раз? То есть добавить информацию поверх информации, сгенерированной из исходной файловой системы?

2. Если вам не нужно создавать тег в Post, вы можете связать файлы markdown друг с другом. { typeName: 'Tag', create: false } и добавить id: your-id к content/tags/my-tag.md , добавить tags: ['your-id'] к content/posts/**/*.md . Если вам нужен образец, я добавлю другой ответ, просто запросите его.

3. Но таким образом я должен создать x-tag.md файл для каждого тега в content/posts/**/*.md , верно? Здесь есть компромисс — создавать теги в отдельных файлах или с помощью post , но нет официального способа ** создать из post, если не существует в другом файле **? Если нет, я отмечу этот вопрос как ответ, поскольку в моем вопросе есть ограничение не создавать .md для каждого тега, поэтому другое решение не будет принято.

4. вы правы. извините, я не могу придумать лучшего способа сделать это: ( спасибо