Выглядит так, как будто вы помещаете ваши файлы jsx в папку 'pages' большинства стартеров Гэтсби, URL-адреса следуют структуре каталогов из коробки [...]
Это не только для начинающих Гэтсби, это поведение Гэтсби по умолчанию.Каждый файл js / jsx в src/pages
будет страницей.
, но в папке content/
верхнего уровня
В нем по-прежнему есть папка src/pages
для обычных страниц.Но папка content
содержит файлы, которые будут преобразованы с src/templates
в gatsby-node.js
в страницы.Или другими словами: содержимое папки content
создается программным способом с использованием определенного шаблона в gatsby-node.js
(а шаблон находится в src/templates
).
Определен путь / URL-адрес getв функции createPage
здесь: gatsby-nodeL144 .Эта строка ссылается на edge.node.fields.slug
, который запрашивается в GraphQL выше здесь .Поле добавляется в функцию onCreateNode .В частности, поле slug
в функции onCreateNodeField .Там вы видите, что ему передается slug
, который определен выше.
Создайте две папки в вашей папке src/content
, например, blog
и projects
.Убедитесь, что они оба определены в вашем gatsby-config.js
:
{
resolve: 'gatsby-source-filesystem',
options: {
name: 'blog',
path: `${__dirname}/content/blog`,
},
},
{
resolve: 'gatsby-source-filesystem',
options: {
name: 'projects',
path: `${__dirname}/content/projects`,
},
},
В вашем gatsby-node.js
добавьте после определения fileNode строку:
const pathPrefix = fileNode.sourceInstanceName
sourceInstanceName
- это то, что мы определили как name
в gatsby-config
записях.
Затем вы можете изменить строку на:
createNodeField({ node, name: "slug", value: `/${pathPrefix}${slug}` });
createNodeField({ node, name: 'sourceInstanceName', value: pathPrefix });
Вторая строка полезна, если вы хотите запросить только одну из двух папок, например:
export const pageQuery = graphql`
query BlogQuery {
allMarkdownRemark(filter: { fields: { sourceInstanceName: { eq: "blog } } }
) {
edges {
node {
... etc
}
}
}
}
`