如何在整个Gatsby帖子标题网站上更改?

时间:2019-01-20 04:35:33

标签: gatsby

我希望我的帖子标题为标题大小写。

  1. 它必须在整个网站范围内(不仅在<Helmet>之类的地方。我想避免重复和丢失引用的可能性。

  2. 我不想回到我的帖子并更新每篇不是标题的文章。

是否有方法可以覆盖前题?我尝试在gatsby-node.js中进行更改,但不确定在哪里添加/更改。

2 个答案:

答案 0 :(得分:1)

我找到了一个我认为是hack的解决方案。在创建节点onCreateNode期间,可以通过在将节点推送到节点数组之前对其进行更新来覆盖前题。我利用postNodes数组(到gatsby-node范围的全局数组)创建我的博客页面。

createNodeField({ node, name: "slug", value: slug })
node.frontmatter.title = _.startCase(_.toLower(node.frontmatter.title))
postNodes.push(node)

然后,在创建帖子页面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;
    })

注意 在编写该代码时,上一个和下一个无效,因此需要对其进行修改。

答案 1 :(得分:0)

我碰巧需要修改externalized checkpoint修改前事的方式,这使我想起了这个问题。做到这一点的方法非常完美,我只想提供另一种选择。这是您可以覆盖前题的方法:

在内部,gatsby-transformer-remark使用graymatter解析markdown的前题(将md处理为yaml)。我们可以修改Graymatter的默认解析器行为,以直接覆盖frontmatter。

gatsby-transformer-remark

然后将其传递给// 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; }

gatsby-transformer-remark

盖茨比查询结果:

{
  resolve: `gatsby-transformer-remark`,
  options: {
+   engines: {
+     yaml: customParser,
+   },
    plugins: [
      ...
    ],
  },
},