gpt4 book ai didi

clojure - 连接到 ClojureScript bREPL : clojure. browser.repl/connect 在编译的 JavaScript 中抛出 TypeError

转载 作者:行者123 更新时间:2023-12-04 07:40:28 25 4
gpt4 key购买 nike

我正在尝试连接到 ClojureScript 浏览器 REPL,但遇到了 clojure.browser.repl/connect 的问题.我编译的 JavaScript 抛出 TypeError试图调用appendChildnull顶部的 Google Closure 代码块中的对象。我按照 ClojureScript: Up and Running 中的说明进行操作(第 9 章,第 78 页,可在预览版中找到),并且想知道自发布以来用于此的工具是否发生了变化。

我正在使用 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 中打开此页面时,开发控制台显示 Uncaught TypeError: Cannot call method 'appendChild' of null , 可追溯至此 if/ else block 在已编译的 js 文件顶部的 Google Closure 代码中,其中 parentElm (作为参数传递给包含函数)是 null .
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!")

将在浏览器中编译和运行就好了。我怀疑在我的build设置或目录结构中配置错误,或者我在这一切的某个地方犯了一个菜鸟错误。自从我遵循的说明发布以来,发生了什么变化?我在#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

最佳答案

好吧,它的开源和查看代码似乎 document.body在将 repl 隐藏 iframe 添加到其中时为空(connect 调用导致这一点)。

你应该这样做 connect调用 dom ready 或 body on load,它应该可以正常工作。

关于clojure - 连接到 ClojureScript bREPL : clojure. browser.repl/connect 在编译的 JavaScript 中抛出 TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14552026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com