建設下一代 Web 開放技術——WebContain
基於 Webassembly + QuickJS 的 Web 安全沙箱技術方案,面向 Web 端建設下一代開放技術
背景
Web 端側的開放技術長期以來一直在尋找最好的解決方案,從早期基於 Webview + API管控 的開放形式 ,到目前基於小程式的重容器的架構方案。或多或少都無法全面的解決開發者體驗的問題,API 開放形式無法做到安全管控,小程式開放形式的架構必然會給業務帶來孤島效應。如何給開發者帶來更好的研發體驗、給商家帶來更好的產品體驗一直是我們淘寶開放技術前端團隊的命題。
經過半年的技術演進和業務落地,我們自研了一套基於 Webassembly + QuickJS 的架構方案,來解決上述的問題。
目標
三年的小程式形式開放基礎已經形成了規模化壁壘,落地新的技術方案必然考慮到成本問題,所以本次架構升級的目標可以描述為 “面向 Web 端建設下一代 PC 開放技術,建設基於 W3C 標準的 Web 技術三方開放方案,與小程式、小部件開放形態互補,構建電商域的完整開放技術生態”。
思考
端側開放到底解決什麼問題,我理解開放技術在端側主要圍繞這2個點:如何讓外部程式碼安全的可控的執行 、 使用者資料的安全如何保障,做到無端不透;
-
關於第一個點落實到細節是 JavaScript/CSS/HTML 如何執行的問題。我的解法是:JavaScript 執行在 Webassembly+QuickJS 安全容器裡,基於 Webassembly 的安全水位保障 JS 執行的隔離和可控;CSS 基於 Shadow DOM + iframe 做到樣式隔離。
-
資料安全主要依託瀏覽器容器環境對資料做加簽驗籤加密操作,本文章不展開講解;
技術細節
工欲其事必先利器,我們先對技術底層細節做一個瞭解
▐ WebAssembly
圖來源地址(http://medium.com/jspoint/the-anatomy-of-webassembly-writing-your-first-webassembly-module-using-c-c-d9ee18f7ac9b)
這裡重點提到2個事情:
-
WebAssembly 二進位制碼會經過 Liftoff 生成未優化的 ByteCode,再給到 TurboFan 優化程式碼編譯為機器碼
-
WebAssembly 和 JavaScript 的編譯後端是共享的,WebAssembly 的盡頭是和架構相關的機器碼,這裡是一個關鍵點也是 VM 和 HOST 同步呼叫的關鍵點。
▐ WebContainer 架構
本質上我們會以 App 級別的思想來架構方案(多頁面、路由、通訊),底層執行時基於 QuickJS ,涉及到多頁面管理、鑑權、記憶體分析等等。
▐ Binding 細節
外部程式碼的 Runtime 會執行到 Quickjs 裡,執行環境需要模擬和瀏覽器環境一致,這個時候涉及到 API Binding設計,在 HOST JavaScript Runtime 定義 W3C 規範,通過 WebAssembly 的記憶體 Binding 到 Quickjs Runtime 中,當外部程式碼呼叫對應方法時,會對映到 HOST 實現,通過安全管控策略再執行到 HOST 環境中。
▐ 研發模式
WebContainer 的本質要解決開發者體驗問題,做到上層框架無關,所以在安全的水位上我們不會約束今天開發者的框架體系。但是我們需要定義 App Export 的介面。
▐ Benchmark
系統 | L-PC1328H5-1417 Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz 1.80 GHz Qianniu/9.05.02N | |||
---|---|---|---|---|
平臺/Case | 型別 | PC 小程式 (V8)(JIT) | PC 小程式 localwebview (Webkit)(JIT) | WebContainer (AOT) |
核心資訊 | 型別 | AliApp(QN/9.5.2) Ariver/1.0.0.5 Platform/PC | Chrome/90.0.4430.93 AppleWebKit/537.36 (KHTML, like Gecko) |
Chrome/90.0.4430.93 AppleWebKit/537.36 (KHTML, like Gecko) |
testStringIndexOf | VM | 813,394,664 ops/sec | 807,470,265 ops/sec | 6,424,450 ops/sec |
testStringMatch | 24,794,109 ops/sec | 19,488,381 ops/sec | 556,760 ops/sec | |
testRegExp | 38,638,752 ops/sec | 38,599,956 ops/sec | 761,215 ops/sec | |
testDOM | / | 2,346,600 ops/sec | 14,307 ops/sec | |
MessageChannel | 通訊 | 702 ops/sec | 286 ops/sec | 101,536 ops/sec |
相對於純小程式的通訊效率提升355倍,但是受到安全容器的限制 JS 執行相對於底層 V8 引擎降低到 1%,但是也是足夠用於生產環境的。
業務落地
在商傢俬域場景,我們已經在旺鋪裝修表單落地,目前ISV反饋非常不錯,業務平臺未來會全量替換到新開放容器中。
未來
繼續基於 WebContainer 能力做上層開放體系的建設,解決外掛體系。解決啟動耗時的問題。技術底層完善 Quickjs Debug 能力。
✿ 拓展閱讀
作者 | 影逸
編輯| 橙子君
- 淘寶直播PC客戶端的hybrid探索
- iOS繪製物理按鈕 - 透明圓角漸變邊框
- SIGIR2022 | 流行度偏差如何利用?探索解耦域適應無偏召回模型
- 多模態技術在淘寶主搜召回場景的探索
- 合理使用執行緒池以及執行緒變數
- CVPR 2022 | GEN-VLKT:基於預訓練知識遷移的HOI檢測方法
- 大淘寶使用者平臺技術團隊單元測試建設
- 淺入淺出代理模式與Spring事務管理
- 內容推薦場景中自監督學習的應用
- 下一代響應式Web設計:元件驅動式Web設計
- 淘系使用者平臺技術團隊單元測試建設
- CVPR2022 | 開源:基於間距自適應查詢表的實時影象增強方法
- 建設下一代 Web 開放技術——WebContain
- MaxCompute中的JSON資料處理
- 無盡流場景優化總結
- 淺談 TS 標稱型別介紹及社群實現
- 2022大淘寶技術工程師推薦書單
- Flutter 新一代圖形渲染器 Impeller
- 面向前端與未來標準的Node.js Web 框架再進化
- 無線運維的起源與專案建設思考