2014-05-20 5 views
3

Je suis nouveau à clojure/clojurescript donc il peut y avoir une solution simple à ce que je suis méconnais, mais voici mon problème:Clojurescript templating de fichiers html

Je fichiers HTML existants (juste HTML brut, non variables ou quoi que ce soit) Je voudrais utiliser comme partiels pour un projet clojurescript (Ces fichiers html sont des choses comme la navigation, le pied de page, etc.). Je voudrais demander ces modèles html dans le projet clojurescript, puis avoir les modèles en ligne dans le js compilé afin que je n'ai pas besoin de faire des appels ajax pour les modèles en production ou de copier sur les fichiers html pour être disponible le client en production. Des projets comme requirejs et browserify ont des plugins pour vous permettre de 'requérir' les fichiers html - y at-il un équivalent pour clojurescript?

Je connais des bibliothèques pour manipuler des templates/dom, donc ce n'est pas un problème. C'est simplement la traduction de plusieurs fichiers html externes en chaînes/nœuds inline/tout ce qui doit être inclus dans la production js.

Merci

+0

un coup d'oeil à https://github.com/ckirkendall/enfocus peut s'adapter ce dont tu as besoin clojurescript, modèles compilés. – edbond

+1

Merci, je vais voir si cela pourrait fonctionner pour nous. Je ne sais pas si cela résout le problème d'avoir un seul fichier js _including_ les modèles, mais semble solide pour le reste - je vais devoir l'essayer et voir. Appréciez-le! –

Répondre

6

Vous pouvez le faire en utilisant des macros exécutées au moment de la compilation.

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

Cela générera des variables head, nav, foot contenant des chaînes lues à partir de fichiers dans ressources/dossier.

ressources/nav.html

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

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

Woah, c'est génial merci. Étant un débutant clojure je vais devoir lire ceci quelques fois avant que je l'obtienne mais c'est super utile. –