掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
大家好,我卡頌。

前端工程師多年來習(xí)慣了在瀏覽器環(huán)境進(jìn)行單線程開發(fā)。
隨著瀏覽器對(duì)web worker的廣泛支持、前端項(xiàng)目復(fù)雜度逐漸提高,「利用worker線程緩解主線程計(jì)算壓力」逐漸成為一種可行方案。
比如,React就曾嘗試將運(yùn)行時(shí)的diff算法放在worker線程執(zhí)行。
然而,社區(qū)眾多的第三方庫(kù)都或多或少操作DOM,worker線程無(wú)法操作DOM的限制(也可以說是特性)使得其應(yīng)用領(lǐng)域被大大限制。
partytown是一個(gè)大小僅6kb的庫(kù),他的作用是讓worker線程擁有包括「操作DOM」在內(nèi)的多項(xiàng)能力。
一旦潘多拉的盒子被打開,這會(huì)成為前端多線程編程的起點(diǎn)么?
我們經(jīng)常在Github上搜索第三方庫(kù),這些開源庫(kù)極大提高了我們的開發(fā)效率。然而第三方庫(kù)有很多潛在隱患:
究其原因,對(duì)于前端應(yīng)用,不管是通過
對(duì)于主線程的API,例如:window、document、localStorage,partytown通過proxy劫持并轉(zhuǎn)發(fā)對(duì)他們的調(diào)用。
比如,如下代碼:
- var w = document.body.clientWidth;
涉及到3個(gè)getter:
partytown會(huì)完成:
由于代理了主線程API,可以實(shí)現(xiàn)沙箱功能,比如:
對(duì)于網(wǎng)絡(luò)請(qǐng)求,web worker會(huì)發(fā)送同步的XHR請(qǐng)求,經(jīng)由Service Worker攔截后與主線程異步通信。
數(shù)據(jù)返回后,Service Worker會(huì)響應(yīng)web worker的請(qǐng)求。
所以,從worker線程角度看,一切調(diào)用都是同步的。這使得大部分原生API在worker線程與主線程中表現(xiàn)一致。
這意味著理論上任何第三方庫(kù)都可以經(jīng)由partytown遷移到worker線程執(zhí)行。
當(dāng)然,凡事都有取舍,對(duì)于partytown來說:
但是,這終究是一次有意義的嘗試。相信在不遠(yuǎn)的將來,會(huì)有越來越多前端應(yīng)用從「多線程」中收益。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流