在摇动构建中是否可能依赖于内存中的值而不是文件?

问题描述

我正在使用shake编写静态网站构建器,并试图实现一种效率的方式来持久化网站的导航(以及每个页面的一些元数据)。事实证明,这比我想象的要复杂:

如果在每个页面的构建操作结束时对站点元数据进行了更新,则将导致对站点元数据进行反序列化,更新,序列化并写入磁盘,这可能会进行数百次(一次用于oeach build-规则)。

相反,我正在考虑将站点元数据读取到最顶部的IORef中,并在每个页面的构建操作结束时更新内存IORef

但是,这可能导致两个问题:

  • 如何使sitemap.xml规则依赖于此IORef,以及如何确保它最终运行?
  • 我如何使每个页面都依赖此IORef,因为这里实际上存在循环依赖关系-每个页面都依赖更新站点元数据。

如果我使它变得更复杂了,那么实现此目标的另一种有效方法是什么?

解决方法

首先,在进行优化之前,可能有必要仔细检查一下序列化等昂贵的假设。在很多情况下,这不是问题。但是让我们假设它太昂贵了。

最大的问题是循环依赖性。如果可以设计出来的话,Shake中有很多解决方案可以避免重复序列化等。我宁愿考虑将依赖项设计为:

  1. 每个页面分别生成其元数据。
  2. 一个从所有页面收集所有元数据的规则,这取决于步骤1中的每个规则。
  3. 每个页面取决于其自己的元数据以及根据2收集/汇总的元数据。

现在,您已经消除了循环。您还导致规则2仅聚合/序列化一次。

但是您仍然需要多次反序列化,这可以通过newCache消除,它可以引入对文件反序列化形式的依赖性-规则仍然取决于文件,但是通过应用转变。

最后一点,如果采用上述公式,您可能希望第2步直接生成侧边栏/顶部栏内容,然后也可以共享所有渲染这些功能的工作。