Compojure模板页面

时间:2009-08-27 12:11:30

标签: clojure compojure

我有一堆共享相同页眉和页脚的静态html文件。一世 想在所有页面上分享这个页眉和页脚。现在我 使用以下路由,但它有点难看,我必须照顾所有特殊情况。是否有一个简单的dothis,如PHP的包含功能?


(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)))

1 个答案:

答案 0 :(得分:8)

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

我有经验的其他Web框架将这个职责委托给他们的模板引擎,而PHP则稍微模糊了一些线条。他们这样做是为了让你在这里明确地“包含”一个共同的片段,或者渲染一个宏,甚至通过基本的继承形式(这个模板扩展了那个模板)。

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

也就是说,Compojure似乎没有与它捆绑的完整HTML模板引擎。它确实有一个很好的小HTML / XML域特定语言(DSL),但我认为你正在寻找的更多的是一流的模板引擎,可以与Compojure一起使用。

Enlive似乎是Clojure灵感的模板引擎,获得了最多的点击率,但我确信还有其他的。鉴于Clojure的JVM集成,您也可以选择任何Java-inspired templating engines

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