在cljs中为工作者需要多个文件

时间:2017-02-18 17:58:58

标签: import clojurescript web-worker

目前我正在尝试使用cljs库servant。我只能在这个摘录中要求一个文件:

(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 doc的worker调用的。 有什么方法可以解决这个问题吗?我曾想过制作一个单独的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使用boot来组织我的cljs。我的js文件存储在js目录下。如果我没有提供任何必要的细节,请说明,我会编辑。

1 个答案:

答案 0 :(得分: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)

另一种方法是为worker代码使用单独的构建。您可以在Butler库中看到相关示例。