Giải pháp html5rocks để nhúng mã nhân viên web trong HTML khá kinh khủng.
Và một chuỗi các chuỗi JavaScript thoát ra cũng không tốt hơn, nhất là vì nó làm phức tạp luồng công việc (Trình biên dịch đóng không thể hoạt động trên các chuỗi).
Cá nhân tôi thực sự thích các phương thức toString, nhưng @ dan-man THẬT regex!
Cách tiếp cận ưa thích của tôi:
// Build a worker from an anonymous function body
var blobURL = URL.createObjectURL( new Blob([ '(',
function(){
//Long-running work here
}.toString(),
')()' ], { type: 'application/javascript' } ) ),
worker = new Worker( blobURL );
// Won't be needing this anymore
URL.revokeObjectURL( blobURL );
Hỗ trợ là giao điểm của ba bảng này:
Tuy nhiên, điều này sẽ không hoạt động đối với SharedWorker , vì URL phải khớp chính xác, ngay cả khi tham số 'tên' tùy chọn khớp. Đối với SharedWorker, bạn sẽ cần một tệp JavaScript riêng.
Cập nhật 2015 - Điểm kỳ dị của ServiceWorker sẽ đến
Bây giờ có một cách thậm chí còn mạnh mẽ hơn để giải quyết vấn đề này. Một lần nữa, lưu trữ mã worker dưới dạng một hàm, (chứ không phải là một chuỗi tĩnh) và chuyển đổi bằng cách sử dụng .toString (), sau đó chèn mã vào CacheStorage theo một URL tĩnh mà bạn chọn.
// Post code from window to ServiceWorker...
navigator.serviceWorker.controller.postMessage(
[ '/my_workers/worker1.js', '(' + workerFunction1.toString() + ')()' ]
);
// Insert via ServiceWorker.onmessage. Or directly once window.caches is exposed
caches.open( 'myCache' ).then( function( cache )
{
cache.put( '/my_workers/worker1.js',
new Response( workerScript, { headers: {'content-type':'application/javascript'}})
);
});
Có hai dự phòng có thể xảy ra. ObjectURL như trên, hoặc liền mạch hơn, đặt một thực tế tệp JavaScript tại /my_workers/worker1.js
Ưu điểm của phương pháp này là:
- SharedWorkers cũng có thể được hỗ trợ.
- Các tab có thể chia sẻ một bản sao được lưu trong bộ nhớ cache tại một địa chỉ cố định. Cách tiếp cận blob tăng sinh đối tượng ngẫu nhiên cho mỗi tab.