通过静态站点生成器进行基于更改的再生



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

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

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

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

由于大多数人(尤其是Jekyll/GH Pages)用户都将他们的网站存储在git存储库中,因此网站生成器甚至可以利用提交信息来跟踪更改,并依靠这些信息来知道哪些文件需要重新生成,哪些文件可以单独保存。想法?

简单回答:这很难。

最困难的是不知道哪些文件被更改了。最困难的部分是知道哪些输出文件会受到更改文件的影响。例如,如果您更改博客文章的标题,则需要更新博客主索引。任何标签页也是如此。任何将其他帖子列为"相关帖子"的页面也是如此。若你们的主页上有摘录,也可以。

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

然而,更困难的是,要知道哪些页面需要重新生成,因为这些页面对尚未关联的项目进行了更改。如果你在博客文章中添加了一个新标签,会发生什么?现在,这个新标记的标记页也需要重新生成。如果你使用标签生成"相关帖子",你网站上的所有帖子都应该重新生成,因为任何给定帖子的"最佳"关系现在都可能不同。添加新帖子时会发生什么?为了避免不必要的编译,静态站点生成器必须知道的哪些页面会包含该帖子,并重新生成它们。

请注意,在所有这些情况下,假阳性(没有更改,但无论如何都会重新编译的页面)是可以接受的,但假阴性(应该重新编译,但没有)是绝对不可接受的。因此,在任何情况下,站点生成器都必须谨慎行事:如果页面在再次编译时可能会发生更改,则必须重新编译它。

例如,Nanoc确实会像你提到的那样跟踪变化。它保留依赖于其他页面的页面的有向无循环图,并在编译之间缓存它以限制重新编译的次数。它不会每一次重新生成的每个页面,但它会经常重新编译一些不需要编译的页面。还有很大的改进空间。

最新更新