2012-06-12 37 views
27

我對這個看似愚蠢的問題道歉,但我已經和關閉了幾個星期,現在玩ClojureScript,我想不通這一個簡單的問題:如何調試ClojureScript

如何我要調試ClojureScript嗎?

所以這裏的問題是:

  1. 我寫我的* .cjs文件
  2. 我跑cljsc /建...
  3. 我加載了我的網頁。
  4. 發生了一些不好的事情。
  5. 我打開了Firefox的控制檯。
  6. 我在生成的 js中找到一行,我覺得這是不可理解的,我不知道它來自哪個原始cljs文件的行。

我的問題:

什麼是發展ClojureScript應用程序的正確方法是什麼?

PS我已經看過ClojureScriptOne - 我不喜歡它的是它將所有的技術一起串起來;我寧願瞭解如何在鏈接它們之前單獨使用每個作品。

我很喜歡ring + mustache + compojure,[主要是因爲我可以使用我的標準Clojure調試技術],但ClojureScript是另一個野獸。

UPDATE:事情發生了很大的變化,因爲這個問題首次被問到。調試ClojureScript應用這些天的正確方法是使源地圖 - http://github.com/clojure/clojurescript/wiki/Source-maps

回答

26

修訂:使用編譯器是直接明瞭了。但lein-cljsbuild仍然非常有用。使用lein-cljsbuild。你可以編寫不同的構建(測試,開發,發佈)。您可以自動查看文件,以便在更改文件時快速重新編譯文件。您可以輕鬆使用瀏覽器repl直接在瀏覽器中評估代碼。您可以管理依賴關係。

與您的問題具體相關 - lein-cljsbuild還將合理的警告默認值傳遞給編譯器,以便在實際運行瀏覽器中的代碼之前獲得詳細且準確的警告。

3

我使用piggieback並將我的brepl(瀏覽器repl)連接到我的nrepl。

這樣,您可以測試您的nrepl實例上的cljs代碼以獲得更快的反饋。 你甚至可以在nrepl中執行一些cljs腳本來修改dom。 至於變量的狀態,我使用(js/console.log變量)像提到的Hendekagon。 此外,正如dnolen指出的,如果您使用調試模式(:optimization:whitespace)進行編譯,那麼生成的javascript變得更容易理解,所以我在chrome js環境上做了斷點。

[補充說:2013年7月18日] 將簡要步驟設置nrepl-brepl與下面的教程幫助

  1. 我設置brepl環境。 https://github.com/magomimmo/modern-cljs/blob/master/doc/tutorial-02.md

    簡而言之,您需要在clojurescript代碼的某個地方使用以下代碼段。

    (repl/connect "http://localhost:9000/repl") 
    
  2. 然後打開nrepl在Emacs(我使用的Mx nrepl插孔式)

  3. 在nrepl下面輸入

    (do 
    (require 'cljs.repl.browser) 
    (cemerick.piggieback/cljs-repl 
        :repl-env 
        (doto (cljs.repl.browser/repl-env :port 9000) 
        cljs.repl/-setup))) 
    
  4. 你需要顯示頁面你的瀏覽器上運行你的cljs。

  5. 測試您的nrepl是否通過在nrepl上執行以下操作正常工作。 (JS /警報「我準備好了!」)

4

如果你想使用Chrome調試器,您可以使用以下...

(defn debugger [] 
    (js/eval "debugger")) 

(debugger) 

這不能不說是一個黑客,但它會主動鉻的調試模式。請記住,Clojure腳本使用命名空間,這意味着如果您創建了一些變量thing,那麼它將在Chrome控制檯(如預期的)中找到my.namespace.thing

5

ClojureScript調試的最佳實踐(例如項目&教程):

https://github.com/shaunlebron/How-To-Debug-CLJS

生態系統仍然是在不斷變化,所以我希望能保持這種更新與社區輸入緩解新人的過程。目前,它擊中的調試的傳統方法四:

  • 記錄 - 輕鬆和描述性記錄您的應用程序狀態
  • 測試 - 快速測試代碼,而無需打開Web瀏覽器
  • 互動 - 在您的網頁上運行時玩您的代碼
  • 跟蹤 - 暫停並逐步完成代碼