2017-11-25 3 views
1

Ich möchte meine .cljs Datei für beide Browser und node.js Umgebungen kompilieren, um serverseitige Rendering zu erhalten. Wie ich verstehe, gibt es keine Möglichkeit cljs env in der Kompilierung mit Lesern Makrobedingungen wie zu definieren:Wie definiert man target env in der Kompilierzeit beim Erstellen von .cljs?

#?(:clj ...) 
#?(:cljs ...) 

so, ich kann nicht einfach sagen, Compiler so etwas wie #?(:cljs-node ...) in node.js env zu verarbeiten.

Die zweite Option, die ich hier sehe, besteht darin, eine Makrodatei zu entwickeln, die env zur Kompilierzeit definiert. Aber wie man diesen aktuellen Build definiert, richtet sich an node.js? Könnte ich irgendwie Params irgendwie zum Compiler übergeben oder :target Compiler param bekommen?

Hier sind meine Boot-Dateien:

application.cljs.edn:

{:require [filemporium.client.core] 
:init-fns [filemporium.client.core/init]} 

application.node.cljs.edn:

{:require [filemporium.ssr.core] 
:init-fns [filemporium.ssr.core/-main] 
:compiler-options 
{:preamble ["include.js"] 
    :target :nodejs 
    :optimizations :simple}} 
+0

versuchen http://clojureverse.org – jiyinyiyong

Antwort

1

Ich bin mir nicht bewusst eine öffentliche API um dies zu erreichen. Sie könnten jedoch auch cljs.env/*compiler* dynamischen var in Ihrem Makro verwenden, um die Zielplattform (dh NodeJS vs Browser) mit :target in Ihrem :compiler-options und entweder zu emittieren oder zu unterdrücken, die in dem Makro gewickelten Code konfigurierte zu überprüfen:

(defn- nodejs-target? 
    [] 
    (= :nodejs (get-in @cljs.env/*compiler* [:options :target]))) 

(defmacro code-for-nodejs 
    [& body] 
    (when (nodejs-target?) 
    `(do [email protected]))) 

(defmacro code-for-browser 
    [& body] 
    (when-not (nodejs-target?) 
    `(do [email protected]))) 

(code-for-nodejs 
    (def my-variable "Compiled for nodejs") 
    (println "Hello from nodejs")) 

(code-for-browser 
    (def my-variable "Compiled for browser") 
    (println "Hello from browser")) 
+0

Danke, genau das, was ich gesucht habe! Aber ein Problem, das ich damit habe, ist ': require' in' ns'. Wie Namespaces abhängig von env erfordern? – zarkone

+0

Derzeit sehe ich die einzige Möglichkeit ist, 'require' nicht von' ns' Makro zu verwenden, aber direkt – zarkone

+0

Hmm, das könnte ein Problem sein, abhängig davon, wie CLJS-Compiler es handhabt. Sie könnten versuchen, ': require' aus dem' ns'-Formular zu entfernen und es in ein eigenständiges '(require ...)' zu verschieben, das in einem der Makros eingeschlossen ist und sehen, ob es funktioniert. –

Verwandte Themen