2014-12-29 4 views
8

HTML5 Web Workers sind normalerweise auf externe Skripts angewiesen, die importScripts() verwenden. Wohin sollten solche Skripte unter Rails 4 gehen, damit sie wie in der Assets-Pipeline normal minimiert werden und dennoch korrekt funktionieren?Wohin mit einer Web-Worker-Datei in Rails 4?

Es gibt einige Probleme, wenn sie mit der Asset-Pipeline arbeiten, die angegangen werden müssen:

  1. Die externe Skripte, gebracht werden, wenn unter vendor/assets, wird nicht von der Asset-Pipeline standardmäßig verarbeitet werden (was nicht der war Fall in Schienen 3).
  2. Wenn die Skripts unter app/assets platziert werden, müssen sie in application.js aufgenommen werden, damit sie verarbeitet werden können. Arbeitsdateien sollten jedoch nicht in der kombinierten Ausgabe enthalten sein (d. H. application-[digest].js).
  3. Wenn die Skripts in der Assets Config enthalten sind, enthalten die resultierenden Dateien einen Digest in ihrem Dateinamen. Um den Worker zu laden, muss man dem Browser seinen Pfad geben (zB . Wie würden wir den Pfad herausfinden? (Ich habe versucht asset_path, aber es hat nicht funktioniert).
  4. Genau wie in 3, Arbeiter müssen verweisen . andere Dateien nach Namen, wenn importScripts() Aufruf Wie würden wir den Weg zu laden herauszufinden
+0

ich immer am Ende mit meinen Arbeitern und Importen in der Ordner '/ public', aber ich muss sagen, ich bin nicht sehr glücklich mit diesem Ansatz –

Antwort

0

Laut Konvention (die nicht so populär ist), um es vendor/assets geht um genau zu sein:?.

  • app/ alles, was streng an diese bestimmte App gebunden ist
  • lib/ alle Code, der von Ihnen geschrieben wird, ist aber nicht beschränkt auf die Anwendung gebunden (oder wird getrennt gem extrahiert werden)
  • vendor/ alle Drittanbieter-Code
+0

Danke für Ihre Antwort, aber die Konvention ist hier eigentlich nicht von Nutzen. Ich habe meine Frage aktualisiert, um das eigentliche Problem zu klären. –

3

Für alle hier von Google kommen - Sie können Inline Workers verwenden.

Inline Arbeiter

Was passiert, wenn Sie Ihre Arbeiter Skript on the fly erstellen möchten, oder eine in sich geschlossene Seite erstellen, ohne separaten Arbeits Dateien erstellen zu müssen? Mit Blob() können Sie „inline“ Ihre Arbeiter in der gleichen HTML-Datei als Haupt-Logik durch eine URL-Handle für den Arbeiter-Code zu schaffen als String:

var blob = new Blob([ 
    "onmessage = function(e) { postMessage('msg from worker'); }"]); 

// Obtain a blob URL reference to our worker 'file'. 
var blobURL = window.URL.createObjectURL(blob); 

var worker = new Worker(blobURL); 
worker.onmessage = function(e) { 
    // e.data == 'msg from worker' 
}; 
worker.postMessage(); // Start the worker.