Gatsby 如何在网站范围内更改盖茨比邮报的标题?

Gatsby 如何在网站范围内更改盖茨比邮报的标题?,gatsby,Gatsby,我希望我的文章标题是标题案例 它必须是站点范围的(不仅仅是在这样的地方)。我希望避免重复和丢失引用的可能性 我不想回到我的帖子,更新每一篇不是标题的帖子 有没有一种方法可以覆盖frontmatter?我尝试在gatsby node.js中更改它,但我不确定在哪里添加/更改它。我找到了一种解决方案,我认为这是一种黑客攻击。frontmatter可以在创建节点onCreateNode的过程中通过在推送到节点数组之前更新节点来覆盖。我利用epostNodesarray(gatsby节点作用域的全局数组

我希望我的文章标题是标题案例

  • 它必须是站点范围的(不仅仅是在
    这样的地方)。我希望避免重复和丢失引用的可能性

  • 我不想回到我的帖子,更新每一篇不是标题的帖子


  • 有没有一种方法可以覆盖frontmatter?我尝试在
    gatsby node.js
    中更改它,但我不确定在哪里添加/更改它。

    我找到了一种解决方案,我认为这是一种黑客攻击。frontmatter可以在创建节点
    onCreateNode
    的过程中通过在推送到节点数组之前更新节点来覆盖。我利用e
    postNodes
    array(gatsby节点作用域的全局数组)来创建我的博客页面

    createNodeField({ node, name: "slug", value: slug })
    node.frontmatter.title = _.startCase(_.toLower(node.frontmatter.title))
    postNodes.push(node)
    
    然后,当创建post页面时,
    exports.createPages
    ,将使用具有更新值的
    postNodes

        let idx = 0;
        postNodes.map(node => {
          let previous = idx - 1 < 0 ? postNodes[postNodes.length - 1] : postNodes[idx - 1]
          let next = idx + 1 >= postNodes.length ? postNodes[0] : postNodes[idx + 1]
    
          createPage({
            path: node.fields.slug,
            component: postPage,
            context: {
              slug: node.fields.slug,
              prev: previous.fields.slug,
              next: next.fields.slug
            }
          })
          idx += 1;
        })
    
    设idx=0;
    postNodes.map(节点=>{
    让previous=idx-1<0?postNodes[postNodes.length-1]:postNodes[idx-1]
    设next=idx+1>=postNodes.length?postNodes[0]:postNodes[idx+1]
    创建页面({
    路径:node.fields.slug,
    组成部分:后期,
    背景:{
    slug:node.fields.slug,
    prev:previous.fields.slug,
    下一个:next.fields.slug
    }
    })
    idx+=1;
    })
    

    注意在编写代码时,上一个和下一个不起作用,因此需要修改。

    我碰巧需要修改《盖茨比变形金刚评论》修改frontmatter的方式,这提醒了我这个问题。在我看来,你这样做很好,我只想提供另一种选择。下面是如何做的您可以覆盖frontmatter:

    在内部,
    gatsby transformer remark
    用于解析markdown的frontmatter(将md视为yaml)。我们可以修改graymatter的默认解析器行为以直接重写frontmatter

    // should come with `gatsby-transformer-remark` by default
    // if it's missing, install it `yarn add js-yaml`
    const yaml = require('js-yaml');
    
    const customParser = (str) => {
      const result = yaml.safeLoad(str);
    
      // modify `title`. In Gatsby, `title` is guaranteed to exist,
      // but you might want to add a check for other properties.
      if (result.title) {
        result.title = result.title.toUpperCase();
      }
      return result;
    }
    
    然后把它传给盖茨比变压器评论

    {
      resolve: `gatsby-transformer-remark`,
      options: {
    +   engines: {
    +     yaml: customParser,
    +   },
        plugins: [
          ...
        ],
      },
    },
    
    盖茨比查询结果:

    {
      "data": {
        "markdownRemark": {
          "frontmatter": {
            "title": "I AM CAPITALIZED"
          }
        }
      }
    }
    

    你好@cbillowes,你能分享更多你的
    onCreateNode
    吗?什么是
    postNodes
    ,它来自哪里?它是
    gatsby node.js
    中的一个全局数组,在
    addSiblingNodes
    中被调用,我在
    createPages
    中使用了它,因为上一个和下一个在当时都不起作用。这是一个黑客为什么我没有将我的答案标记为答案。必须有一种更干净、更有效的方法来做这件事。我将更新我的答案以获得更多的代码。