2017-02-18 80 views
1

當前我正在嘗試使用cljs庫servant。我只需要一個文件,就像在此摘錄:爲cljs中的工作人員需要多個文件

(def worker-script "/main.js") ;; This is whatever the name of the compiled javascript will be 

我main.js樣子:

var CLOSURE_UNCOMPILED_DEFINES = null; 
if(typeof goog == "undefined") document.write('<script src="js/main.out/goog/base.js"></script>'); 
document.write('<script src="js/main.out/cljs_deps.js"></script>'); 
document.write('<script>if (typeof goog != "undefined") { goog.require("boot.cljs.main8234"); } else { console.warn("ClojureScript could not load :main, did you forget to specify :asset-path?"); };</script>'); 

這將導致該文件沒有定義的錯誤,因爲它正在從一個工人叫我認爲它無法訪問html文檔。 有什麼辦法可以解決這個問題?我曾想過做一個單獨的worker.js文件,並填寫它:

importScripts('main.out/goog/base.js', 'http://localhost:3000/js/main.out/goog/deps.js', 'main.out/cljs_deps.js'); 
if (typeof goog != "undefined") { goog.require("../boot.cljs.main8234"); } else { console.warn("ClojureScript could not load :main, did you forget to specify :asset-path?"); }; 

會的工作,但我還沒有與這樣的成功呢。根據maggimo,我使用引導來組織我的cljs。我的js文件存儲在js目錄下。如果我沒有提供任何必要的細節,請說出來,我會編輯。

回答

0

當僕人README說,爲了確保只有非工作線程運行在瀏覽器特定的代碼,你應該有以下if條款圍繞着它:

(if (servant/webworker?) 
    (worker/bootstrap) ;; Run the setup code for the web worker 
    (set! (.-onload js/window) window-load) ;; run the browser specific code) 

另一種方法是使用工人代碼的單獨構建。你可以在Butler庫中看到一個例子。

+0

你在暗示我的clojurescript中有代碼只能在主線程上執行。然而,我的問題是,我需要爲工作人員共享上下文而編譯的javascript本身將路徑寫入文檔的JavaScript文件。做你的建議不會解決這個問題。使用管家並沒有真正回答這個問題。 –

+0

您使用什麼級別的優化來編譯您的worker js文件? – Asher

+0

我不知道我理解你的問題。相同的boot + adzerk編譯既用於工作文件又用於主文件,因爲它們是相同的。我從那以後決定嘗試使用更基本的clojurescript編譯方法來了解它是如何工作的。接下來,我可以添加功能,直到我看到添加文檔的位置和原因。然而,對於我提到的假想的worker.js文件,它不會有意外的編譯,因爲它是直接在js中編碼的。 –

相關問題