静态站点生成器基于更改的重新生成

时间:2013-07-12 04:05:11

标签: web code-generation jekyll github-pages static-site

似乎所有我发现的静态站点生成器在每次对站点中的某个文件进行更改时都会重新生成整个站点。

例如,正在使用的一个更受欢迎的网站生成器是Jekyll,它为Github Pages提供支持。每当作者进行更改(比如在帖子文件中进行语法修正,或更改about.html布局)并需要重新生成该内容时,Jekyll别无选择重新生成整个网站,即使有数百个文件,其输出未被最近的编辑保持不变。

重建大型网站所需的时间似乎是对大多数静态网站生成器的常见抱怨。

是否有任何技术原因(来自静态站点生成器的开发或工程的POV)阻止某人编写一个对其内容“智能”的静态站点生成器,并且可以自我意识到它可以了解哪些文件已更改以及哪些文件依赖于它(反之亦然),并且只会重新生成必要的文件?

由于大多数人(尤其是Jekyll / GH Pages)用户将他们的网站存储在git存储库中,它甚至看起来像网站生成器可以利用提交信息并跟踪更改并依赖该信息来了解哪些文件需要再生,可以独自留下。想法?

1 个答案:

答案 0 :(得分:8)

简短回答:这很难。

困难的部分是不知道哪些文件发生了变化。困难的部分是知道哪些输出文件受到更改的文件的影响。例如,如果您更改博客帖子的标题,则需要更新主博客索引。任何标签页也是如此。任何将其他帖子列为“相关帖子”的页面也是如此。如果你的主页上有摘录,那就是同样的交易。

但这并非不可能。您可以保留一个有向的非循环图,它跟踪任何给定页面的依赖关系,并重新生成包含其他更改页面的页面。它增加了开销和代码复杂性,以及计算时间,但这样做可能是值得的。

但是,比这更难的是,知道哪些页面需要重新生成,因为他们尚未与之关联的项目进行更改。如果您在博客帖子中添加新标签会发生什么?现在,还需要重新生成该新标记的标记页面。如果您使用标签生成“相关帖子”,则应重新生成您网站上的所有帖子,因为现在任何特定帖子的“最佳”关系可能会有所不同。添加新帖子后会发生什么?为了避免不必要的编译,静态站点生成器必须知道 哪些页面包含该帖子(如果它已经存在),并重新生成它们。

请注意,在所有这些情况下,误报(未更改但仍重新编译的页面)都是可以接受的,但是否定错误(应该重新编译但不重新编译的页面)是绝对不可接受的。因此,在每种情况下,站点生成器都必须谨慎行事:如果页面发生任何更改的可能性再次编译,则必须重新编译。

例如,Nanoc会跟踪您提到的变化。它保留了依赖于其他页面的页面的有向非循环图,并在编译之间对其进行高速缓存以限制重新编译的次数。它不会在每个时间重新生成每个页面,但它经常重新编译一些不需要编译的页面。还有很大的提升空间。