8

我有一堆共享相同页眉和页脚的静态 html 文件。我想在所有页面上共享此页眉和页脚。现在我使用以下路由,但它有点难看,我必须处理所有特殊情况。有没有一种简单的方法可以做到这一点,例如 php 的 include 函数?


(defroutes my-app
  (GET "/" 
    (html-with-template 
     "main.header"  "index.body" "main.footer" ))
  (GET "/*.html" 
    (html-with-template 
     "main.header" (str (params :*) ".body") "main.footer" ))
  (GET "/*/" 
    (html-with-template 
     (str (params :*) "/folder.header") 
     (str (params :*) "/index.body")
     (str (params :*) "/folder.footer")))
  (GET "/*" 
    (or (serve-file (params :*)) :next))
  (ANY "*"
    (page-not-found)))

4

1 回答 1

8

从我读过的关于 Compojure 的内容来看,我认为它不像 PHP 那样对响应体的“自动前置”和“自动附加”的概念具有固有的支持。

我使用过的其他 Web 框架将此责任委托给他们的模板引擎,而 PHP 有点模糊了界限。他们通过允许您在此处显式“包含”一个公共片段,或呈现一个宏,甚至通过基本形式的继承来做到这一点(此模板扩展了该模板)。

基本上,无论您的 HTML 是静态的还是动态的,模板引擎都允许您进行模块化以获得更好的可维护性。

也就是说,Compojure 似乎并没有与它捆绑的成熟的 HTML 模板引擎。它确实有一个不错的 HTML/XML 领域特定语言 (DSL),但我认为您正在寻找的更多的是可以与 Compojure 一起使用的一流模板引擎。

Enlive似乎是受 Clojure 启发的模板引擎,获得了最多的点击,但我相信还有其他的。鉴于 Clojure 的 JVM 集成,您也可以选择任何受Java 启发的模板引擎

根据您选择的那个,您可能需要编写几行胶水代码才能将模板加载、呈现并流式传输到 Compojure HTTP 响应中,但您只需编写一次并在任何地方重复使用。

于 2009-09-08T23:07:40.250 回答