“Web Workers”在WHATWG里已經(jīng)是LS,被大多數(shù)瀏覽器支持堂氯,詳細可看caniuse蔑担。
在講述Web Workers究竟是什么之前,我們先回頭看一下歷史遺留問題咽白。
痛點:單線程
瀏覽器端的javascript屬于單線程環(huán)境--你不能同時運行多個腳本啤握,也做不到一邊運行著復(fù)雜運算一邊響應(yīng)著用戶的交互事件。
考慮這么一個例子:
我希望用戶打開我的Web App后晶框,在正常使用著應(yīng)用的同時排抬,
偷偷地幫我運行一些耗時很長的破解工作(可能是破解密碼或其他)懂从。
先不考慮這個實例是否道德,而實際上傳統(tǒng)瀏覽器也不提供多線程技術(shù)讓我們實現(xiàn)這種功能蹲蒲。雖然異步番甩、事件機制(如利用setInterval、setTimeout等)在一定程度上能模擬“并行”届搁,但始終不能實現(xiàn)流暢的多線程執(zhí)行缘薛,更別說利用多核CPU。
什么是Web Workers
Web Workers出現(xiàn)的目的就是解決上述的這種單線程卡睦。利用Web Workers技術(shù)宴胧,我們可以在瀏覽器端實現(xiàn)多線程。Web Workers是:
An API for running scripts in the background independently of any user interface scripts.
Web Workers能幫助你創(chuàng)建獨立的表锻、不與頁面線程相互影響的域恕齐,來執(zhí)行你的javascript代碼。
創(chuàng)建一個Worker
下文會用“window域”指代頁面代碼所在的作用域浩嫌。
創(chuàng)建Worker只需要簡單的兩步檐迟,一是注備好你要獨立線程執(zhí)行的代碼,二是new一個Worker:
// secret-job.js
while(true) {
// Do secret jobs.
}
<!-- index.html -->
<script>
let secretWorker = new Worker('secret-job.js');
</script>
上面代碼做了:
- 在window域里創(chuàng)建一個新的Worker码耐,并賦值給secretWorker
- Worker創(chuàng)建的同時追迟,會創(chuàng)建一個新的DedicatedWorkerGlobalScope
- 這個DedicatedWorkerGlobalScope是一個與window域完全獨立的作用域;這兩個作用域下沒有任何共同的東西骚腥,而且由兩個線程分別執(zhí)行
- "secret-job.js"的代碼會在DedicatedWorkerGlobalScope里執(zhí)行
就這樣敦间,你實現(xiàn)了“使用一個新的線程執(zhí)行特定的js代碼”。
創(chuàng)建一個新的Worker時發(fā)生了什么
- 得到一個Worker實例
- 創(chuàng)建一個新的WorkerGlobalScope
- 創(chuàng)建一個新的線程
- 參數(shù)對應(yīng)的js文件的代碼會以WorkerGlobalScope作為context束铭,在這個新的線程里執(zhí)行
但:
- WorkerGlobalScope是什么廓块?
- DedicatedWorkerGlobalScope又是什么?
- 在WorkerGlobalScope下為什么很多東西如window契沫、document都拿不到带猴?
這些東西我會在以后說明,而下篇我們要先討論一個更重要的問題:域(線程)間的通信懈万。