2017-02-18 1 views
1

Actuellement j'essaie d'utiliser la bibliothèque cljs servant. Je ne peux exiger d'un fichier comme dans cet extrait:Nécessite plusieurs fichiers pour un worker dans cljs

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

Mon main.js ressemble:

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>'); 

Cela provoque l'erreur que le document ne soit pas défini, car il est appelé à partir d'un travailleur ce que je présume n'a pas accès au doc ​​html. Un moyen de contourner ce problème? Je pensais faire un fichier worker.js séparé et le remplir avec:

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

travaillerais, mais je ne l'ai pas eu du succès avec ce encore. J'utilise boot pour organiser mes cljs selon maggimo. Mes fichiers js sont stockés sous le répertoire js. Si je n'ai pas fourni tous les détails nécessaires, veuillez le dire et je le modifierai.

Répondre

0

Comme le dit le serviteur README, afin de faire en sorte que seul le thread non-travailleur exécute le code spécifique du navigateur, vous devez entourer avec la clause if suivante:

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

Une autre façon est d'utiliser une construction distincte pour le code du travailleur. Vous pouvez voir un exemple pour cela dans la bibliothèque Butler.

+0

Vous suggérez que depuis mon clojurescript j'ai du code qui ne devrait être exécuté que sur le thread principal. Cependant, mon problème est que le javascript compilé lui-même que j'ai besoin d'exiger pour les travailleurs de partager le contexte avec écrit les chemins vers les fichiers javascript et le document. Faire ce que vous suggérez ne résoudrait pas cela. Utiliser Butler ne répond pas vraiment à cette question. –

+0

Quel niveau d'optimisations utilisez-vous pour la compilation de votre fichier js worker? – Asher

+0

Je ne suis pas sûr de comprendre votre question. La même compilation boot + adzerk est utilisée pour le fichier worker et le fichier principal car ils sont identiques. J'ai depuis décidé d'essayer d'utiliser une approche plus basique de la compilation de clojurescript pour apprendre comment cela fonctionne. Ensuite, je peux ajouter des fonctionnalités jusqu'à ce que je vois où et pourquoi l'écriture de document est ajouté. Cependant, pour le fichier hypothétique worker.js, j'ai mentionné qu'il n'y aurait pas de compilation inattendue car elle est codée directement dans js. –