Hugo 如何维护站点范围的数据,比如 .Site.AllPages?

How does Hugo maintain site-wide data, like .Site.AllPages?

我正在寻找一些关于 Hugo 可能 如何管理站点范围数据的简短示例,例如 Site.AllPages

具体来说,Hugo 似乎太快 无法在开始生成页面并制作类似.Site.AllPages 可用——但显然必须如此。

Ruby (Jekyll) 和 Python (Pelican) 真的那么慢吗,或者 Hugo 是否使用某种特定的(算法)方法在一切之前生成页面准备好了吗?

可以看到AllPages in hugolib/page_collections.go

一个git blame表示在Sept. 2016 for Hugo v0.18 in commit 698b994, in order to fix PR 2297 Fix Node vs Page修改过。

该 PR 引用了 discussion/improvement proposal "Node improvements"

Most of the "problems" with this gets much easier once we agree that a page is just a page that is just a ... page...

And that a Node is just a Page with a discriminator.

So:

  • Today's pages are Page with discriminator "page"
  • Homepage is Page with discriminator "home" or whatever
  • Taxonomies are Pages with discriminator "taxonomy"
  • ...

They have some structural differences (pagination etc.), but they are basically just pages.

With that in mind we can put them all in one collection and add query filters on discriminator:

  • .Site.Pages: filtered by discriminator = 'page'
    *.Site.All: No filter
  • where: when the sequence is Pages add discriminator = 'page', but let user override

该密钥(鉴别器)允许快速检索所有 'pages'。

没有魔法,Hugo 不会开始任何渲染,直到 .Site.Pages 等集合已填满并准备就绪。

这里有一些要点:

  • 我们有一个处理管道,我们会尽可能地进行并发处理,因此您的 CPU 应该非常繁忙。
  • 每当我们进行内容操作(简码、表情符号等)时,您很可能会看到为提高速度而构建的手工解析器或替换函数。
  • 我们非常关心 "being fast" 部分,因此我们有一套可靠的基准来揭示任何性能回归。
  • Hugo 是用 Go 构建的——速度非常快,并且有一套非常好的工具(pprof、基准支持等)

使 hugo server 变体比常规 hugo 构建速度更快的其他几点:

  • Hugo 使用虚拟文件系统,在 server/development 模式下我们直接渲染到内存。
  • 我们有一些部分重新加载逻辑。因此,即使我们每次都渲染所有内容,我们也会尝试仅重新加载和重建已更改的内容文件,如果内容发生更改等,我们不会 reload/rebuild 模板。

我正在关注 GitHub,Hugo 的主要开发者。