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

问题描述 投票:0回答:2

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

例如,Jekyll 是目前最流行的网站生成器之一,它为 Github Pages 提供支持。每当作者做出更改(例如在帖子文件中进行语法更正,或更改 about.html 布局)并需要重新生成该内容时,Jekyll 就别无选择,只能重新生成整个网站,即使有数百个文件的输出在最近的编辑中没有改变。

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

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

由于大多数人(尤其是 Jekyll/GH Pages)用户都将他们的站点存储在 git 存储库中,因此站点生成器似乎可以利用提交信息并跟踪更改,并依赖该信息来知道哪些文件需要重新生成并且可以不去管它。想法?

web code-generation jekyll github-pages static-site
2个回答
8
投票

简短回答:很难。

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

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

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

请注意,在所有这些情况下,误报(未更改的页面,但无论如何都重新编译)是可以接受的,但误报(应该重新编译但没有重新编译的页面)是绝对不可接受的。因此,在每种情况下,站点生成器都必须谨慎行事:如果再次编译页面可能会发生更改,则“必须”重新编译它。 例如,Nanoc 确实会像您提到的那样跟踪更改。它保留依赖于其他页面的页面的有向非循环图,并在编译之间对其进行缓存以限制重新编译的次数。它不会每次都重新生成每个页面,但它会经常重新编译一些不需要编译的页面。还有很多需要改进的地方。

猎户座也是如此。请参阅智能内容依赖性管理

关键观察是,如果做得正确,在站点地图之外,图表是稀疏的。

0
投票
有关猎户座的更多信息请参见此处

猎户座

© www.soinside.com 2019 - 2024. All rights reserved.