使用源文件系统插件时是否可以在 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
来源?这是正确的,还是有某种解决方法?
例如:
- 如何为所有使用
typeName
(即模板页面)类型Trip
但是将这些页面中的每一个都托管在它们各自的父目录中,例如/tripA/day_1.html
、/tripB/day_1.html
等等?配置似乎采用单个 pathPrefix
除非有办法使用动态通配符路由?
- 如何使用不同的类型?在这里用不同的
typeName
创建一个单独的 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 类型——意味着所有文档的相同查询)。
我想要的内容文件夹结构如下:
- 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
来源?这是正确的,还是有某种解决方法?
例如:
- 如何为所有使用
typeName
(即模板页面)类型Trip
但是将这些页面中的每一个都托管在它们各自的父目录中,例如/tripA/day_1.html
、/tripB/day_1.html
等等?配置似乎采用单个pathPrefix
除非有办法使用动态通配符路由? - 如何使用不同的类型?在这里用不同的
typeName
创建一个单独的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 类型——意味着所有文档的相同查询)。