簡體   English   中英

無法從栗子模板(figwheel,鼬鼠)獲得瀏覽器副本的支持

[英]Can't get browser repl to work from chestnut template (figwheel, weasel)

我嘗試使用結合了背back式,無頭輪式和鼬鼠式的栗子leiningen模板開始使用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

除了警告,到目前為止,一切都很好-碼頭似乎已經成功啟動。 但是,當我嘗試啟動瀏覽器-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輸入后,很明顯黃鼠狼不能正常工作。 如果我看一下瀏覽器看到的JS元素,雖然app.jsgoog.addDependency調用,但顯然不會加載dev腳本,weasel的repl.js也不會加載。

栗子0.5.0現在已經發布。 它包含一個更新的ClojureScript,可以解決Weasel(與瀏覽器相連的REPL)的問題以及其他一些改進。

我在栗子0.5.0上取得了一些成功,但需要進行一些更改。 我是Clojure的新手,所以我可能會缺少一些東西-無論如何,這是我發現的內容:

栗子的README文件似乎描述了版本0.5.0的用法,但是該版本到目前為止clojars中不可用。

因此,根據自述文件,我是從本地副本安裝的:

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

...並創建了一個新項目:

lein new chestnut tree

嘗試使用lein cljsbuild once編譯lein cljsbuild once產生了與lock-id相關的Bad method signature警告。 因此,我首先在:dependencies下將最新的core.async添加到project.clj

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

然后有相關的不確定core.async功能的一些錯誤,所以我固定requiressrc/cljs/tree/core.cljs

(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-chtree.core 因此,我將“開發模式”設置包裝到一個從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)確定。

(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?"})

保存文件后不久,更改將自動編譯並顯示在瀏覽器中。

根據評論,這仍然不能解決瀏覽器問題。 為此,我必須獲取weasel的本地副本,並破解src/clj/weasel/repl/websocket.clj第88行:

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

它似乎與cljs編譯器中的API更改有關。 這樣,我可以(browser-repl)沒有任何警告,並且(do (js/alert "Hello world!") 42)在瀏覽器中產生警報。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM