2017-02-18 17 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?"); }; 

бы работать, но я не имел успеха с этим еще. Я использую boot для упорядочивания своих cljs по maggimo. Мои файлы 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

Какой уровень оптимизаций вы используете для компиляции вашего рабочего js-файла? – Asher

+0

Я не уверен, что понимаю ваш вопрос. Такая же компиляция boot + adzerk используется как для рабочего файла, так и для основного файла, так как он один и тот же. С тех пор я решил попробовать использовать более базовый подход к компиляции clojurescript, чтобы узнать, как это работает. Затем я могу добавить функции, пока не увижу, где и почему добавляется запись в документ. Однако для гипотетического файла worker.js, о котором я упоминал, не было бы неожиданной компиляции, поскольку она кодируется непосредственно в js. –