Chrome, web çalışanı yükleyemiyor


109

Web çalışanı kullanan bir proje üzerinde çalışıyorum.

Baş bölümümde bu kod var:

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

Bu, Safari'de sorunsuz çalışıyor, ancak Chrome aşağıdaki hatayı bildiriyor:

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

Bu neden Safari'de mükemmel çalışıyor ama Chrome'da çalışmıyor? Bunu nasıl düzeltirim?

Teşekkür ederim.


1
Dosya protokolü üzerinde mi çalışıyorsunuz? Erişim bayrağını ayarladıysanız ve çalışıp çalışmadığına bakın: stackoverflow.com/questions/18586921/…
epascarello

1
Evet, web işçi için yol şudur: file:///E:/programming/web/project/worker.js. Ana proje için yol şudur: file:///E:/programming/web/project/index.html.
Progo

1
Şunu

Yanıtlar:


84

Chrome, yerel bir dosyadan komut dosyaları çalıştırırken web çalışanlarını yüklemenize izin vermez.


6
Gönderen bu cevap , Loading a local file, even with a relative URL, is the same as loading a file with the file: protocol.- ve bir heves sadece erişim için dosya sistemi muktedir web sayfaları için hoş bir şey değil.
ChaseMoskal

41
-1 firsfox, dosyayı bir kaynak olarak da kullanıyorsanız (örn. Yerel dosyayı tarayıcıda görüntülüyorsanız) bunu elbette yapmanıza izin verecektir . Kırılan sadece krom.
Tomáš Zato - Monica'yı eski durumuna getir

3
Firefox hala çalışıyor (evet file: // 'dan), bu durumda Chrome çalışmıyor.
Evil

55

Bir geçici çözüm kullanıyorum. Chrome engelliyor Workerama engellemiyor <script>. Dolayısıyla evrensel bir çözüm oluşturmanın en iyi yolu şudur:

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

Daha sonra normal bir şekilde bağlarsınız <script src="...". Ve fonksiyon tanımlandıktan sonra, bu iğrenç bir kod kullanırsınız:

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

Bu çözüm iyidir. neden bu dünyada hiçbir şey mükemmel değil? Her yazılım, kullanıcıları böcekler, kusurlar, çocukça davranışlar vb. İle kışkırtır. Firefox, "clip-path" css özelliğini desteklemeyi reddettiği için de kibirli.
Ĭsααc t ի ε βöss

Ben bir js geliştiricisi değilim ve burada kullanılan komut dosyası etiketinin amacını anlamıyorum. Ve pencere nedir! = Kendi kendine kontrol? Lütfen birisi bu yükleme sırasını açıklayabilir mi? Teşekkürler.
Sharun

Komut dosyası etiketleri, HTML ile aynı dizindeyse, google chrome tarafından yüklenecektir. window!=seldkodun web çalışanı içinde çalışıp çalışmadığını kontrol eder. Bu, javascript dosyasını doğrudan başka bağlamlarda yüklemeniz durumunda bu kodu taşınabilir hale getirir.
Tomáš Zato - Monica'yı eski durumuna getir

1
@ treeseal7 Web çalışanı bağlamında çalıştırılması gereken kod.
Tomáš Zato - Monica'yı eski durumuna getir

2
Bu şekilde yazılmış bir işçiden importScript kullanamayacağınızı not etmeliyim. En azından ek bir çözüm olmadan. Bu nedenle, çok dosyalı bir işçi için daha fazla kurcalamaya ihtiyacınız olacak.
SlugFiller

41

Sorun Noble Chicken tarafından doğru bir şekilde açıklandı, ancak bunun için daha genel bir çözümüm var. Python ile wamp veya xamp kurmak yerine, projenizin barındırıldığı klasöre gidip şunu yazabilirsiniz:python -m http.server

Sadece bu ve bu klasörde localhost'tan erişilebilen çalışan bir sunucunuz olacak.


13
Mac'lerin muhtemelen python -m SimpleHTTPServer 8000<Python 3 ile yüklendikleri için gitmeleri gerekecek (başka bir google aramasını kaydetmek için: D)
siege_Perilous

3
ayrıca http-server node modülünü kurabilir ve ardından terminalden istenen klasöre gidip 'http-server -p 3000' komutunu çalıştırabilirsiniz.
Huan Zhang

bu betiğe değinmeye değer "python -m http.server" Python 3'e ihtiyaç duyar.
milesma

Ayrıca deneyinphp -S localhost:8000
William Entriken

29

Ayrıca kullanabilirsiniz --allow-dosya access-from-dosyalar Chrome'u başlattığınızda bayrağı.

MacOsX için örnek:

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

Daha fazla bilgi: Chrome için web çalışanı ayarları


Windows komut penceresinde "C: \ Users \ NAME \ AppData \ Local \ Google \ Chrome SxS \ Application" konumuna gidin, ardından chrome.exe --allow-file-access-from-files komutunu çalıştırın, ardından yerel dosya yolunuzu kopyalayın örneğin c: \ temp \ myWeb \ index.html ve açılan tarayıcının url'sine yapıştırın.
milesma

4
Ayrıca bir kısayol oluşturabilir ve bayrağı hedef yolda geçirebilirsiniz.
Stephan

1
Oh, ve bağlantılı sorudan, bayrakla başlatmadan önce tüm Chrome pencerelerini kapatmayı unutmayın.
Stephan

Evet, başka bir seçenek de, manifestinde doğru izinle bir Chrome Uzantısını kodlamak olabilir: "permissions": ["file: // * / *"], örneğin stackoverflow.com/questions/19493020/…
Mickaël

Not: "Chrome'u --allow-file-access-from-filesbayrakla açmadan önce tüm pencerelerini kapatmanız gerekir ." stackoverflow.com/a/21771754/325418
nonopolarity'de

15

Güvenlik kısıtlamaları yüzünden. Bunun yerine http://veya https://protokol kullanmanız gerekir file:///.

NodeJS kuruluysa, aşağıdakileri yapmanız yeterlidir. - Bunun mevcut birçok seçenekten biri olduğunu unutmayın

Yerel web sunucusunu kurun

$ npm install -g local-web-server

Artık içeriğe erişmek istediğiniz herhangi bir klasörde kullanabilirsiniz http.

$ ws

Git http://localhost:8000(varsayılan bağlantı noktası: 8000)


6

Senin görevinle aynı sorunu yaşadım. Çözüm, onu localhost (wamp veya xamp) ile çalıştırmanız gerektiğidir. Yapacak.


Vay canına, bunu asla bulamazdım - teşekkürler! (Umarım yorumlara izin verilir)
dcromley



3

Chromedosyayı yükleyin ancak çalıştıramazsınız. Kullanın Firefox. Benim için çalışıyor.


1
Olumsuz oyumu açıklamak gerekirse: Bu, bir yorumla başlamak, belki de yanıt olarak sunulmak yerine tarayıcı destek gereksinimleri hakkında daha fazla bilgi almaktan daha iyi olabilir. Kullanıcının tarayıcılar arası destek hakkında daha önce söylediklerine bakıldığında, bu muhtemelen bir cevap değil gibi görünüyor.
Thomas Poole

Soruyu dikkatlice okursanız, oylamadan önce yanıtı üç olarak olumsuz oylamayacağınıza eminim! Kullanıcı, Chrome'un çalışanı yükleyemediğini söylüyor. Hayır, Chrome çalışanı yükleyebilir ancak çalıştıramaz. Bunu yanıt olarak koymamın nedenleri ilk önce sorunun bir yıl önce sorulması ve ikincisi birçok yanıt Firefox'un çalışanı çalıştırmadığını söylüyor ve ben bunların hepsini yorumlayamam. Sadece açıklıyorum ama sen olumsuz ya da olumlu oy kullanma hakkın var.
Hocine Ben

3

Chrome'da yerel http sunucusu yapmanın kolay yolu bu uygulama:

Chrome için Web Sunucusu

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

Açıklama:

Chrome için Web Sunucusu, HTTP kullanarak ağ üzerindeki yerel bir klasörden web sayfaları sunar. Çevrimdışı çalışır. Chrome için Web Sunucusu, Chrome için açık kaynaklı (MIT) bir HTTP sunucusudur.

Chrome'u yüklediğiniz her yerde çalışır, böylece istediğiniz yere götürebilirsiniz. ARM Chromebook'larda bile çalışır.

Artık yerel ağda dinleme seçeneğine sahiptir, böylece diğer bilgisayarlar dosyalarınıza erişebilir. Ek olarak, bir internet adresi deneyebilir ve alabilir.

Çoğu kişi bunu bir Chromebook'ta temel web geliştirme yapmak için kullanır. Bilgisayarlar arasında veya hatta internette yerel bir ağ üzerinden dosya paylaşmak için de kullanışlıdır.

Kurduktan sonra http://127.0.0.1:8887 adresine gidin.

Ve bayrak --allow-file-access-from-files olarak güvenli değildir.


Bu harika! Artık reactJS uygulamamı yerel dosya sistemindeki web çalışanları ile çalıştırabilirim. Çok daha kolay olamaz!
Json


2

Python 2.x'in Python 3.x'ten daha yaygın olarak konuşlandırılmasıyla, benzer bir python -m SimpleHTTPServer 8000şey daha genel olarak uygulanabilir ve sadece Mac OS X için değil. Örneğin, Cygwin altında kullanım için gerekli buldum.

Bununla birlikte, bu örnek bir şampiyon gibi çalıştı.


2
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;
}

Belirtildiği gibi, Chrome bunu desteklemiyor. Çalışanlarımı aynı dosyada tanımlamayı seviyorum. Bu, id=numher 500 ms'de bir öğenin innerHTML'sinde bulunan sayıyı artıracak çalışan bir geçici çözümdür.


1

Muhtemelen nedeni, Chrome'un yerel bir dosyadan komut dosyaları çalıştırırken web çalışanlarını yüklemenize izin vermemesidir. Ve firefoxumda kodu çalıştırmayı deniyorum, yapamam.


file://Firefox 51.0.1'de sorunsuz çalışan Web Çalışanları
bryc

-6

Evet, yerel dosyanızı yüklüyorsanız, koromda çalışmayacaktır. Ancak firefox tarayıcısında iyi çalışacaktır. Ve HTML dosyasına aşağıdaki kodu eklemelisiniz.

<head>
    <meta charset="UTF-8" />
</head>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.