Chrome वेब कार्यकर्ता को लोड नहीं कर सकता है


109

मैं एक ऐसी परियोजना पर काम कर रहा हूं जिसमें एक वेब कार्यकर्ता का उपयोग किया जाता है।

मेरे हेड सेक्शन में मेरे पास यह कोड है:

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

यह सफारी में ठीक काम करता है, लेकिन Chrome निम्न त्रुटि की रिपोर्ट करता है:

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

क्यों यह पूरी तरह से सफारी में काम करता है लेकिन क्रोम नहीं मैं यह कैसे तय करुं?

धन्यवाद।


1
क्या आप फ़ाइल प्रोटोकॉल पर काम कर रहे हैं? यदि आप एक्सेस फ़्लैग सेट करते हैं और देखें कि क्या यह काम करता है: stackoverflow.com/questions/18586921/…
epascarello

1
हाँ, वेब कार्यकर्ता के लिए पथ यह है: file:///E:/programming/web/project/worker.js। मुख्य परियोजना के लिए पथ यह है: file:///E:/programming/web/project/index.html
प्रागो

1
इसे आज़माएं: stackoverflow.com/questions/18586921/…
epascarello

जवाबों:


84

जब आप किसी स्थानीय फ़ाइल से स्क्रिप्ट चलाते हैं तो Chrome आपको वेब श्रमिकों को लोड करने की अनुमति नहीं देता है।


6
से इस उत्तर , Loading a local file, even with a relative URL, is the same as loading a file with the file: protocol.- और यह वेब पृष्ठों के लिए शांत नहीं कर रहा है एक लहर में बस का उपयोग अपनी फाइल सिस्टम के लिए सक्षम होना।
चेसमॉस्कल

41
-1 firsfox आपको निश्चित रूप से ऐसा करने देगा, बशर्ते आप फ़ाइल को मूल के रूप में भी उपयोग कर रहे हों (जैसे कि आप ब्राउज़र में स्थानीय फ़ाइल देख रहे हैं)। यह सिर्फ क्रोम है जो टूटा हुआ है।
टॉम ज़ातो -

3
फ़ायरफ़ॉक्स अभी भी काम करता है (फ़ाइल से हाँ: //), क्रोम इस मामले में नहीं है।
ईविल

55

मैं एक वर्कअराउंड का उपयोग करता हूं। क्रोम ब्लॉक Workerलेकिन नहीं <script>। इसलिए एक सार्वभौमिक समाधान बनाने का सबसे अच्छा तरीका यह है:

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

फिर आप इसे सामान्य रूप से लिंक करते हैं <script src="..."। और एक बार फ़ंक्शन परिभाषित होने के बाद, आप एक कोड के इस एबोमिनेशन का उपयोग करते हैं:

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

यह समाधान अच्छा है। क्यों इस दुनिया में कुछ भी सही नहीं है? हर सॉफ्टवेयर उपयोगकर्ताओं को बग, खामियों, बचकाना व्यवहार आदि के साथ उत्तेजित कर रहा है। फ़ायरफ़ॉक्स भी अभिमानी है क्योंकि यह "क्लिप-पथ" सीएसएस संपत्ति का समर्थन करने से इनकार करता है।
βsααc t ի Ĭ 22öss

मैं js देव नहीं हूँ और यहाँ स्क्रिप्ट टैग के उपयोग की बात नहीं है। और खिड़की क्या है? = स्वयं की जांच के लिए किसी कृपया इस लोडिंग अनुक्रम की व्याख्या कर सकते हैं? धन्यवाद।
शारुन

स्क्रिप्ट टैग Google क्रोम द्वारा लोड किए जाएंगे यदि वे HTML के समान निर्देशिका में हैं। window!=seldजाँचता है कि कोड वेब कार्यकर्ता में चल रहा है या नहीं। यदि आप जावास्क्रिप्ट फ़ाइल को सीधे अन्य संदर्भों में लोड करते हैं तो यह कोड को पोर्टेबल बनाता है।
टॉम ज़ातो -

1
@ treeeal7 कोड जिसे वेब वर्कर संदर्भ में निष्पादित करना चाहिए।
टॉम ज़ातो -

2
मुझे ध्यान देना चाहिए कि आप इस तरह लिखे गए कार्यकर्ता से इंपोर्टस्क्रिप्ट का उपयोग नहीं कर सकते। कम से कम, एक अतिरिक्त समाधान के बिना नहीं। तो आपको मल्टी-फाइल वर्कर के लिए अधिक छेड़छाड़ की आवश्यकता होगी।
स्लगफिलर

41

समस्या को नोबल चिकन द्वारा ठीक से समझाया गया है लेकिन मेरे पास इसके लिए अधिक सामान्य समाधान है। Wamp या xamp को स्थापित करने के बजाय, अजगर के साथ आप उस फ़ोल्डर में नेविगेट कर सकते हैं जिसे आपकी परियोजना में होस्ट किया गया है और टाइप करें:python -m http.server

बस और आपके पास उस फ़ोल्डर पर एक रनिंग सर्वर होगा, जो लोकलहोस्ट से रीलेबल होगा।


13
Mac को संभवतः जाने की आवश्यकता होगी python -m SimpleHTTPServer 8000क्योंकि वे <Python 3 के साथ लोड होते हैं (बस एक और Google खोज को बचाने के लिए: D)
siege_Perilous

3
आप http-server नोड मॉड्यूल भी स्थापित कर सकते हैं और फिर टर्मिनल से वांछित फ़ोल्डर में नेविगेट कर सकते हैं और 'http-server -p 3000' चला सकते हैं।
हुआन झांग

इस लिपि का उल्लेख करने के लायक है "अजगर -m
http.server

इसके अलावा कोशिश करेंphp -S localhost:8000
विलियम एंट्रीकेन

29

जब आप Chrome लॉन्च करते हैं तो आप --allow-file-access-from-files ध्वज का भी उपयोग कर सकते हैं ।

MacOsX के लिए उदाहरण:

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

अधिक जानकारी: क्रोम के लिए वेब कार्यकर्ता सेटिंग्स


विंडोज़ कमांड विंडो पर नेविगेट करें: "C: \ Users \ NAME \ AppData \ Local \ Google \ Chrome SxS \ Application", फिर chrome.exe --allow-file-access-from-files चलाएँ, फिर अपनी स्थानीय फ़ाइल पथ की प्रतिलिपि बनाएँ उदा c: \ temp \ myWeb \ index.html और खोले गए ब्राउज़र के url में पेस्ट करें।
मल्मा

4
आप एक शॉर्टकट भी बना सकते हैं और लक्ष्य पथ में ध्वज को पास कर सकते हैं।
स्टीफन

1
ओह, और जुड़े हुए प्रश्न से, ध्वज के साथ लॉन्च करने से पहले सभी क्रोम विंडो बंद करना याद रखें।
Stephan

हां, एक अन्य विकल्प यह भी हो सकता है कि क्रोम एक्सटेंशन को सही अनुमति के साथ प्रकट किया जाए: "अनुमतियाँ": ["फ़ाइल: // * / *"], जैसे stackoverflow.com/questions/19493020/…
मिकाओवर

नोट: "आपको --allow-file-access-from-filesध्वज को खोलने से पहले Chrome की सभी विंडो बंद करनी होगी ।" जैसा कि stackoverflow.com/a/21771754/325418
एकाधिकार

15

इसकी वजह है सुरक्षा प्रतिबंध। आपको इसके बजाय उपयोग http://या https://प्रोटोकॉल करने की आवश्यकता है file:///

यदि आपके पास NodeJS स्थापित है, तो आप बस निम्नलिखित कार्य कर सकते हैं। - ध्यान दें कि यह उपलब्ध कई विकल्पों में से एक है

स्थानीय-वेब-सर्वर स्थापित करें

$ npm install -g local-web-server

अब आप इसे किसी भी फ़ोल्डर में उपयोग कर सकते हैं जिसे आप सामग्री को एक्सेस करना चाहते हैं http

$ ws

http://localhost:8000(डिफ़ॉल्ट पोर्ट: 8000) पर नेविगेट करें


6

मुझे आपकी पोस्ट की भी यही समस्या थी। इसका समाधान यह है कि आपको इसे लोकलहोस्ट (wamp या xamp) के साथ चलाना होगा। यह किया जाएगा।


वाह, मुझे यह कभी नहीं मिला - धन्यवाद! (मुझे आशा है कि टिप्पणियों में धन्यवाद की अनुमति है)
dcromley


3

आपको स्थानीय फ़ाइल के बजाय HTTP प्रोटोकॉल से अनुरोध के लिए एक वेब सर्वर की आवश्यकता है और सही तरीके से काम करें :)


1
नहीं, तुम नहीं। आपको उन ब्राउज़रों को अनदेखा करने की आवश्यकता है जो वेब मानकों का पालन नहीं करते हैं क्योंकि वे मुख्यधारा हैं।
टॉम ज़ातो - मोनिका

3

Chromeफ़ाइल लोड करें, लेकिन उसे चला नहीं सकते। का उपयोग करें Firefox। यह मेरे लिए काम कर रहा है।


1
मेरे डाउनवोट को समझाने के लिए: यह एक टिप्पणी के साथ शुरू करने से बेहतर हो सकता है, शायद उत्तर के रूप में प्रस्तुत किए जाने के बजाय, उनके ब्राउज़र समर्थन आवश्यकताओं के बारे में अधिक पूछताछ करना। ऐसा लगता है कि उपयोगकर्ता ने क्रॉस-ब्राउज़र समर्थन के बारे में पहले ही कह दिया है, यह एक उत्तर नहीं है।
थॉमस पूले

यदि आपने प्रश्न को ध्यान से पढ़ा है तो मुझे यकीन है कि आप वोट देने से पहले तीन के रूप में प्रतिक्रिया को वोट नहीं करेंगे! उपयोगकर्ता कह रहा है कि Chrome कार्यकर्ता को लोड नहीं कर सकता है। नहीं, क्रोम कार्यकर्ता को लोड कर सकता है लेकिन उसे चला नहीं सकता। जिन कारणों से मैंने इसे एक प्रतिक्रिया के रूप में रखा है, पहला सवाल यह है कि एक साल पहले पूछा गया था और दूसरी कई प्रतिक्रियाएं कह रही हैं कि फ़ायरफ़ॉक्स उस कार्यकर्ता को नहीं चला रहा है जो मैं उन सभी पर टिप्पणी नहीं कर सकता। मैं सिर्फ समझा रहा हूं लेकिन आपने वोट डाउन करना या वोट डालना सही समझा।
होसिने बेन

3

क्रोम में स्थानीय http सर्वर बनाने का आसान तरीका है यह ऐप:

क्रोम के लिए वेब सर्वर

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

विवरण:

Chrome के लिए एक वेब सर्वर, HTTP के उपयोग से नेटवर्क पर एक स्थानीय फ़ोल्डर से वेब पेज परोसता है। ऑफ़लाइन चलता है। क्रोम के लिए वेब सर्वर क्रोम के लिए एक खुला स्रोत (एमआईटी) एचटीटीपी सर्वर है।

यह कहीं भी चलता है कि आपके पास Chrome इंस्टॉल है, इसलिए आप इसे कहीं भी ले जा सकते हैं। यहां तक ​​कि यह एआरएम क्रोमबुक पर भी काम करता है।

अब इसके पास स्थानीय नेटवर्क पर सुनने का विकल्प है, इसलिए अन्य कंप्यूटर आपकी फ़ाइलों तक पहुंच सकते हैं। इसके अतिरिक्त, यह कोशिश कर सकता है और एक इंटरनेट पता प्राप्त कर सकता है।

कई लोग क्रोमबुक पर बुनियादी वेब विकास करने के लिए इसका उपयोग करते हैं। यह कंप्यूटर के बीच या इंटरनेट पर भी एक स्थानीय नेटवर्क पर फ़ाइलों को साझा करने के लिए आसान है।

इसे स्थापित करने के बाद, http://127.0.0.1:8887 पर जाएँ

और यह फ्लैग के रूप में असुरक्षित नहीं है - फाइल-फाइल-एक्सेस-फ्रॉम-फाइल्स


ये अद्भुत है! मैं अब स्थानीय फ़ाइल सिस्टम से वेब कार्यकर्ताओं के साथ अपना रिएक्टजस ऐप चला सकता हूं। बहुत आसान नहीं हो सकता!
Json

3

यह ऊपर थॉमस के उत्तर से प्रेरित है। लेकिन एक चेतावनी के साथ कि मैं केवल HTML वितरित करना चाहता था, इसलिए मैंने मैन्युअल रूप से js को dataURL में बदल दिया । और इसमें डेटा URL चेक बॉक्स को सक्षम करना।

const myWorker = new Worker("data:application/x-javascript;base64,b25tZXNzYW...");


2

अजगर के साथ 2.x को अजगर 3.x की तुलना में अधिक व्यापक रूप से तैनात किया जाता है, कुछ ऐसा python -m SimpleHTTPServer 8000 आमतौर पर अधिक लागू होता है, और न केवल Mac OS X के लिए। मैंने उदाहरण के लिए इसे Cygwin के तहत उपयोग के लिए आवश्यक पाया।

उस जगह के साथ, इस उदाहरण ने एक विजेता की तरह काम किया।


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

जैसा कि उल्लेख किया गया क्रोम इसका समर्थन नहीं करता है। मैं एक ही फाइल में अपने कार्यकर्ताओं को परिभाषित करना पसंद करता हूं। यह एक वर्किंग वर्कअराउंड है जो id=numहर 500ms के साथ एलिमेंट के आंतरिक HTML में पाए जाने वाले नंबर को बढ़ाएगा ।


1

संभवतः एक कारण यह है कि एक स्थानीय फ़ाइल से स्क्रिप्ट चलाने के दौरान क्रोम आपको वेब श्रमिकों को लोड नहीं करने देता है। और मैं अपने फ़ायरफ़ॉक्स पर कोड चलाने की कोशिश करता हूं, या तो नहीं कर सकता।


वेब वर्कर्स file://फायरफॉक्स 51.0.1 में ठीक चल रहा है
bryc

-6

हां, यदि आपकी लोकल फाइल लोड हो रही है तो यह कोरोम में काम नहीं करेगा। लेकिन यह फ़ायरफ़ॉक्स ब्राउज़र में ठीक काम करेगा। और आपको HTML फाइल में निचे कोड डालना है।

<head>
    <meta charset="UTF-8" />
</head>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.