gatsby.js - 高级入门 - 实现 2 个 url 前缀(站点的 2 个不同部分)?

Posted

技术标签:

【中文标题】gatsby.js - 高级入门 - 实现 2 个 url 前缀(站点的 2 个不同部分)?【英文标题】:gatsby.js - advanced starter - Implement 2 url prefixes (2 different sections of site)? 【发布时间】:2019-03-02 19:20:54 【问题描述】:

看起来好像你把你的 jsx 文件放在大多数 gatsby starters 的“pages”文件夹中,url 遵循开箱即用的目录结构,所以你可以实现你需要的任何 url (http://blah.com/ foo/post1, http://blah.com/bar/post2) 只需在源树中嵌套文件夹(pages/foo/post.jsx, pages/bar/post2.jsx)。

问题

我使用了 gatsby 高级启动器 (https://github.com/Vagr9K/gatsby-advanced-starter)。它将所有内容文件不在pages/ 中,而是在***content/ 文件夹中,即使在创建content/foo/post1.mdcontent/bar/post2.md 之后,我也无法弄清楚复制 foo/xxx、bar/xxx url 的布线文件夹。

确实有一个siteconfig.js,它设置了一个路径前缀,但我想要两个为站点的2个不同部分设置不同的前缀,所以我只是设置现在它改为“/”(构建似乎忽略了我为此配置参数设置的任何值,所以......耸耸肩)。

我尝试了什么

我尝试将path 添加到.md 文件的frontmatter 并将其设置为父文件夹名称。这完全被忽略了(无论如何我认为这不是我想要的......我想将生成的 slug 保留为 url 的一部分)。 为每个子文件夹单独使用 gatsby-source-filesystem 一个,希望它会更改 graphql graph 以识别 2 个单独的数据源,但没有任何区别。

我做错了什么?

【问题讨论】:

【参考方案1】:

看起来好像您将 jsx 文件放在大多数 gatsby 初学者的“页面”文件夹中,网址遵循开箱即用的目录结构 [...]

这并不特定于 Gatsby 初学者,这是 Gatsby 的默认行为。 src/pages 中的每个 js/jsx 文件都会是一个页面。

但在*** content/ 文件夹中

它仍然有用于普通页面的src/pages 文件夹。但是content 文件夹包含的文件将与gatsby-node.js 中的src/templates 一起转换为页面。或者换句话说:content 文件夹的内容是使用gatsby-node.js 中定义的模板以编程方式创建的(模板位于src/templates 中)。


路径/url 在此处的createPage 函数中定义:gatsby-nodeL144。这一行引用了edge.node.fields.slug,它在here 上方的GraphQL 中被查询。该字段被添加到 onCreateNode 函数中。更具体地说,onCreateNodeField 函数中的 slug 字段。在那里你看到它通过了上面定义的slug


在您的 src/content 文件夹中创建两个文件夹,例如blogprojects。确保在 gatsby-config.js 中定义了它们:


  resolve: 'gatsby-source-filesystem',
  options: 
    name: 'blog',
    path: `$__dirname/content/blog`,
  ,
,

  resolve: 'gatsby-source-filesystem',
  options: 
    name: 'projects',
    path: `$__dirname/content/projects`,
  ,
,

在您的gatsby-node.js 中,在fileNode 定义之后添加以下行:

const pathPrefix = fileNode.sourceInstanceName

sourceInstanceName 是我们在 gatsby-config 条目中定义为 name 的内容。

然后您可以将line 更改为:

createNodeField( node, name: "slug", value: `/$pathPrefix$slug` );
createNodeField( node, name: 'sourceInstanceName', value: pathPrefix );

如果您只想查询两个文件夹之一,第二行会很有帮助,例如:

export const pageQuery = graphql`
  query BlogQuery 
    allMarkdownRemark(filter:  fields:  sourceInstanceName:  eq: "blog   
    ) 
        edges 
          node 
            ... etc
          
        
      
  
`

【讨论】:

非常感谢您耐心地解释这一点 - 我现在更了解 gatsby 并且感谢您提供了这个很棒的首发! 如何编辑它以在“/blog”而不是“/”生成页面?我设法通过编辑this line 将它们移动到“/blog”,在“/”之后添加“blog”,但这会在尝试导航到以前的博客页面时破坏导航(单击“previous”或“1”)跨度>

以上是关于gatsby.js - 高级入门 - 实现 2 个 url 前缀(站点的 2 个不同部分)?的主要内容,如果未能解决你的问题,请参考以下文章

Gatsby.js:使用 URL 参数和浏览器后退/前进按钮导航

在gatsby js中对json文件进行Graphql过滤[已关闭]。

如何使用 Graphql 从 Strapi 查询 Gatsby 中的多个图像

在Gatsby JS中动态生成路由

在 Gatsby 上创建第二个博客模板

尝试安装 gatsby.js,出现很多错误