从HTML文件中创建Clojurescript模板

4
我对Clojure/ClojureScript还不熟悉,可能有一个简单的解决方案我没有注意到,但这是我的问题:
我有现有的HTML文件(只是原始的HTML,没有变量或任何东西),我想将它们作为ClojureScript项目的部分使用(这些HTML文件是导航、页脚等)。我想要在ClojureScript项目中引用这些HTML模板,然后让模板内联在编译后的JS中,这样我就不必在生产中做任何模板的AJAX调用或复制HTML文件以供客户端使用。像RequireJS和Browserify这样的项目有插件可以让你只需“require”HTML文件-是否有相应的ClojureScript插件?
我知道有一些库可以进行模板化/ DOM操作,所以这不是问题。它只是将多个外部HTML文件转换为内联字符串/DOM节点/任何内容,以包含在生产JS中。
谢谢。

请查看 https://github.com/ckirkendall/enfocus ,可能符合您的需求。ClojureScript,编译模板。 - edbond
1
谢谢,我会看看这是否适用于我们。不确定它是否解决了将单个js文件包含模板的问题,但似乎对其他方面很稳定 - 我需要尝试一下并查看。感激不尽! - Isaac Chansky
1个回答

8
你可以使用编译时执行的宏来完成此操作。 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,其中包含从资源文件夹中读取的字符串。 resources/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";

哇,这太棒了,谢谢。作为一个Clojure新手,我需要读几遍才能理解,但这非常有帮助。 - Isaac Chansky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接