【问题标题】:In Compiled Heist (Haskell), why must splices be created beforehand?在 Compiled Heist (Haskell) 中,为什么必须事先创建拼接?
【发布时间】:2016-08-29 01:45:54
【问题描述】:

我可以理解为什么必须事先处理 HTML 模板(.tpl 文件)(使用loadTemplates)并放入HeistConfig。这允许 Heist 预先将 HTML 处理成更有效的格式。

但是,我不明白为什么还必须预先创建 拼接 并将其放入 HeistConfig 中。这有什么好处?我没有看到好处,因为无论如何拼接都是在运行时计算的。这背后的思考过程是什么?

我认为这可能是因为拼接也可以在加载时间(除了运行时)执行代码。这是主要的解释吗?

【问题讨论】:

    标签: haskell haskell-snap-framework heist


    【解决方案1】:

    拼接函数(编译和解释)在节点上运行。将拼接视为具有Node -> m [Node] 的类型签名。这是一个相对昂贵的操作,因为它是在 DOM 级别上操作的。拼接的结果节点被插入回 DOM 树中,然后必须将整个树渲染为 ByteString。编译抢劫背后的想法是在应用程序初始化时尽可能多地完成这种渲染工作。初始化的输出是[Chunk],其中Chunk 可以是静态ByteString 或动态m ByteString(实际类型略有不同)。在初始化将整个模板从[Node] 转换为[Chunk] 之前,必须处理已编译的拼接。为了最大限度地提高运行时效率,转换发生在应用初始化时。

    有关更多信息,请查看以下链接:

    http://snapframework.com/docs/tutorials/compiled-splices

    https://github.com/snapframework/heist/wiki/Compiled-Splice-Formulations

    【讨论】:

    • 但是如果计算(从数据库中获取等)和它的块转换必须在运行时完成,为什么我必须在加载时创建拼接呢?为什么会提高效率?
    • 我可以理解为什么在加载时创建拼接会提高效率,如果它在加载时做一些重要的事情。但是在运行时完成所有工作的接头呢?这就是我的问题的重点。
    • @haskellHQ 重读你自己已经说过的 cmets。这样一些拼接可以优化,而必须在运行时运行的拼接不能在任何情况下都可以优化。在优化可以优化的东西和不优化任何东西之间,图书馆设计师应该选择什么?
    • @Bakuriu 这是一个很好的观点。 mightybyte:你能确认 Bakuriu 的 cmets 反映了图书馆设计师(你的?)的思维过程吗?这将清除一切。
    • 我添加了另一个相关问题:stackoverflow.com/questions/39195348/…
    猜你喜欢
    • 1970-01-01
    • 2011-09-09
    • 2013-09-21
    • 2016-10-01
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    相关资源
    最近更新 更多