【问题标题】:Next.js 9.3+ and catch-all routesNext.js 9.3+ 和包罗万象的路线
【发布时间】:2020-12-15 13:22:20
【问题描述】:

Next.js 初学者在这里,希望获得有关使用 getStaticPathsgetStaticProps 与包罗万象的路线的指针。大多数 Next.js 9.3+ 博客启动器似乎仅基于一个级别的博客文章(例如,/posts/post-1.md/posts/post-2.md 等),但我徒劳地试图找到的是一个启动器——或者只是一个一组指令——地址处理,例如,/posts/yyyy/mm/postname.md/pages/posts/[...post].js

当然,我确实阅读了有关这些项目的 Next.js 文档,但我发现它们至少在这种特殊情况下有点帮助。我确实意识到它们是为更有经验的 Next.js 开发人员编写的。来自https://nextjs.org/docs/routing/dynamic-routes 的这一项让我现在尽可能接近,但还不够远:

如果页面名称使用包罗万象的路由,例如pages/[...slug],则params 应包含slug,它是一个数组。例如,如果这个数组是['foo', 'bar'],那么 Next.js 会在/foo/bar处静态生成页面。

我尝试使用fs-readdir-recursive 来读取/posts/ 目录的各个级别,这很有效,但是它给我的东西并没有产生getStaticPaths 想要的数组。我确定我只需要按摩结果,但找不到任何示例来帮助我弄清楚。 (大多数确实比一级场景更进一步的例子似乎处理从数据库中获取,也许是因为我试图找到的场景被认为太简单了。对于非初学者来说可能是这样,但是......)

【问题讨论】:

    标签: javascript next.js blogs getstaticprops getstaticpaths


    【解决方案1】:

    如果您的帖子都遵循相同的 URL 模式,我宁愿使用以下结构:

    pages/
    └── posts/
        └── [year]/
            └── [month]/
                └── [slug].js
    

    根据您存储帖子的方式,您的getStaticPaths 只需列出帖子并为每个帖子公开yearmonthslug

    export async function getStaticPaths() {
      const posts = await getAllPosts()
    
      return {
        fallback: false,
        paths: posts.map(post => ({
          params: {
            year: post.year,
            month: post.month,
            slug: post.slug
          }
        })
      }
    }
    

    然后您将可以访问getStaticProps 中的所有yearmonthslug 参数。

    export async function getStaticProps({params}) {
      // Retrieve blog post from year, month and slug
      const post = await getBlogPost({
        year: params.year,
        month: params.month,
        slug: params.slug
      })
    
      return {
        props: {
          post
        }
      }
    }
    

    【讨论】:

    • 谢谢你,伯特兰。这确实是我通常的模式,但我无法从文档中得知其中有多少项目可以“加载”,可以这么说。试试这个。我曾尝试过[year][month] 文件夹,但由于某种原因发生了冲突。这是有道理的。
    • 猜猜我想知道getAllPosts——对于大多数初学者来说似乎使用fs.readdirSync("/path/to/posts")——是否可以像fs-readdir-recursive一样容易地用于从回购的根级别下降多个级别到获取帖子的 Markdown 文件。
    • getAllPosts 可以是你想要的任何东西,递归(或不)列出文件,从数据库中检索数据,从远程 API 获取。最终一切都将是静态的。
    • 我处于同样的情况,我梳理了文档,但它们有点短。实施上述解决方案时,我仍然遇到错误。 stackoverflow.com/questions/64163620/…
    猜你喜欢
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多