在vite中使用web worker

vite中使用web worker

1.web worker介紹

JavaScript是單線程模型,所有任務(wù)只能在一個(gè)線程上完成莹菱,前面的事情沒有完畢,后面的事情要等待前面的事情處理完畢后才能執(zhí)行吱瘩。但隨著電腦計(jì)算能力的增強(qiáng)道伟,尤其是多核CPU的出現(xiàn),單線程已無法充分發(fā)揮計(jì)算機(jī)的計(jì)算能力使碾。

web worker可為 JavaScript創(chuàng)造多線程環(huán)境蜜徽,允許主線程創(chuàng)建worker線程,可將一些計(jì)算密集型或高延遲的任務(wù)分配給worker部逮。worker 線程在后臺(tái)運(yùn)行娜汁,與主線程互不干擾。等到 worker 線程完成計(jì)算任務(wù)兄朋,再把結(jié)果返回給主線程掐禁。如此,可有效提高應(yīng)用性能颅和。

2.原生環(huán)境使用web worker

**原生環(huán)境使用`worker`示例:**

下面代碼功能傅事,主線程發(fā)送兩個(gè)數(shù)字給worker,worker求兩數(shù)字之和峡扩,再將結(jié)果發(fā)送回主線程

`./main.js` `(main thread)`
// 兼容性判斷
if (window.Worker) {
  // 1.創(chuàng)建一個(gè)worker
  const myWorker = new Worker('worker.js');

  // 2.worker消息監(jiān)聽
  myWorker.onmessage = e => {
    const data = e.data;
    console.log(`Message received from worker, sum: ${data.sum}`);
  };

  // 3.worker異常監(jiān)聽
  myWorker.onerror = e => {
    console.error(e);
  };

  // 4.向worker線程發(fā)送數(shù)據(jù)蹭越,注意,只能傳遞一個(gè)參數(shù)教届,如有多個(gè)參數(shù)响鹃,可以包裝成Object
  myWorker.postMessage({ a: 1, b: 2 });

  // 5.當(dāng)離開頁面的時(shí)候,或者需要結(jié)束worker時(shí)(比如任務(wù)完成時(shí))案训,
  // 可以結(jié)束Worker線程买置,不必占用資源
  // myworker.terminate();
} else {
  // 不支持web worker
  console.log("Your browser doesn't support web workers.");
}
`./worker.js` `(worker thread)`
// 1.監(jiān)聽主線程消息
self.onmessage = e => {
  // 2.接收來自主線程發(fā)送過來的數(shù)據(jù)
  const data = e.data;
  console.log(`Message received from main thread, a: ${data.a}, b: ${data.b}`);
  const sum = data.a + data.b;
  // 3.將結(jié)果發(fā)送給主線程
  self.postMessage({ sum });
};

// 4.在worke 線程中也可以監(jiān)聽錯(cuò)誤信息
self.onerror = e => {
  console.log(e);
};

// 5.worker線程也可以調(diào)用close結(jié)束worker線程
// self.close();

一些API說明:

  • 主線程可調(diào)用原生API Worker()函數(shù),新建一個(gè)worker

    Worker()構(gòu)造函數(shù)的參數(shù)是一個(gè)腳本文件强霎,該文件就是 worker 線程所要執(zhí)行的任務(wù)忿项。

    var worker = new Worker('work.js');
    
  • 然后,主線程可調(diào)用worker.postMessage()方法城舞,向 worker 發(fā)消息

    worker.postMessage('Hello World');
    
  • 接著轩触,主線程通過worker.onmessage定義監(jiān)聽函數(shù),接收worker發(fā)回來的消息

    worker.onmessage = (e) => {
      console.log('Received message: ' + e.data);
    }
    
  • 最后家夺,worker完成任務(wù)以后脱柱,主線程就可以把它關(guān)掉

    worker.terminate();
    

web worker注意點(diǎn):

  • 同源限制

    worker腳本文件必須與主線程文件同源。

  • API限制

    worker線程的全局對象與主線程不一樣拉馋,無法讀取網(wǎng)頁的DOM對象褐捻,也無法使用document掸茅、windowparent這些對象柠逞。但是可以使用navigator對象和location對象。也可以使用XMLHttpRequest對象發(fā)出 AJAX 請求景馁。

  • 通信

    worker線程和主線程不在同一個(gè)上下文環(huán)境板壮,不能共用變量,如果要交互信息合住,必須通過postMessage完成绰精。

3.vite中使用web worker

vite也支持web worker,不過其中存在一些陷阱透葛,官方提供了兩種使用web worker的方式笨使,官方文檔傳送門

  • 帶有查詢后綴的導(dǎo)入

    import Worker from './worker.js?worker'
    const worker = new Worker()
    

    此方式在vite2.x版本下,可在測試環(huán)境和正式環(huán)境正常使用(親測)

  • 通過構(gòu)造器導(dǎo)入(官方推薦方式)

    const worker = new Worker(new URL('./worker.js', import.meta.url), {
      type: 'module',
    })
    

    此方式在vite2.x版本下僚害,只能在測試環(huán)境正常工作硫椰,無法用于生產(chǎn)環(huán)境(親測)

vite中使用的完整示例,依然是實(shí)現(xiàn)求和功能:

main.js (也可以是.vue文件中的任意主線程腳本)

import myWorker from './myWorker?worker&inline';

let worker = null;
if (window.Worker) {
  worker = new myWorker();
  worker.onmessage = e => {
    const data = e.data;
    console.log(data.sum);
  };
  worker.onerror = e => console.error(e);
}

if (worker) {
  worker.postMessage({ a: 1, b: 2 });
}

myWorker.js(需要處于src目錄下萨蚕,如果處于public目錄將無法使用靶草,親測)

self.onmessage = e => {
  const data = e.data;
  const sum = data.a + data.b;
  self.postMessage({ sum });
};

self.onerror = e => console.log(e);

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市岳遥,隨后出現(xiàn)的幾起案子奕翔,更是在濱河造成了極大的恐慌,老刑警劉巖浩蓉,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件派继,死亡現(xiàn)場離奇詭異,居然都是意外死亡捻艳,警方通過查閱死者的電腦和手機(jī)驾窟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讯泣,“玉大人纫普,你說我怎么就攤上這事『们” “怎么了昨稼?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拳锚。 經(jīng)常有香客問我假栓,道長,這世上最難降的妖魔是什么霍掺? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任匾荆,我火速辦了婚禮拌蜘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘牙丽。我一直安慰自己简卧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布烤芦。 她就那樣靜靜地躺著举娩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪构罗。 梳的紋絲不亂的頭發(fā)上铜涉,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機(jī)與錄音遂唧,去河邊找鬼芙代。 笑死,一個(gè)胖子當(dāng)著我的面吹牛盖彭,可吹牛的內(nèi)容都是我干的纹烹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼谬泌,長吁一口氣:“原來是場噩夢啊……” “哼滔韵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掌实,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤陪蜻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后贱鼻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宴卖,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年邻悬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了症昏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡父丰,死狀恐怖肝谭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛾扇,我是刑警寧澤攘烛,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站镀首,受9級特大地震影響坟漱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜更哄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一芋齿、第九天 我趴在偏房一處隱蔽的房頂上張望腥寇。 院中可真熱鬧,春花似錦觅捆、人聲如沸赦役。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扩劝。三九已至,卻和暖如春职辅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背聂示。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工域携, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鱼喉。 一個(gè)月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓秀鞭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扛禽。 傳聞我的和親對象是個(gè)殘疾皇子锋边,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一、概述 JavaScript 語言采用的是單線程模型编曼,也就是說豆巨,所有任務(wù)只能在一個(gè)線程上完成,一次只能做一件事掐场。...
    你瞅瞅你寫的bug閱讀 509評論 0 1
  • 準(zhǔn)備給我的一個(gè) Vite 項(xiàng)目進(jìn)行重構(gòu)往扔,其中一個(gè)功能(函數(shù))要花費(fèi) JS 主線程大量時(shí)間,會(huì)導(dǎo)致主線程畫面卡死熊户,無...
    硅谷干貨閱讀 2,698評論 0 2
  • 最近對Web Worker進(jìn)行了系統(tǒng)學(xué)習(xí)萍膛,主要看了阮大的教程[https://www.ruanyifeng.com...
    絕塵kinoko閱讀 1,002評論 0 0
  • Web Worker能夠?qū)崿F(xiàn)在后臺(tái)線程中運(yùn)行其他腳本文件,同時(shí)線程可以執(zhí)行任務(wù)而不干擾用戶界面嚷堡。當(dāng)一些不直接操作D...
    smallzip閱讀 2,207評論 0 2
  • 一蝗罗、概述 JavaScript 語言采用的是單線程模型,也就是說蝌戒,所有任務(wù)只能在一個(gè)線程上完成串塑,一次只能做一件事。...
    零星小雨_c84a閱讀 2,452評論 0 2