it-swarm.com.de

Chrome kann Web Worker nicht laden

Ich arbeite an einem Projekt, das einen Web-Worker verwendet.

In meinem Kopfteil habe ich diesen Code:

var worker = new Worker("worker.js");
// More code

Dies funktioniert gut in Safari, aber Chrome meldet den folgenden Fehler:

Uncaught SecurityError: Failed to create a worker: script at '(path)/worker.js' cannot be accessed from Origin 'null'.

Warum funktioniert das in Safari perfekt, aber nicht in Chrome? Wie behebe ich das?

Vielen Dank.

86
Progo

Mit Chrome können Sie keine Web Worker laden, wenn Sie Skripts aus einer lokalen Datei ausführen.

64
Nobel Chicken

Ich verwende eine Problemumgehung. Chrome blockiert Worker aber nicht <script>. Daher ist der beste Weg, um eine universelle Lösung zu finden:

function worker_function() {
    // all code here
}
// This is in case of normal worker start
// "window" is not defined in web worker
// so if you load this file directly using `new Worker`
// the worker code will still execute properly
if(window!=self)
  worker_function();

Sie verknüpfen es dann wie gewohnt <script src="...". Und sobald die Funktion definiert ist, verwenden Sie diesen Code:

new Worker(URL.createObjectURL(new Blob(["("+worker_function.toString()+")()"], {type: 'text/javascript'})));
39
Tomáš Zato

Das Problem wurde von Noble Chicken richtig erklärt, aber ich habe eine allgemeinere Lösung dafür. Anstatt Wamp oder Xamp zu installieren, können Sie mit Python zu dem Ordner navigieren, in dem sich Ihr Projekt befindet, und Folgendes eingeben: python -m http.server

Nur das und Sie werden einen laufenden Server in diesem Ordner haben, der von localhost erreichbar ist.

29
Robert Parcus

Sie können auch das Flag --allow-file-access-from-files verwenden, wenn Sie Chrome starten.

Beispiel für MacOsX:

/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files

Weitere Informationen: Web Worker-Einstellungen für Chrome

26
Mickaël

Ich hatte das gleiche Problem wie dein Beitrag. Die Lösung ist, dass Sie es mit localhost (wamp oder xamp) ausführen müssen. Es wird gemacht.

6
Thara

Es liegt an den Sicherheitsbeschränkungen. Sie müssen das http://- oder https://-Protokoll anstelle von file:/// verwenden.

Wenn Sie NodeJS installiert haben, können Sie einfach Folgendes tun .- Beachten Sie, dass dies eine von vielen verfügbaren Optionen ist

Install local-web-server

$ npm install -g local-web-server

Jetzt können Sie es in jedem Ordner verwenden, auf den Sie über http zugreifen möchten.

$ ws

Navigieren Sie zu http://localhost:8000 (Standardport: 8000). 

6
Safeer Hussain

sie benötigen einen Webserver für die Anforderung vom HTTP-Protokoll anstelle der lokalen Datei und funktionieren ordnungsgemäß :)

3
Alireza Alallah

Eine weitere Problemumgehung ist die Verwendung des web-Servers von Google für die Chrome -Erweiterung. Wählen Sie Ihr Arbeitsverzeichnis und starten Sie den Server, Fertig!

3
Yubo

Da Python 2.x weiter verbreitet ist als Python 3.x, ist python -m SimpleHTTPServer 8000 allgemeiner anwendbar und nicht nur für Mac OS X. Ich habe es zum Beispiel für die Verwendung unter Cygwin als notwendig erachtet. 

Mit diesem Einsatz funktionierte dieses Beispiel wie ein Champion.

2
salfter

Chrome lädt die Datei, kann sie jedoch nicht ausführen. Verwenden Sie Firefox. Es arbeitet für mich.

2
Hocine Ben
function worker_fun(num){
    num ++
    // console.log(num)
    postMessage(num);
    setTimeout(worker_fun.bind(null,num), 500)
}

var w

function startWorker(){
    var blob = new Blob([
        "onmessage = function(e){\
            " + worker_fun.toString() + "\
            worker_fun(e.data.num);}"
    ]);
    var blobURL = window.URL.createObjectURL(blob);
    if (typeof(Worker) != 'undefined'){
        if (typeof(w) == 'undefined'){

            w = new Worker(blobURL);
            w.onmessage = function(event){
                document.getElementById('num').innerHTML = event.data;
            } 
            w.postMessage({
               num:parseInt(document.getElementById('num').innerHTML)})
        }
    }
}


function stopWorker() { 
    w.terminate();
    w = undefined;
}

Wie gesagt, Chrom unterstützt es nicht. Ich definiere meine Mitarbeiter gerne in derselben Datei. Dies ist eine Arbeitsumgehung, bei der die Anzahl der Elemente mit id=num alle 500ms in innerHTML erhöht wird.

1
Dominik Kolesar

Ein einfacher Weg, local http-Server in chrome zu erstellen, ist diese App:

Webserver für Chrome

https://chrome.google.com/webstore/detail/web-server-for-chrome/ofhbbkphhbklhfoeikjpcbhemlocgigb/related

Beschreibung:

Ein Webserver für Chrome stellt Webseiten aus einem lokalen Ordner über das Netzwerk mithilfe von HTTP bereit. Läuft offline . Web Server für Chrome ist ein Open Source (MIT) HTTP-Server für Chrome.

Es kann überall ausgeführt werden, wo Sie Chrome installiert haben, sodass Sie es überall hin mitnehmen können. Es funktioniert sogar auf ARM Chromebooks.

Jetzt kann das lokale Netzwerk überwacht werden, sodass andere Computer auf Ihre Dateien zugreifen können. Zusätzlich kann versucht werden, eine Internetadresse zu erhalten.

Viele Leute nutzen dies, um grundlegende Webentwicklung auf einem Chromebook durchzuführen. Es ist auch praktisch, um Dateien über ein lokales Netzwerk zwischen Computern oder sogar über das Internet gemeinsam zu nutzen.

Navigieren Sie nach der Installation zu http://127.0.0.1:8887

Und es ist nicht unsicher wie das Flag --allow-file-access-from-files

0
A. Denis

Ein wahrscheinlicher Grund ist, dass Chrome Web-Worker nicht lädt, wenn Skripts aus einer lokalen Datei ausgeführt werden. Und ich versuche den Code auf meinem Firefox auszuführen, kann auch nicht.

0
Eric Chang