【问题标题】:How to progamatically create pages in gatsby with a CMS backend?如何使用 CMS 后端以编程方式在 gatsby 中创建页面?
【发布时间】:2020-06-25 02:20:46
【问题描述】:

我有一个 Django CMS 作为我的后端应用程序。我正在尝试在我的 Gatsby 前端站点中动态创建页面。我的 Django 应用程序使用 Graphene 通过 GraphQL 公开。但我无法从后端 CMS 查询 slug 并使用 gatsby-node.js 创建页面。在后端应用中创建页面时如何创建页面?

想法是

//gatsby-node.js

exports.createPages = ({ graphql, actions }) => {
    const pages = graphql`
        {
            blogPages{
                edges{
                    node{
                        slug     // this slug supposed to come from the backend CMS (Atleast i think)
                    }
                }
            }
        }
    `;

    const { createPage } = actions
    const blogTemplate = path.resolve(`src/templates/blogTemplate.js`);

    pages.blogPages.edges.forEach(edge => {   //this should help to create dynamic pages - slug coming from backend CMS
      const slug = edge.node.blogpage.slug;
      createPage({
        path: slug,
        component: blogTemplate
    })  
  })
}

【问题讨论】:

  • 你能在 graphiql 中查询blogPages 吗?
  • 从后端我可以使用 graphiql 进行查询。从前端我可以使用 apollo 在组件中动态地进行查询。我决定不使用 gatsby-source-wagtail,因为它没有给我动态查询(如果我在后端 CMS 中创建新节点,则不会更新,除非重新构建应用程序以进行构建 - 重新获取间隔仅适用于开发环境)
  • createPage 只能在 build/dev 中使用 - 部署的站点可以上传到静态服务器然后 没有动态页面创建的可能性 - 只有动态数据加载/js/react /apollo [client-side] 逻辑 - 使用 webhook 构建(重新部署)整个站点
  • 同意@xadm。您可能首先使用gatsby-source-graphql 有一些运气,这样createPages 步骤就成为可能。当您在 Django CMS 中创建新页面时,触发与您的主机的 webhook 以重建项目,获取新创建的内容。
  • 感谢@xadm,那么在这种情况下,是否有可能执行 apollo 客户端逻辑来获取某些组件中的 slug 并将结果导入 gatsby-node.js .. 或者这个想法完全反对gatsby-node.js 的生命周期

标签: reactjs graphql gatsby


【解决方案1】:

在 cmets 中已经说过,但只是总结一下:由于 Gatsby 是一个静态站点生成器,因此您不能在运行时动态添加页面。每个页面都对应于自己的 html 文件,需要在您的网络服务器上创建该文件。这不是你可以在运行时做的事情。

您可以做的是设置一个持续集成工作流程,您可以在某个地方在云中运行构建。当您在 Django 中进行更改时触发它,或者定期(每小时/每天)运行它以更新站点。

如果运行重建不适用于您的用例,您需要查看完全不同的架构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2020-04-29
    • 2018-06-23
    • 1970-01-01
    • 2021-06-09
    相关资源
    最近更新 更多