【问题标题】:Can't get browser repl to work from chestnut template (figwheel, weasel)无法从栗子模板(无花果、黄鼠狼)中获取浏览器 repl
【发布时间】:2023-03-20 08:38:01
【问题描述】:

我尝试使用结合了搭载、无花果和黄鼠狼的chestnut leiningen template 开始使用 ClojureScript。将我的 leiningen 安装升级到 2.5.0 后,我可以启动 clojure repl,但是在发出推荐的 runbrowser-repl 命令后,我遇到了一个神秘的错误。好像也有core.async的问题,不知道有没有关系。

chestnut-borked.server=> (run)
2014-10-07 12:38:06.506:INFO:oejs.Server:jetty-7.6.13.v20130916
2014-10-07 12:38:06.545:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10555
Starting figwheel.
Starting web server on port 10555 .
#<Server org.eclipse.jetty.server.Server@6cdd377c>
Compiling ClojureScript.
Figwheel: Starting server at http://localhost:3449
Figwheel: Serving files from '(dev-resources|resources)/public'
Compiling "resources/public/js/app.js" from ["src/cljs"]...
WARNING: Use of undeclared Var cljs.core.async/do-alts at line 62 file:/home/schauer /.m2/repository/org/clojure/core.async/0.1.278.0-76b25b-alpha/core.async-0.1.278.0-76b25b-alpha.jar!/cljs/core/async/impl/ioc_helpers.cljs
WARNING: Bad method signature in protocol implementation impl/Handler lock-id at line 214 file:/home/schauer/.m2/repository/org/clojure/core.async/0.1.278.0-76b25b-alpha/core.async-0.1.278.0-76b25b-alpha.jar!/cljs/core/async.cljs
WARNING: Use of undeclared Var cljs.core.async.impl.protocols/lock-id at line 217 file:/home/schauer/.m2/repository/org/clojure/core.async/0.1.278.0-76b25b-alpha/core.async-0.1.278.0-76b25b-alpha.jar!/cljs/core/async.cljs
WARNING: Use of undeclared Var chestnut-borked.dev/put! at line 14 src/cljs/chestnut_borked/dev.cljs
[... some warnings removed after first answer ...]
WARNING: Bad method signature in protocol implementation impl/Handler lock-id at line 214 resources/public/js/out/cljs/core/async.cljs
WARNING: Use of undeclared Var cljs.core.async.impl.protocols/lock-id at line 217 resources/public/js/out/cljs/core/async.cljs
Successfully compiled "resources/public/js/app.js" in 21.377 seconds.
notifying browser that file changed:  /js/app.js
notifying browser that file changed:  /js/out/goog/deps.js
notifying browser that file changed:  /js/out/chestnut_borked/core.js
notifying browser that file changed:  /js/out/chestnut_borked/dev.js

除了警告之外,到目前为止,一切都很好——Jetty 似乎已经成功启动。但是,当我尝试启动 browser-repl 时,我遇到了一个错误,并且连接似乎断开了:

chestnut-borked.server=> (browser-repl)
WARNING: Bad method signature in protocol implementation impl/Handler lock-id at line 214 file:/home/schauer/.m2/repository/org/clojure/core.async/0.1.278.0-76b25b-alpha/core.async-0.1.278.0-76b25b-alpha.jar!/cljs/core/async.cljs
ArityException Wrong number of args (0) passed to: compiler/with-core-cljs  clojure.lang.AFn.throwArity (AFn.java:429)

chestnut-borked.server=> (browser-repl)
java.io.IOException: No client connected to Websocket
  at weasel.repl.server$send_BANG_.invoke(server.clj:25)
  at weasel.repl.websocket$send_for_eval_BANG_.invoke(websocket.clj:130)
  at weasel.repl.websocket$websocket_eval.invoke(websocket.clj:109)
  at weasel.repl.websocket.WebsocketEnv._evaluate(websocket.clj:34)
  at cljs.repl$evaluate_form.invoke(repl.clj:113)
  at cemerick.piggieback$cljs_eval$fn__5152.invoke(piggieback.clj:115)
  at clojure.lang.AFn.applyToHelper(AFn.java:152)
  at clojure.lang.AFn.applyTo(AFn.java:144)
  [...]

更新:从 lnmx 输入后,很明显 weasel 无法正常工作。如果我看一下浏览器看到的 JS 元素,显然不会加载开发脚本,也没有加载来自 weasel 的 repl.js,尽管在 app.js 中有对它们的 goog.addDependency 调用。

【问题讨论】:

  • 栗子作者在这里。看来您是从 github 运行,而不是使用 Clojars 上的已发布版本?我猜是因为(run) 似乎也调用了figwheel,而在稳定版本中并非如此。 Chestnut 0.5.0 尚未发布,因为它存在已知问题。
  • 是的。我使用的是 0.5 版。我将尝试使用 0.4。
  • :+1:如有任何问题,请随时在 Github 上直接报告
  • @Arne Brasseur 好的,0.4 版似乎像宣传和描述的那样工作。也许您想添加建议以暂时坚持使用 0.4 作为答案,我会接受。顺便说一句,我安装 0.5 的原因是我最初的旧 leinigen 版本(2.3.2 或其他版本),lein new chestnut foo 只会抛出一个错误。很好,您在 github 自述文件中添加了一个提示,现在它描述了未发布的功能。

标签: clojure clojurescript


【解决方案1】:

Chestnut 0.5.0 现已发布。它包含一个更新的 ClojureScript,应该可以解决 Weasel(与浏览器连接的 REPL)的问题,以及其他一些改进。

【讨论】:

    【解决方案2】:

    我在栗子 0.5.0 上取得了一些成功,但需要进行一些更改。我是 Clojure 的新手,所以我可能会遗漏一些东西——无论如何,这就是我发现的:

    看起来chestnut 的 README 文件描述了版本 0.5.0 的用法,但截至今天,该版本在 clojars 上不可用。

    所以,根据自述文件,我从本地副本安装:

    git clone https://github.com/plexus/chestnut.git
    cd chestnut
    lein install
    

    ...并创建了一个新项目:

    lein new chestnut tree
    

    尝试使用lein cljsbuild once 编译cljs 产生了与lock-id 相关的Bad method signature 警告。所以,我首先将最新的 core.async 添加到project.clj 下的:dependencies

    [org.clojure/core.async "0.1.346.0-17112a-alpha"]
    

    然后有一些与未定义的core.async函数有关的错误,所以我修复了src/cljs/tree/core.cljs中的requires

    (ns tree.core
        (:require [tree.dev :refer [is-dev?]]
                  [cljs.core.async :refer [chan <!]]
                  [om.core :as om :include-macros true]
                  [om.dom :as dom :include-macros true])
        (:require-macros [cljs.core.async.macros :refer [go alt!]]))
    

    src/cljs/tree/dev.cljs:

    (ns tree.dev
        (:require [figwheel.client :as figwheel :include-macros true]
                  [cljs.core.async :refer [put!]]
                  [weasel.repl :as weasel]))
    

    下一个问题是tree.dev 需要引用tree.core 拥有的re-render-ch。所以我将“开发模式”设置封装到一个从 tree.core (src/cljs/tree/core.cljs) 调用的函数中:

    (defonce re-render-ch (chan))
    
    (when is-dev?
      (tree.dev/setup re-render-ch))
    

    ...并在 tree.dev (src/cljs/tree/dev.cljs) 中实现:

    (def is-dev? (.contains (.. js/document -body -classList) "is-dev"))
    
    (defn setup [re-render-ch]
      (when is-dev?
        (enable-console-print!)
    
        (figwheel/watch-and-reload
         :websocket-url "ws://localhost:3449/figwheel-ws"
         :jsload-callback (fn []
                            (println "reloaded")
                            (put! re-render-ch true)))
    
        (weasel/connect "ws://localhost:9001" :verbose true)))
    

    通过这些更改,我可以开始 lein repl(run)(browser-repl) OK。

    (run) 期间我收到此错误:

    ArityException Wrong number of args (0) passed to: compiler/with-core-cljs
    

    (不确定这是从哪里来的)。但是,如果我编辑 tree/src/cljs/tree/core.cljs 并添加

    (reset! app-state {:text "Hello There?"})
    

    更改会自动编译,并在我保存文件后不久显示在浏览器中。

    根据评论,这仍然不能修复 browser-repl。为此,我必须获得weasel 的本地副本,然后破解src/clj/weasel/repl/websocket.clj ~line 88:

    -  (cmp/with-core-cljs)
    +  (cmp/with-core-cljs {} (fn [] (println "foo")))
    

    这似乎与 cljs 编译器中的 API 更改有关。有了它,我可以(browser-repl) 没有任何警告,(do (js/alert "Hello world!") 42) 在浏览器中产生警报。

    【讨论】:

    • 感谢您详细说明。不幸的是,除了上面讨论的堆栈跟踪之外,我仍然一无所有。我也相信以另一种方式解决循环依赖可能会更好:从tree.core 中的require 中删除对tree.dev 的引用,而是在tree.dev 中添加一个require [tree.core :refer [re-render-ch]]
    • @schaueho 好的,我错过了 figwheel 正在工作的事实,但 weasel 没有(没有在 localhost:9001 上监听以供浏览器连接)
    • @schaueho 你的re-render-ch 解决方案听起来更好;如果您想尝试该解决方法,我确实让 browser-repl 工作(见上文)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多