Посмотрите на этот стартер и прочитайте Гетсби учебник Часть 7
gatsby-node.js
const replacePath = path => (path === `/` ? path : path.replace(/\/$/, ``))
const { createFilePath } = require(`gatsby-source-filesystem`)
const path = require("path")
exports.onCreateNode = ({ node, getNode, actions }) => {
const { createNodeField } = actions
if (node.internal.type === `MarkdownRemark`) {
const slug = createFilePath({ node, getNode, basePath: `blog` })
createNodeField({
node,
name: `slug`,
value: replacePath(slug),
})
}
}
exports.createPages = ({ actions, graphql }) => {
const { createPage } = actions
const postTemplate = path.resolve(`src/templates/postTemplate.js`)
return graphql(`
{
allMarkdownRemark(
sort: { order: DESC, fields: [frontmatter___date] }
limit: 1000
) {
edges {
node {
fields {
slug
}
}
}
}
}
`).then(result => {
if (result.errors) {
return Promise.reject(result.errors)
}
result.data.allMarkdownRemark.edges.forEach(({ node }) => {
createPage({
path: replacePath(node.fields.slug),
component: postTemplate
})
})
})
}
Здесь, в onCreateNode
, если внутренний тип узла MarkdownRemark
, создается путь к файлу с базовым путем blog
, и этот новый путь к файлу добавляется в новое поле узла с именем slug
.
Это новое поле теперь доступно в любых запросах graphQL.
Итак, позже в createPages
, новое поле slug
запрашивается и используется в опции пути createPage
.
Таким образом, страницы в вашей папке src/blog
будут обслуживаться из корня, а сообщения, генерируемые MarkdownRemark
, будут обрабатываться с /blog/