Ich versuche, eine Verbindung zu einem ClojureScript-Browser-REPL herzustellen, und ich habe Probleme mit clojure.browser.repl/connect
. In meinem kompilierten JavaScript wird TypeError
versucht, appendChild
für ein null
-Objekt im oberen Block des Google Closure-Codes aufzurufen. Ich folge den Anweisungen in ClojureScript: Auf und läuft (Kapitel 9, p .78, in der Vorschau verfügbar) und fragen sich, ob sich die Werkzeuge dafür seit der Veröffentlichung geändert haben.
Ich verwende Leiningen 2.0.0, Java 1.6.0_37, OS X 10.7.5 und die Abhängigkeiten in meinem project.clj
:
Hier ist die einzige ClojureScript-Quelldatei, src/cljs/brepl_hello/brepl-hello.cljs
:
Dies kompiliert zu der Datei resources/public/brepl-hello.js
, die ich in index.html
in dasselbe Verzeichnis eingefügt habe:
Ich habe dies auf Port 3000 mit Ring / Jetty von der REPL oder Python SimpleHTTPServer serviert. Wenn ich diese Seite in Chrome öffne, zeigt die Dev-Konsole Uncaught TypeError: Cannot call method 'appendChild' of null
mit einer Rückverfolgung zu diesem if
/ else
-Block im Google Closure-Code am Anfang der entsprechenden js-Datei an, wobei parentElm
(übergeben in zu der enthaltenden Funktion als Parameter) ist null
.
Dies scheint ein Problem mit clojure.browser.repl/connect
zu sein. Tausche diese Zeile in der ClojureScript-Quelle aus für etwas wie:
Kompiliert und läuft im Browser ganz gut. Ich vermute, dass in meinen Build-Einstellungen oder in der Verzeichnisstruktur etwas falsch konfiguriert ist, oder ich mache irgendwo einen Fehler, der nichts Neues ist. Was hat sich seit der Veröffentlichung der Anweisungen, die ich befolge, geändert? Ich habe in den #clojure irc logs einige Verweise auf dieses Problem gefunden, aber keine Lösung.
Schließlich ist hier ein abgekürzter Verzeichnisbaum als Referenz:
%Vor% Nun, es ist Open Source und schaut sich den Code an. Es scheint, dass document.body
zu dem Zeitpunkt Null ist, zu dem der versteckte iframe hinzugefügt wurde (der Aufruf connect
führt zu diesem Punkt).
Sie sollten dies connect
call auf dom ready oder body on load tun und es sollte gut funktionieren.
Tags und Links clojure leiningen google-closure-compiler clojurescript google-closure