使用源文件系统插件时是否可以在 gridsome 中使用嵌套文件夹?

Is it possible to use nested folders in gridsome when using the source-filesystem plugin?

我想要的内容文件夹结构如下:

- content (directory)
-- home.md

-- trip_A (directory)
--- intro.md
--- day_1.md
--- day_2.md

-- trip_B (directory)
--- intro.md
--- day_1.md

理想情况下,我想将其定义为 @gridsome/source-filesystem 插件的单个“源”,以便将来添加的子文件夹自动填充到源中。

但是,我似乎必须为每个子文件夹手动指定一个单独的 @gridsome/source-filesystem 来源?这是正确的,还是有某种解决方法?

例如:

您在 Gridsome 配置中尝试了什么?像下面这样的东西应该收集 content 目录及其任何子文件夹中的所有文件:

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

如果您以后添加 trip_C,它将自动包含在 collection 中。

或者,如果您不想递归扫描子文件夹,可以在 glob 模式中使用单个星号 (path: 'content/*/*.md')。

之所以可行,是因为您已将所有内容嵌套在 content 中。也可以在 path 字段中指定模式列表,如果您想将来自多个 top-level 目录的文件合并到一个 collection.

中,这可能会起作用

有帮助吗?

我发现这个问题最简单的解决方法是在gridsome config的Templates部分手动分配路径using a function

IE,对于这个插件设置...

var plugins = [
 {
    use: '@gridsome/source-filesystem',
    options: {
      path: '**/*.md',
      baseDir: 'temp/docs',
      typeName: 'Doc'
    }
  }
];

以及生成路径的函数...

function slugify(node) {
  var text = node.title;
  console.log(node);  
  var text = text.toString().toLowerCase()
    .replace(/\s+/g, '-')           // Replace spaces with -
    .replace(/[^\w\-]+/g, '')       // Remove all non-word chars
    .replace(/\-\-+/g, '-')         // Replace multiple - with single -
    .replace(/^-+/, '')             // Trim - from start of text
    .replace(/-+$/, '');            // Trim - from end of text
    return  node.fileInfo.directory + '/' + text;
}

以及引用模板对象中函数的 Gridsome 配置...

var gridsomeConfig = {
  siteName: siteName,
  icon: {
    favicon: favicon,
    touchicon: favicon
  },
  plugins: plugins,
  templates: {
    Doc:
      (node) => {
        return `/docs/${slugify(node)}/`
      }    
  }
}

并在各个子目录中给出了一些降价文件,即 /api 和 /ui...

您将在 /docs/ui、/docs/api 等处获得 Doc 类型的内容。只需要一个模板(GraphQL 类型——意味着所有文档的相同查询)。