首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >停止Gatsby博客文章段塞包括个人帖子文件夹

停止Gatsby博客文章段塞包括个人帖子文件夹
EN

Stack Overflow用户
提问于 2020-04-03 21:01:35
回答 2查看 346关注 0票数 1

我遇到了一个问题,在制作一个个人盖茨比网站,其中的博客帖子文件有他们独特的文件夹包括在弹格。

例如,以下文件结构:

代码语言:javascript
运行
复制
data
|
|– blog
   |
   |– blog-1
   |  |
   |  |-blog-1.mdx
   |  |-img.jpg
   |
   |– blog-2
   |  |
   |  |-blog-2.mdx
   |  |-img.jpg
   |
   |– blog-3
   |  |
   |  |-blog-3.mdx
   |  |-img.jpg

例如,威尔生产这样的鼻涕虫。

代码语言:javascript
运行
复制
{
  "data": {
    "allMdx": {
      "edges": [
        {
          "node": {
            "fields": {
              "slug": "/blog-1/blog-1/"
            },
            "frontmatter": {
              "title": "Blog 1",
              "posttype": "blog"
            }
          }
        },
        {
          "node": {
            "fields": {
              "slug": "/blog-2/blog-2/"
            },
            "frontmatter": {
              "title": "Blog 2",
              "posttype": "blog"
            }
          }
        },
        {
          "node": {
            "fields": {
              "slug": "/blog-3/blog-3/"
            },
            "frontmatter": {
              "title": "Blog 3",
              "posttype": "blog"
            }
          }
        },

我希望他们能生产出这样的鼻涕虫:

代码语言:javascript
运行
复制
        {
          "node": {
            "fields": {
              "slug": "/blog-1/"
            },
            "frontmatter": {
              "title": "Blog 1",
              "posttype": "blog"
            }
          }
        },

blog文件夹的路径包含在我的gatsby中,如下所示:

代码语言:javascript
运行
复制
    {
      resolve: `gatsby-source-filesystem`,
      options: {
        path: `${__dirname}/data/blog`,
        name: `blog`,
      },
    },

然后我的gatsby节点文件夹设置如下:

代码语言:javascript
运行
复制
const path = require(`path`)
const { createFilePath } = require(`gatsby-source-filesystem`)

exports.createPages = ({ graphql, actions }) => {
  const { createPage } = actions
  const blogPost = path.resolve(`./src/templates/blog-post.js`)
  const portfolioPost = path.resolve(`./src/templates/portfolio-post.js`)
  const journeyPost = path.resolve(`./src/templates/journey-post.js`)

  return graphql(
    `
      {
        allMdx(
          sort: { fields: [frontmatter___date], order: DESC }
          limit: 1000
        ) {
          edges {
            node {
              fields {
                slug
              }
              frontmatter {
                title
                posttype
              }
            }
          }
        }
      }
    `
  ).then(result => {
    if (result.errors) {
      throw result.errors
    }

    const posts = result.data.allMdx.edges

    posts.forEach((post, index) => {
      const previous = index === posts.length - 1 ? null : posts[index + 1].node
      const next = index === 0 ? null : posts[index - 1].node

      if (post.node.frontmatter.posttype == "portfolio") {
        createPage({
          path: `/portfolio${post.node.fields.slug}`,
          component: portfolioPost,
          context: {
            slug: post.node.fields.slug,
            previous,
            next,
          },
        })
      } else if (post.node.frontmatter.posttype == "journey") {
        createPage({
          path: `/journey${post.node.fields.slug}`,
          component: journeyPost,
          context: {
            slug: post.node.fields.slug,
            previous,
            next,
          },
        })
      } else {
        createPage({
          path: `/blog${post.node.fields.slug}`,
          component: blogPost,
          context: {
            slug: post.node.fields.slug,
            previous,
            next,
          },
        })
      }
    })

    return null
  })
}

exports.onCreateNode = ({ node, actions, getNode }) => {
  const { createNodeField } = actions

  if (node.internal.type === `Mdx`) {
    const value = createFilePath({ node, getNode })
    createNodeField({
      name: `slug`,
      node,
      value,
    })
  }
}

注意到,这个文件中的旅程和投资组合路径此时与博客路径完全相同。它们是以完全相同的方式设置的,并根据posttype而被拆分。页面被创建得很好,但是它们都使用了不想要的folder/file.mdx段塞。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-03 21:36:51

通过查看其他博客的例子来修正。

Post文件名需要为index.mdindex.mdx

票数 0
EN

Stack Overflow用户

发布于 2020-06-24 10:35:48

我确信有更好的方法,但我能够通过修改gatsby-node.js来解决这个问题,只在文件路径中的最后一个斜杠(/)之后才使用子字符串。如果有人知道更好的方法,我会很高兴知道的。

旧:

代码语言:javascript
运行
复制
exports.onCreateNode = ({ node, actions, getNode }) => {
  const { createNodeField } = actions

  if (node.internal.type === `MarkdownRemark`) {
    const value = createFilePath({ node, getNode })
    createNodeField({
      name: `slug`,
      node,
      value,
    })
  }
}

新的:

代码语言:javascript
运行
复制
exports.onCreateNode = ({ node, actions, getNode }) => {
  const { createNodeField } = actions

  if (node.internal.type === `MarkdownRemark`) {
    const value = createFilePath({ node, getNode, trailingSlash:false })
    createNodeField({
      name: `slug`,
      node,
      value: `${value.indexOf("/") > -1 ? value.substring(value.lastIndexOf("/")) : value}`,
    })
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61020352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档