我添加了一个与 NetlifyCMS 集成的博客页面,效果非常好。但是,我需要在我的网站上有一个更多的动态页面来显示服务,并且每个服务都有自己的生成模板,理论上与博客页面非常相似。
因此,我阅读了许多不同的解决方案,但始终碰壁。我在这里做错了什么?实现这项工作的最简单方法是什么,因为我不会再添加任何其他动态页面。
这是我刚刚拥有博客页面时的 gatsby-node.js,一切都运行良好:
const { createFilePath } = require("gatsby-source-filesystem")
exports.onCreateNode = ({ node, actions, getNode }) => {
const { createNodeField } = actions
if (node.internal.type === `MarkdownRemark`) {
const value = createFilePath({ node, getNode })
createNodeField({
name: `slug`,
node,
value,
})
}
}
//Blog
async function getPageData(graphql) {
return await graphql(`
{
blogPosts: allMarkdownRemark {
edges {
node {
fields {
slug
}
}
}
}
}
`)
}
const path = require(`path`)
exports.createPages = async ({ graphql, actions }) => {
const { data } = await getPageData(graphql)
data.blogPosts.edges.forEach(({ node }) => {
const { slug } = node.fields
actions.createPage({
path: `/articles${slug}`,
component: path.resolve("./src/templates/articlepost.js"),
context: {slug: slug },
})
})
}
所以我尝试做同样的事情,但添加了我的服务页面。最终的结果是这样的:
gatsby-node.js
const { createFilePath } = require("gatsby-source-filesystem")
exports.onCreateNode = ({ node, actions, getNode }) => {
const { createNodeField } = actions
if (node.internal.type === `MarkdownRemark`) {
const value = createFilePath({ node, getNode })
createNodeField({
name: `slug`,
node,
value,
})
}
}
async function getBlogData(graphql) {
return await graphql(`
{
blogPosts: allMarkdownRemark(
filter: { frontmatter: { template: { eq: "articlepost" } } }
) {
edges {
node {
fields {
slug
}
}
}
}
}
`)
}
正如您所看到的,我在 config.yml 中添加了一个模板类型,该模板类型现在显示在我的 frontmatter 中以分隔我的帖子,但我认为这可能让我更加困惑。从 frontmatter 中删除模板类型完全没问题,但确实需要一种非常简单的方法才能实现这一点。
Smart猫小萌
墨色风雨
相关分类