Chrome ไม่สามารถโหลดผู้ปฏิบัติงานบนเว็บ


110

ฉันกำลังทำงานในโครงการที่ใช้ผู้ปฏิบัติงานบนเว็บ

ในส่วนหัวของฉันฉันมีรหัสนี้:

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

สิ่งนี้ใช้ได้ดีใน Safari แต่ Chrome รายงานข้อผิดพลาดต่อไปนี้:

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

เหตุใดสิ่งนี้จึงทำงานได้อย่างสมบูรณ์ใน Safari แต่ไม่ใช่ Chrome ฉันจะแก้ไขปัญหานี้ได้อย่างไร

ขอบคุณ.


1
คุณกำลังปิดโปรโตคอลไฟล์หรือไม่? หากคุณตั้งค่าสถานะการเข้าถึงและดูว่าใช้งานได้หรือไม่: stackoverflow.com/questions/18586921/…
epascarello

1
file:///E:/programming/web/project/worker.jsใช่เส้นทางสำหรับผู้ปฏิบัติงานที่เว็บนี้เป็น: file:///E:/programming/web/project/index.htmlเส้นทางสำหรับโครงการหลักคือ:
Progo

คำตอบ:


85

Chrome ไม่อนุญาตให้คุณโหลดผู้ปฏิบัติงานบนเว็บเมื่อเรียกใช้สคริปต์จากไฟล์ในเครื่อง


6
จากคำตอบนี้ , Loading a local file, even with a relative URL, is the same as loading a file with the file: protocol.- และก็ไม่เย็นสำหรับหน้าเว็บที่จะสามารถที่จะเพียงแค่การเข้าถึงระบบไฟล์ของคุณในราชประสงค์
ChaseMoskal

41
-1 firsfox จะช่วยให้คุณทำเช่นนี้แน่นอนให้คุณยังใช้ไฟล์เป็นแหล่งกำเนิด (เช่น. คุณกำลังดูไฟล์ในเบราว์เซอร์) เป็นแค่โครเมี่ยมที่แตก
Tomáš Zato - คืนสิทธิ์ให้กับโมนิกา

3
Firefox ยังใช้งานได้ (ใช่จากไฟล์: //), Chrome ไม่ได้อยู่ในกรณีนี้
Evil

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

ทางออกนี้ดี ทำไมในโลกนี้ไม่มีอะไรสมบูรณ์แบบ? ซอฟต์แวร์ทุกตัวก่อกวนผู้ใช้ด้วยข้อบกพร่องข้อบกพร่องพฤติกรรมไร้เดียงสา ฯลฯ Firefox ยังหยิ่งผยองเนื่องจากปฏิเสธที่จะสนับสนุนคุณสมบัติ css "clip-path"
Ĭsααc t իεβöss

ฉันไม่ใช่ js dev และไม่ได้รับประเด็นของการใช้แท็กสคริปต์ที่นี่ แล้วหน้าต่างคืออะไร! = self check for? ใครช่วยอธิบายลำดับการโหลดนี้ได้ไหม ขอบคุณ.
Sharun

Google Chrome จะโหลดแท็กสคริปต์หากอยู่ในไดเร็กทอรีเดียวกับ HTML window!=seldตรวจสอบว่าโค้ดกำลังทำงานใน Web Worker หรือไม่ สิ่งนี้ทำให้โค้ดนี้พกพาได้ในกรณีที่คุณโหลดไฟล์ javascript โดยตรงในบริบทอื่น ๆ
Tomáš Zato - คืนสถานะ Monica

1
@ treeseal7 รหัสที่ควรดำเนินการในบริบทของผู้ปฏิบัติงานบนเว็บ
Tomáš Zato - คืนสถานะ Monica

2
ฉันควรทราบว่าคุณไม่สามารถใช้ importScript จากผู้ปฏิบัติงานที่เขียนแบบนี้ได้ อย่างน้อยไม่ใช่ไม่มีวิธีแก้ปัญหาเพิ่มเติม ดังนั้นคุณจะต้องมีการดัดแปลงเพิ่มเติมสำหรับผู้ทำงานหลายไฟล์
SlugFiller

41

Noble Chicken อธิบายปัญหาได้อย่างถูกต้อง แต่ฉันมีวิธีแก้ปัญหาทั่วไปมากกว่านี้ แทนที่จะติดตั้ง wamp หรือ xamp ด้วย python คุณสามารถไปที่โฟลเดอร์ที่โครงการของคุณโฮสต์อยู่และพิมพ์:python -m http.server

เพียงแค่นั้นคุณก็จะมีเซิร์ฟเวอร์ที่ทำงานอยู่ในโฟลเดอร์นั้นซึ่งเข้าถึงได้จาก localhost


13
Mac อาจต้องใช้งานด้วยpython -m SimpleHTTPServer 8000เนื่องจากโหลดด้วย <Python 3 (เพียงเพื่อบันทึกการค้นหาของ Google อื่น: D)
siege_Perilous

3
คุณยังสามารถติดตั้งโมดูลโหนด http-server จากนั้นไปที่โฟลเดอร์ที่ต้องการจากเทอร์มินัลและเรียกใช้ 'http-server -p 3000'
Huan Zhang

มูลค่าที่จะพูดถึงสคริปต์นี้ "python -m http.server" ต้องใช้ Python 3
milesma

ยังลองphp -S localhost:8000
William Entriken

29

คุณยังสามารถใช้--allow-file-access-from-filesเมื่อคุณเปิด Chrome

ตัวอย่างสำหรับ MacOsX:

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

ข้อมูลเพิ่มเติม: การตั้งค่าผู้ปฏิบัติงานเว็บสำหรับ Chrome


ในหน้าต่างคำสั่ง windows ไปที่: "C: \ Users \ NAME \ AppData \ Local \ Google \ Chrome SxS \ Application" จากนั้นเรียกใช้ chrome.exe --allow-file-access-from-files จากนั้นคัดลอกเส้นทางไฟล์ในเครื่องของคุณ เช่น c: \ temp \ myWeb \ index.html และวางลงใน url ของเบราว์เซอร์ที่เปิดเสร็จแล้ว
milesma

4
คุณยังสามารถสร้างทางลัดและส่งผ่านค่าสถานะในเส้นทางเป้าหมาย
Stephan

1
อ้อและจากคำถามที่เชื่อมโยงอย่าลืมปิดหน้าต่าง Chrome ทั้งหมดก่อนเปิดตัวพร้อมแฟล็ก
Stephan

ใช่ตัวเลือกอื่นสามารถใช้โค้ดส่วนขยาย Chrome โดยได้รับอนุญาตที่ถูกต้องในรายการ: "สิทธิ์": ["file: // * / *"] เช่นในstackoverflow.com/questions/19493020/…
Mickaël

หมายเหตุ: "คุณต้องปิดหน้าต่าง Chrome ทั้งหมดก่อนที่จะเปิดโดยเปิด--allow-file-access-from-filesแฟล็ก" ตามที่ระบุไว้ในstackoverflow.com/a/21771754/325418
nonopolarity

15

เป็นเพราะข้อ จำกัด ด้านความปลอดภัย คุณจำเป็นต้องใช้http://หรือโปรโตคอลแทนhttps://file:///

หากคุณติดตั้ง NodeJS คุณสามารถทำสิ่งต่อไปนี้ได้ - โปรดทราบว่านี่เป็นหนึ่งในตัวเลือกมากมายที่มีให้

ติดตั้งโลคัลเว็บเซิร์ฟเวอร์

$ npm install -g local-web-server

ตอนนี้คุณสามารถใช้มันในโฟลเดอร์ใด ๆ httpที่คุณต้องการเข้าถึงเนื้อหาผ่าน

$ ws

ไปที่http://localhost:8000(พอร์ตเริ่มต้น: 8000)


6

ฉันมีปัญหาเดียวกันกับโพสต์ของคุณเหมือนกัน วิธีแก้ปัญหาคือคุณต้องรันด้วย localhost (wamp หรือ xamp) มันจะเสร็จ


ว้าวฉันไม่เคยพบสิ่งนี้ - ขอบคุณ! (ฉันหวังว่าจะได้
รับคำ


3

คุณต้องมีเว็บเซิร์ฟเวอร์สำหรับการร้องขอจากโปรโตคอล HTTP แทนที่จะเป็นไฟล์ในเครื่องและทำงานได้อย่างถูกต้อง :)


1
ไม่คุณไม่ทำ คุณต้องละเว้นเบราว์เซอร์ที่ไม่เป็นไปตามมาตรฐานเว็บเพียงเพราะเป็นเบราว์เซอร์กระแสหลัก
Tomáš Zato - คืนสถานะ Monica

3

Chromeโหลดไฟล์ แต่ไม่สามารถเรียกใช้งานได้ ใช้Firefox. มันทำงานให้ฉัน


1
เพื่ออธิบายการลงคะแนนของฉัน: สิ่งนี้อาจจะดีกว่าถ้าเริ่มต้นด้วยความคิดเห็นบางทีอาจจะสอบถามเพิ่มเติมเกี่ยวกับข้อกำหนดการสนับสนุนเบราว์เซอร์แทนที่จะส่งเป็นคำตอบ ดูเหมือนว่าจะไม่ได้คำตอบเนื่องจากสิ่งที่ผู้ใช้พูดไปแล้วเกี่ยวกับการรองรับข้ามเบราว์เซอร์
Thomas Poole

หากคุณอ่านคำถามอย่างละเอียดฉันแน่ใจว่าคุณจะไม่ลงคะแนนคำตอบเป็นสามข้อก่อนที่คุณจะโหวต! ผู้ใช้บอกว่า Chrome ไม่สามารถโหลดคนงานได้ ไม่ได้ Chrome โหลดคนงานได้ แต่ไม่สามารถเรียกใช้งานได้ เหตุผลที่ฉันใส่เป็นคำตอบคือคำถามแรกถูกถามเมื่อหนึ่งปีที่แล้วและคำตอบที่สองหลายคนบอกว่า Firefox ไม่ได้เรียกใช้คนงานซึ่งฉันไม่สามารถแสดงความคิดเห็นได้ทั้งหมด ฉันแค่อธิบาย แต่คุณมีสิทธิ์ลงคะแนนหรือโหวตได้
Hocine Ben

3

วิธีง่ายๆในการสร้างเซิร์ฟเวอร์ http ภายใน chromeคือแอพนี้:

เว็บเซิร์ฟเวอร์สำหรับ Chrome

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

คำอธิบาย:

เว็บเซิร์ฟเวอร์สำหรับ Chrome ให้บริการหน้าเว็บจากโฟลเดอร์ในเครื่องผ่านเครือข่ายโดยใช้ HTTP ทำงานแบบออฟไลน์ เว็บเซิร์ฟเวอร์สำหรับ Chrome เป็นเซิร์ฟเวอร์ HTTP แบบโอเพนซอร์ส (MIT) สำหรับ Chrome

ทำงานได้ทุกที่ที่คุณติดตั้ง Chrome คุณจึงสามารถพกพาไปได้ทุกที่ มันยังใช้งานได้กับ ARM chromebooks

ขณะนี้มีตัวเลือกในการฟังบนเครือข่ายท้องถิ่นเพื่อให้คอมพิวเตอร์เครื่องอื่นเข้าถึงไฟล์ของคุณได้ นอกจากนี้ยังสามารถลองและรับที่อยู่อินเทอร์เน็ต

หลายคนใช้สิ่งนี้ในการพัฒนาเว็บขั้นพื้นฐานบน Chromebook นอกจากนี้ยังสะดวกสำหรับการแชร์ไฟล์ผ่านเครือข่ายท้องถิ่นระหว่างคอมพิวเตอร์หรือแม้กระทั่งบนอินเทอร์เน็ต

เมื่อคุณติดตั้งแล้วให้ไปที่http://127.0.0.1:8887

และไม่ปลอดภัยเหมือนแฟล็ก --allow-file-access-from-files


สิ่งนี้ช่างมหัศจรรย์! ตอนนี้ฉันสามารถเรียกใช้แอป reactJS กับผู้ปฏิบัติงานบนเว็บจากระบบไฟล์ภายในเครื่องได้แล้ว ง่ายกว่านี้ไม่ได้แล้ว!
Json

3

นี่เป็นแรงบันดาลใจจากคำตอบของ Thomas ด้านบน แต่มีข้อแม้อย่างหนึ่งที่ฉันต้องการแจกจ่ายเฉพาะ HTML ดังนั้นฉันจึงแปลง js เป็น dataURLด้วยตนเอง และเปิดใช้งานช่องทำเครื่องหมาย URL ข้อมูลในช่องนั้น

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


2

ด้วยการที่ Python 2.x ถูกนำไปใช้งานอย่างกว้างขวางกว่า Python 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;
}

ดังที่กล่าวไว้ chrome ไม่รองรับ ฉันต้องการกำหนดคนงานของฉันในไฟล์เดียวกัน นี่เป็นวิธีแก้ปัญหาที่ใช้งานได้ซึ่งจะเพิ่มจำนวนที่พบใน innerHTML ขององค์ประกอบด้วยid=numทุกๆ 500ms


1

สาเหตุที่อาจเกิดขึ้นคือ Chrome ไม่อนุญาตให้คุณโหลดผู้ปฏิบัติงานบนเว็บเมื่อเรียกใช้สคริปต์จากไฟล์ในเครื่อง และฉันลองรันโค้ดบน firefox ของฉันก็ไม่สามารถทำได้เช่นกัน


Web Workers ทำงานได้ดีfile://ใน Firefox 51.0.1
bryc

-6

ใช่มันจะไม่ทำงานใน chorome หากคุณกำลังโหลดไฟล์ในเครื่อง แต่มันจะทำงานได้ดีในเบราว์เซอร์ firefox และคุณต้องเพิ่มโค้ดด้านล่างในไฟล์ HTML

<head>
    <meta charset="UTF-8" />
</head>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.