2014-05-20 66 views
3

我是新來的Clojure/clojurescript所以有可能是一個簡單的解決這個我俯瞰,但這裏是我的問題:Clojurescript模板

我已經現有的HTML文件(只是原始的HTML,沒有變量或任何東西)我想用作clojurescript項目的部分(這些html文件是像導航,頁腳等東西)。我希望在clojurescript項目中需要這些html模板,然後將模板內聯在編譯後的js中,因此我不必爲生成中的模板執行任何ajax調用,也不需要複製可用的html文件生產中的客戶。像requirejs和browserify這樣的項目有插件讓你只需'html'文件 - 是否有clojurescript的等價物?

我知道圖書館做模板/ dom操作,所以這不是一個問題。它只是將多個外部html文件轉換爲內聯字符串/ dom節點/任何要包含在製作js中的內容。

謝謝

+0

看一看https://github.com/ckirkendall/enfocus可裝配你需要什麼。 clojurescript,編譯模板。 – edbond

+1

謝謝,我會看看如果這可能對我們有用。不知道它是否解決了有一個單獨的js文件包含模板的問題,但對於其他模塊來說似乎可靠 - 我必須嘗試一下並看看。欣賞它! –

回答

6

您可以使用在編譯時執行的宏來執行此操作。

project.clj

:dependencies [[org.clojure/clojure "1.6.0"] 
       [org.clojure/clojurescript "0.0-2202"]] 
    :source-paths ["src"] 
    :cljsbuild 
    {:builds 
    [{:id "main" 
    :source-paths ["src/cljs"] 
    :compiler 
    { 
     :output-to "resources/main.js" 
     :optimizations :whitespace 
     :pretty-print true}}]}) 

的src/cljstemplates/core.clj

(ns cljstemplates.core 
    (:require [clojure.java.io :refer (resource)])) 

(defmacro deftmpl 
    "Read template from file in resources/" 
    [symbol-name html-name] 
    (let [content (slurp (resource html-name))] 
    `(def ~symbol-name 
     ~content))) 

的src/cljs/web.cljs

(ns cljstemplates.web 
    (:require-macros [cljstemplates.core :refer [deftmpl]])) 

(deftmpl head "header.html") 
(deftmpl nav "nav.html") 
(deftmpl foot "footer.html") 

這將生成包含從資源/文件夾中的文件中讀取的字符串的變量headnavfoot

資源/ nav.html

<nav> 
    <ul> 
    <li>Tweets</li> 
    </ul> 
</nav> 

輸出(main.js):

cljstemplates.web.nav = "\x3cnav\x3e\n \x3cul\x3e\n \x3cli\x3eTweets\x3c/li\x3e\n \x3c/ul\x3e\n\x3c/nav\x3e\n"; 
+0

哇,這真棒謝謝。作爲clojure新手,我必須在閱讀之前閱讀幾遍,但這非常有幫助。 –