Web Worker爲Web內容在後臺線程中運行腳本提供了一種簡單的方法。線程能夠執行任務而不干擾用戶界面。此外,他們能夠使用XMLHttpRequest執行 I/O (儘管responseXML和channel屬性老是爲空)。一旦建立, 一個worker 能夠將消息發送到建立它的JavaScript代碼, 經過將消息發佈到該代碼指定的事件處理程序(反之亦然)。
Worker 線程沒法讀取本地文件,即不能打開本機的文件系統(file://),它所加載的腳本,必須來自網絡。因此咱們得起一個項目。使用http-server
最簡單
安裝:html
> cnpm i -g http-server
使用:git
> http-server
咱們新建一個文件夾名叫worker
,裏面新建三個文件分別是github
index.html main.js worker.js
新建一個worker
線程很簡單,只需:web
var worker = new Worker('worker.js')
main.js
:npm
var worker = new Worker('./worker.js') console.log('worker running') worker.addEventListener('message',e => { console.log('main: ', e.data); }) // 也可以使用: // worker.onmessage = (e)=>{ // console.log('main: ', e.data); // } worker.postMessage('hello worker,I am from main.js')
worker.js
:瀏覽器
console.log('worker task running') onmessage = (e)=>{ console.log('worker task receive', e.data); // 發送數據事件 postMessage('Hello, I am from Worker.js'); }
在worker文件夾下,命令行輸入http-server,啓動項目,用瀏覽器打開,看控制檯:網絡
worker running worker task running worker task receive hello worker,I am from main.js main: Hello, I am from Worker.js
從上面能夠看到,worker
經過onmessage
來監聽數據,經過postMessgae
來發送數據post
worker.terminate();
worker.addEventListener('error', (e) => { console.log('main error', 'filename:' + e.filename + 'message:' + e.message + 'lineno:' + e.lineno; });
main.js命令行
var worker = new Worker('./worker1.js');
worker1.js線程
console.log("I'm worker1") importScripts('worker2.js', 'worker3.js'); // 或者 // importScripts('worker2.js'); // importScripts('worker3.js');
worker2.js
console.log("I'm worker2")
worker3.js
console.log("I'm worker3")
https://caniuse.com/#feat=webworkers
兼容性還不是很樂觀,不過在移動端的兼容性還不錯