โซลูชัน html5rocks ของการฝังโค้ดผู้ทำงานเว็บใน HTML นั้นค่อนข้างน่ากลัว
และหยดของ JavaScript-as-a-string ที่หนีออกมาก็ไม่ได้ดีไปกว่านั้นเพราะมันทำให้ขั้นตอนการทำงานยุ่งยาก
โดยส่วนตัวแล้วฉันชอบวิธี toString แต่@ dan-manนั่น regex!
แนวทางที่ฉันชอบ:
// 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 );
การสนับสนุนคือจุดตัดของตารางทั้งสามนี้:
สิ่งนี้จะไม่ทำงานสำหรับSharedWorkerอย่างไรก็ตามเนื่องจาก URL จะต้องตรงกันทุกประการแม้ว่าพารามิเตอร์ 'name' ที่เป็นทางเลือกจะตรงกัน สำหรับ SharedWorker คุณจะต้องใช้ไฟล์ JavaScript แยกต่างหาก
การอัปเดตในปี 2558 - ผู้ใช้ ServiceWorker มาถึงแล้ว
ขณะนี้มีวิธีที่มีประสิทธิภาพยิ่งขึ้นในการแก้ปัญหานี้ อีกครั้งให้เก็บรหัสผู้ปฏิบัติงานเป็นฟังก์ชัน (แทนที่จะเป็นสตริงคงที่) และแปลงโดยใช้. toString () จากนั้นแทรกรหัสลงใน CacheStorage ภายใต้ URL คงที่ที่คุณเลือก
// 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'}})
);
});
มีสองทางเลือกที่เป็นไปได้ ObjectURL ดังกล่าวข้างต้นหรือมากกว่าให้ใส่ไฟล์ JavaScript จริงที่ /my_workers/worker1.js
ข้อดีของวิธีนี้คือ:
- SharedWorkers สามารถรองรับได้
- แท็บสามารถแชร์สำเนาแคชเดียวที่ที่อยู่คงที่ วิธีการ blob proliferates objectURLs สุ่มสำหรับทุกแท็บ