8

我正在尝试连接到 ClojureScript 浏览器 REPL,但遇到了clojure.browser.repl/connect. 我编译的 JavaScript在顶部的 Google Closure 代码块中TypeError尝试调用对象。我正在按照ClojureScript:启动并运行(第 9 章,第 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>

我一直在使用 REPL 或 Python SimpleHTTPServer 的 Ring/Jetty 在端口 3000 上提供此服务。当我在 Chrome 中打开此页面时,开发控制台显示,并在已编译的 js 文件顶部的 Google Closure 代码中Uncaught TypeError: Cannot call method 'appendChild' of null回溯到此if/块,其中(作为参数传递给包含函数)是。elseparentElmnull

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

将在浏览器中编译和运行就好了。我怀疑在我的构建设置或目录结构中配置错误,或者我在这一切的某个地方犯了一个菜鸟错误。自从我遵循的说明发布以来,发生了什么变化?我在#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 被添加到它时为空(connect调用导致这一点)。

您应该connect在 dom ready 或 body on 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 回答