8

ClojureScriptブラウザREPLに接続しようとしていますが、問題が発生していclojure.browser.repl/connectます。コンパイルされたJavaScriptは、上部のGoogleClosureコードのブロックにあるオブジェクトTypeErrorを呼び出そうとします。ClojureScript:Up and Running(第9章、p.78、プレビューで利用可能)の指示に従っており、このためのツールが公開されてから変更されているかどうか疑問に思っています。appendChildnull

Leiningen 2.0.0、Java 1.6.0_37、OS X 10.7.5に加えて、次の依存関係を使用していproject.cljます。

(defproject brepl-hello "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.4.0"]
                 [org.clojure/clojurescript "0.0-1552"]
                 [compojure "1.1.5"]
                 [ring/ring-jetty-adapter "1.1.8"]]
  :plugins [[lein-cljsbuild "0.3.0"]]
  :source-paths ["src/clj"]
  :cljsbuild {:builds [{
                :source-paths ["src/cljs"]
                :compiler {
                 :output-to "resources/public/brepl-hello.js"
                 :optimizations :whitespace 
                 :pretty-print true}}]})

これが唯一のClojureScriptソースファイルですsrc/cljs/brepl_hello/brepl-hello.cljs

(ns brepl-hello
  (:require [clojure.browser.repl :as repl]))

(repl/connect "http://localhost:9000/repl")

これは、同じディレクトリにresources/public/brepl-hello.js挿入したファイルにコンパイルされます。index.html

<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <script type="text/javascript" src="brepl-hello.js"></script>
    </head>
    <body>
    </body>
</html>

私はこれをポート3000でREPLまたはPythonSimpleHTTPServerのRing/Jettyを使用して提供してきました。Chromeでこのページを開くと、開発コンソールにが表示され、コンパイルされたjsファイルの上部にあるGoogleClosureコードのthis /ブロックUncaught TypeError: Cannot call method 'appendChild' of nullへのトレースバックが表示されます。ここで、 (パラメーターとして含まれている関数に渡されます)はです。ifelseparentElmnull

if(goog.userAgent.GECKO || goog.userAgent.WEBKIT) {
    window.setTimeout(goog.bind(function() {
      parentElm.appendChild(iframeElm);
      iframeElm.src = peerUri.toString();
      goog.net.xpc.logger.info("peer iframe created (" + iframeId + ")")
    }, this), 1)
  }else {
    iframeElm.src = peerUri.toString();
    parentElm.appendChild(iframeElm);
    goog.net.xpc.logger.info("peer iframe created (" + iframeId + ")")
  }

これはの問題のようclojure.browser.repl/connectです。ClojureScriptソースのこの行を次のようなものに交換します。

(ns brepl-hello
  (:require [clojure.browser.repl :as repl]))

(.write js/document "Hello World!")

コンパイルしてブラウザで問題なく実行できます。ビルド設定またはディレクトリ構造で何かが正しく構成されていないか、これらすべてのどこかでnoobの間違いを犯しているのではないかと思います。私が従う指示が公開されてから何が変わったのですか?#clojure ircログでこの問題への参照をいくつか見つけましたが、解決策はありません。

最後に、参照用の省略されたディレクトリツリーを次に示します。

├── out
│   ├── cljs
│   │   ├── core.cljs
│   │   └── core.js
│   ├── clojure
│   │   └── browser
│   │       ├── event.cljs
│   │       ├── event.js
│   │       ├── net.cljs
│   │       ├── net.js
│   │       ├── repl.cljs
│   │       └── repl.js
│   └── goog
│       └── [...] 
├── pom.xml
├── project.clj
├── resources
│   └── public
│       ├── brepl-hello.js
│       └── index.html
├── src
│   ├── clj
│   │   └── brepl_hello
│   │       └── core.clj
│   └── cljs
│       └── brepl_hello
│           └── brepl-hello.cljs
└─── target
     ├── brepl-hello-0.1.0-SNAPSHOT.jar
     ├── classes
     ├── cljsbuild-compiler-0
     │   ├── brepl_hello
     │   │   └── brepl-hello.js
     │   ├── cljs
     │   │   ├── core.cljs
     │   │   └── core.js
     │   └── clojure
     │       └── browser
     │           ├── event.cljs
     │           ├── event.js
     │           ├── net.cljs
     │           ├── net.js
     │           ├── repl.cljs
     │           └── repl.js
     └── stale
         └── extract-native.dependencies
4

2 に答える 2

6

さて、そのオープンソースとコードを見るとdocument.body、repl非表示のiframeが追加されている時点ではnullのようです(connect呼び出しはこのポイントにつながります)。

このconnect呼び出しは、domreadyまたはbodyon loadで実行する必要があり、正常に機能するはずです。

于 2013-01-28T13:32:56.010 に答える
2

を見てみましょう:

https://github.com/magomimmo/modern-cljs/blob/master/doc/tutorial-02.md

または、より良いbrepl体験のために、ここに

https://github.com/magomimmo/modern-cljs/blob/master/doc/tutorial-18.md

于 2013-09-13T15:37:11.430 に答える