成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

前端以后也要多線程編程了么?

開發 前端
前端工程師多年來習慣了在瀏覽器環境進行單線程開發。隨著瀏覽器對web worker的廣泛支持、前端項目復雜度逐漸提高,「利用worker線程緩解主線程計算壓力」逐漸成為一種可行方案。

[[426492]]

大家好,我卡頌。

前端工程師多年來習慣了在瀏覽器環境進行單線程開發。

隨著瀏覽器對web worker的廣泛支持、前端項目復雜度逐漸提高,「利用worker線程緩解主線程計算壓力」逐漸成為一種可行方案。

比如,React就曾嘗試將運行時的diff算法放在worker線程執行。

然而,社區眾多的第三方庫都或多或少操作DOM,worker線程無法操作DOM的限制(也可以說是特性)使得其應用領域被大大限制。

partytown是一個大小僅6kb的庫,他的作用是讓worker線程擁有包括「操作DOM」在內的多項能力。

一旦潘多拉的盒子被打開,這會成為前端多線程編程的起點么?

第三方庫的壞處

我們經常在Github上搜索第三方庫,這些開源庫極大提高了我們的開發效率。然而第三方庫有很多潛在隱患:

  • 第三方庫可能執行不為人知的操作(比如向未知服務器發送請求)
  • 可能占用主線程過多算力
  • 可能使用一些有害的API(比如document.write)

究其原因,對于前端應用,不管是通過<script>標簽插入,還是通過打包工具打包,最終在宿主環境(比如瀏覽器),第三方庫與你編寫的代碼都是以同樣的地位運行在主線程中的。

這就帶來性能、安全方面的潛在風險。

partytown的出現就是為了解決以上問題。

partytown的作用

當引入partytown后,書寫在如下script內的腳步會在worker線程中執行:

  1. <script type="text/partytown"
  2.   // 第三方庫 
  3. </script> 

對于主線程的API,例如:window、document、localStorage,partytown通過proxy劫持并轉發對他們的調用。

比如,如下代碼:

  1. var w = document.body.clientWidth; 

涉及到3個getter:

  1. get document
  2. get body
  3. get clientWidth

partytown會完成:

  1. 劫持getter,將他們轉發到主線程
  2. 獲取數據后返回
  3. 步驟1和2之間數據的序列化、反序列化

由于代理了主線程API,可以實現沙箱功能,比如:

  • 限制對document.cookie訪問
  • 返回定制的navigator.userAgent
  • 禁止第三方庫訪問localStorage
  • 重置危險方法(如document.write)
  • 阻止腳步訪問其他腳本

對于網絡請求,web worker會發送同步的XHR請求,經由Service Worker攔截后與主線程異步通信。

數據返回后,Service Worker會響應web worker的請求。

所以,從worker線程角度看,一切調用都是同步的。這使得大部分原生API在worker線程與主線程中表現一致。

這意味著理論上任何第三方庫都可以經由partytown遷移到worker線程執行。

總結

當然,凡事都有取舍,對于partytown來說:

  • worker線程的DOM操作都是阻塞的,不如主線程高效
  • 經由Service Worker攔截的請求在Network面板相比普通請求略有差異
  • 類似event.preventDefault()和passive event listeners在worker線程無效

但是,這終究是一次有意義的嘗試。相信在不遠的將來,會有越來越多前端應用從「多線程」中收益。

 

責任編輯:姜華 來源: 魔術師卡頌
相關推薦

2013-07-16 10:12:14

iOS多線程多線程概念多線程入門

2023-06-13 13:39:00

多線程異步編程

2009-03-12 10:52:43

Java線程多線程

2023-05-10 07:42:26

Java多線程編程

2023-04-02 17:53:10

多線程編程自測

2023-06-07 13:49:00

多線程編程C#

2023-06-05 07:56:10

線程分配處理器

2023-06-06 08:17:52

多線程編程Thread類

2013-07-16 12:13:27

iOS多線程多線程概念GCD

2011-06-13 10:41:17

JAVA

2013-07-16 10:57:34

iOS多線程多線程概念多線程入門

2011-06-07 17:35:39

iphone 多線程

2018-10-25 15:55:44

Java多線程鎖優化

2013-07-15 15:35:06

2011-07-22 14:55:20

多線程

2012-05-18 10:36:20

CC++編程

2011-06-13 10:03:19

Qt 多線程 編程

2009-02-24 08:36:51

多線程線程池網絡服務器

2009-07-29 16:42:35

Java多線程編程

2021-08-12 14:33:20

Python多線程編程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91久久精品 | 密桃av| 999www视频免费观看 | 亚洲风情在线观看 | 天堂国产| 日本高清不卡视频 | 亚洲欧美综合 | 亚洲精选一区二区 | 国产在线观看不卡一区二区三区 | 久久久久亚洲av毛片大全 | 激情在线视频 | 日韩中文一区二区三区 | 中文字幕中文字幕 | 欧美精品一区二区三区在线播放 | 在线午夜 | 在线成人精品视频 | 天天干视频网 | 日本字幕在线观看 | 亚洲看片| 国产91久久久久久 | 亚洲精品一区在线观看 | 97精品久久 | 中文字幕精品视频 | 久久伊 | 欧美一级二级在线观看 | 三级av在线 | 免费黄色a级毛片 | 一区二区不卡视频 | 一区二区三区精品视频 | 国产激情视频网址 | 在线观看黄色 | 欧美一区二区三区在线观看视频 | 日本字幕在线观看 | 成人av色 | 在线免费看91 | 一本色道久久综合亚洲精品高清 | 一区二区三区久久 | 国产目拍亚洲精品99久久精品 | 国产精品三级久久久久久电影 | 色综合99 | 久久久.com |