2016-07-31 69 views
2

Ich entwickle eine einseitige Webanwendung mit Boot. Es begann ursprünglich von der Holy Grail example.Wie ClojureScript-Ausgabe von einer Seite mit Multi-Level-Pfad laden?

Meine Compojure Routen sind wie folgt definiert:

(defroutes routes 
    ; sente 
    (GET "/chsk" req ((:ring-ajax-get-or-ws-handshake (:sente system)) req)) 
    (POST "/chsk" req ((:ring-ajax-post (:sente system)) req)) 
    ; everything else 
    (GET "/*" [] (-> (resource-response "/index.html") 
        (content-type "text/html"))) 
    ; vestige of old times 
    (route/not-found "Not Found")) 

Beachten Sie den Stern in der "/*" Route: Ich möchte alle Anfragen index.html, mit dem ClojureScript Teil zurückkehren, um die tatsächlichen Routen Handhabung.

ich die Anwendung in dem Entwickler-Modus ausgeführt wird, hier ein Ausschnitt aus build.boot:

(deftask dev 
    "Run a restartable system in the Repl" 
    [] 
    (comp 
    (environ :env {:http-port "3000"}) 
    (watch :verbose true) 
    (system :sys #'dev-system :auto true :files ["handler.clj"]) 
    (reload :on-jsload 'myapp.core/init!) 
    (cljs :source-map true) 
    (repl :server true :init-ns 'myapp.user))) 

Es funktioniert gut für Single-Level-Pfade, wie localhost:3000/test. Es bricht jedoch für die Seiten mit Mehrebenenpfaden, z. localhost:3000/foo/bar.

Der Teil von index.html, die JavaScript lädt sieht wie folgt aus:

<body> 
    <div id="container"></div> 
    <script type="text/javascript" src="/main.js"></script> 
</body> 

Ursprünglich war es src="main.js", aber ich habe den führenden Schrägstrich hinzugefügt, so dass es main.js aus einem Multi-Level-Seite findet. Ohne den Schrägstrich sucht der Browser wahrscheinlich die Datei im Verzeichnis [somewhere-in-cljs-output]/foo/main.js, wobei er die Seite localhost:3000/foo/bar annimmt.

Nun wird main.js von ClojureScript Compiler erzeugt wird, und hier ist es:

var CLOSURE_UNCOMPILED_DEFINES = null; 
if(typeof goog == "undefined") document.write('<script src="main.out/goog/base.js"></script>'); 
document.write('<script src="main.out/cljs_deps.js"></script>'); 
document.write('<script>if (typeof goog != "undefined") { goog.require("boot.cljs.main26293"); } else { console.warn("ClojureScript could not load :main, did you forget to specify :asset-path?"); };</script>'); 

Wenn es auf einer Seite läuft localhost:3000/foo/bar, ich die Warnung sehen.

Anscheinend ist das Problem das gleiche wie mit der ursprünglichen main.js Referenz, in dem die Pfade der erforderlichen JavaScript-Dateien relativ sind, nicht absolut. Wie bekomme ich sie absolut?

Ich denke, ich muss die cljs Aufgabenaufruf in build.boot ändern, aber nicht sicher, wie, weil mein mentales Modell, wie Boot funktioniert, sehr fleckig ist.

Jede Hilfe wird geschätzt.

Antwort

2

Ein wenig Bastelei führte zu folgenden Änderung in der dev Aufgabe build.boot:

(cljs :source-map true 
     :compiler-options {:asset-path "/main.out"}) 
+0

betrachten Sie Ihre Antwort als die richtige Antwort Kennzeichnung :) –

+0

Ja, zum Zeitpunkt der dumme SO der Schnittstelle hat mich nicht erlaubt zu. – Arry