Chrome không thể tải nhân viên web


109

Tôi đang làm việc trên một dự án sử dụng nhân viên web.

Trong phần đầu của tôi, tôi có mã này:

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

Điều này hoạt động tốt trong Safari, nhưng Chrome báo cáo lỗi sau:

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

Tại sao điều này hoạt động hoàn hảo trong Safari mà không phải Chrome? Làm cách nào để sửa lỗi này?

Cảm ơn bạn.


1
Bạn có đang làm việc với giao thức tệp không? Nếu bạn được đặt cờ truy cập và xem nó có hoạt động hay không: stackoverflow.com/questions/18586921/…
epascarello

1
Vâng, con đường cho người lao động web là thế này: file:///E:/programming/web/project/worker.js. Các đường dẫn cho các dự án chính là thế này: file:///E:/programming/web/project/index.html.
Progo

Câu trả lời:


84

Chrome không cho phép bạn tải nhân viên web khi chạy tập lệnh từ tệp cục bộ.


6
Từ câu trả lời này , Loading a local file, even with a relative URL, is the same as loading a file with the file: protocol.- và không hay ho gì khi các trang web có thể chỉ truy cập hệ thống tệp của bạn một cách tùy ý.
ChaseMoskal,

41
-1 firsfox tất nhiên sẽ cho phép bạn làm điều này, miễn là bạn cũng đang sử dụng tệp làm nguồn gốc (ví dụ: bạn đang xem tệp cục bộ trong trình duyệt). Nó chỉ là chrome bị hỏng.
Tomáš Zato - Phục hồi Monica

3
Firefox vẫn hoạt động (có từ tệp: //), Chrome thì không.
Evil

55

Tôi sử dụng một cách giải quyết khác. Chrome chặn Workernhưng không <script>. Do đó, cách tốt nhất để tạo ra một giải pháp phổ quát là:

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

Sau đó bạn liên kết nó như bình thường <script src="...". Và khi hàm được xác định, bạn sử dụng đoạn mã ghê tởm này:

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

Giải pháp này là tốt. Tại sao trên đời này không có gì là hoàn hảo? Mọi phần mềm đều kích động người dùng với lỗi, sai sót, hành vi trẻ con, v.v. Firefox cũng rất kiêu ngạo khi từ chối hỗ trợ tài sản css "clip-path".
Ĭsααc t ի ε βöss

Tôi không phải là một nhà phát triển js và không hiểu vấn đề sử dụng thẻ script ở đây. And the window! = Self check for là gì? Ai đó có thể vui lòng giải thích trình tự tải này không? Cám ơn.
Sharun

Các thẻ script sẽ được google chrome tải nếu chúng nằm trong cùng thư mục với HTML. window!=seldkiểm tra xem mã có đang chạy trong web worker hay không. Điều này làm cho mã này có thể di động trong trường hợp bạn tải trực tiếp tệp javascript trong các ngữ cảnh khác.
Tomáš Zato - Phục hồi Monica

1
@ treeseal7 Mã sẽ thực thi trong ngữ cảnh web worker.
Tomáš Zato - Phục hồi Monica

2
Tôi nên lưu ý rằng bạn không thể sử dụng importScript từ một worker được viết như thế này. Ít nhất, không phải là không có một giải pháp bổ sung. Vì vậy, bạn sẽ cần giả mạo nhiều hơn cho một trình xử lý nhiều tệp.
SlugFiller

41

Vấn đề đã được Noble Chicken giải thích hợp lý nhưng tôi có một giải pháp chung hơn cho nó. Thay vì cài đặt wamp hoặc xamp, với python, bạn có thể điều hướng đến thư mục mà dự án của bạn được lưu trữ và nhập:python -m http.server

Chỉ vậy thôi và bạn sẽ có một máy chủ đang chạy trên thư mục đó, có thể truy cập được từ localhost.


13
Mac có thể sẽ cần phải đi với python -m SimpleHTTPServer 8000khi họ đang nạp với <Python 3 (chỉ để tiết kiệm một tìm kiếm google: D)
siege_Perilous

3
bạn cũng có thể cài đặt mô-đun nút máy chủ http và sau đó điều hướng đến thư mục mong muốn từ thiết bị đầu cuối và chạy 'http-server -p 3000'.
Huan Zhang

đáng đề cập đến tập lệnh này "python -m http.server" cần Python 3.
milema

Cũng thửphp -S localhost:8000
William Entriken

29

Bạn cũng có thể sử dụng cờ --allow-file-access-from-files khi khởi chạy Chrome.

Ví dụ cho MacOsX:

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

Thông tin thêm: Cài đặt nhân viên web cho chrome


Trên cửa sổ lệnh windows điều hướng đến: "C: \ Users \ NAME \ AppData \ Local \ Google \ Chrome SxS \ Application", sau đó chạy chrome.exe --allow-file-access-from-files, sau đó sao chép đường dẫn tệp cục bộ của bạn ví dụ: c: \ temp \ myWeb \ index.html và dán vào url của trình duyệt đã mở, xong.
milema

4
Bạn cũng có thể tạo một lối tắt và chuyển cờ trong đường dẫn đích.
Stephan

1
Ồ và từ câu hỏi được liên kết, hãy nhớ đóng tất cả các cửa sổ Chrome trước khi khởi chạy với cờ.
Stephan

Đúng vậy, một tùy chọn khác cũng có thể là mã một Tiện ích mở rộng Chrome với quyền phù hợp trong tệp kê khai của nó: "permissions": ["file: // * / *"], như trong stackoverflow.com/questions/19493020/…
Mickaël

Lưu ý: "Bạn phải đóng tất cả các cửa sổ của Chrome trước khi mở khi bật --allow-file-access-from-filescờ". như đã nêu trên stackoverflow.com/a/21771754/325418
nonopolarity,

15

Đó là vì các hạn chế bảo mật. Bạn cần sử dụng http://hoặc https://giao thức thay vì file:///.

Nếu bạn đã cài đặt NodeJS, bạn chỉ cần làm như sau. - Lưu ý rằng đây là một trong nhiều tùy chọn có sẵn

Cài đặt máy chủ web cục bộ

$ npm install -g local-web-server

Bây giờ bạn có thể sử dụng nó trong bất kỳ thư mục nào mà bạn muốn truy cập nội dung http.

$ ws

Điều hướng đến http://localhost:8000(cổng mặc định: 8000)


6

Tôi cũng có vấn đề tương tự như bài viết của bạn. Giải pháp là bạn phải chạy nó với localhost (wamp hoặc xamp). Nó sẽ được thực hiện.


Wow, tôi sẽ không bao giờ tìm thấy điều này - cảm ơn! (Tôi hy vọng nhờ được phép trong ý kiến)
dcromley

4

Một giải pháp khác là sử dụng máy chủ web của Google cho tiện ích mở rộng của Chrome . Chọn thư mục công việc của bạn và khởi động máy chủ, Xong!


3

bạn cần một máy chủ web cho yêu cầu từ giao thức HTTP Thay vì tệp cục bộ và hoạt động chính xác :)


1
Không, bạn không. Bạn cần bỏ qua các trình duyệt không tuân theo tiêu chuẩn web chỉ vì chúng là chủ đạo.
Tomáš Zato - Phục hồi Monica

3

Chrometải tệp nhưng không thể chạy nó. Sử dụng Firefox. Nó làm việc cho tôi.


1
Để giải thích phản đối của tôi: Điều này có thể tốt hơn là bắt đầu bằng một nhận xét, có lẽ là hỏi thêm về các yêu cầu hỗ trợ trình duyệt của họ, thay vì được gửi dưới dạng câu trả lời. Có vẻ như nó không phải là một câu trả lời, với những gì người dùng đã nói về hỗ trợ trình duyệt chéo.
Thomas Poole

Nếu bạn đã đọc kỹ câu hỏi, tôi chắc chắn rằng bạn sẽ không bỏ phiếu cho câu trả lời là ba trước khi bạn bỏ phiếu! Người dùng đang nói rằng Chrome không thể tải nhân viên. Không, chrome có thể tải worker nhưng không thể chạy nó. Lý do tại sao tôi đặt nó như một câu trả lời là đầu tiên câu hỏi được hỏi một năm trước và câu trả lời thứ hai nói rằng Firefox không chạy công nhân mà tôi không thể nhận xét tất cả chúng. Tôi chỉ giải thích nhưng bạn có quyền bỏ phiếu hoặc bỏ phiếu.
Hocine Ben

3

Cách dễ dàng để tạo máy chủ http cục bộ trong chrome là ứng dụng này:

Máy chủ web dành cho Chrome

https://chrome.google.com/webstore/detail/web-server-for-chrome/ofhbbkphhbklhfoeikjpcbhemlocgigb/ liên quan

Sự miêu tả:

Máy chủ Web dành cho Chrome, cung cấp các trang web từ một thư mục cục bộ qua mạng, sử dụng HTTP. Chạy ngoại tuyến. Máy chủ web dành cho Chrome là một máy chủ HTTP mã nguồn mở (MIT) dành cho Chrome.

Nó chạy ở bất kỳ đâu mà bạn đã cài đặt Chrome, vì vậy bạn có thể mang nó đi bất cứ đâu. Nó thậm chí còn hoạt động trên chromebook ARM.

Bây giờ nó có tùy chọn để nghe trên mạng cục bộ, vì vậy các máy tính khác có thể truy cập tệp của bạn. Ngoài ra, nó có thể thử và lấy một địa chỉ internet.

Nhiều người sử dụng điều này để phát triển web cơ bản trên chromebook. Nó cũng rất tiện lợi để chia sẻ tệp qua mạng cục bộ giữa các máy tính hoặc thậm chí trên internet.

Sau khi bạn cài đặt nó, hãy điều hướng đến http://127.0.0.1:8887

Và nó không phải là không an toàn vì cờ --allow-file-access-from-files


Thật đáng kinh ngạc! Bây giờ tôi có thể chạy ứng dụng reactJS của mình với web worker từ hệ thống tệp cục bộ. Không thể dễ dàng hơn nhiều!
Json

3

Điều này được lấy cảm hứng từ câu trả lời Thomas ở trên. Nhưng có một lưu ý rằng tôi chỉ muốn phân phối HTML, vì vậy tôi đã chuyển đổi thủ công js thành dataURL . và bật hộp kiểm URL dữ liệu trong đó.

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


2

Với việc Python 2.x được triển khai rộng rãi hơn Python 3.x, một cái gì đó giống như python -m SimpleHTTPServer 8000được áp dụng rộng rãi hơn và không chỉ dành cho Mac OS X. Ví dụ, tôi thấy nó cần thiết để sử dụng trong Cygwin.

Với điều đó, ví dụ này hoạt động như một nhà vô địch.


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

Như đã đề cập chrome không hỗ trợ nó. Tôi muốn xác định công nhân của mình trong cùng một tệp. Đây là một cách giải quyết hiệu quả sẽ làm tăng một số được tìm thấy trong innerHTML của phần tử với id=nummỗi 500ms.


1

Một lý do có thể là chrome không cho phép bạn tải web worker khi chạy tập lệnh từ tệp cục bộ. Và tôi thử chạy mã trên firefox của mình, cũng không được.


Công nhân web chạy tốt trên file://Firefox 51.0.1
bryc

-6

Có, Nó sẽ không hoạt động trong chorome nếu bạn đang tải tệp cục bộ. Nhưng nó sẽ hoạt động tốt trong trình duyệt firefox. Và bạn phải thêm mã bên dưới vào tệp HTML.

<head>
    <meta charset="UTF-8" />
</head>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.