在你沒崛起之前,臉是用來丟的
大家好,我是柒八九。一個專注于前端開發技術/Rust
及AI
應用知識分享的Coder
此篇文章所涉及到的技術有
WebAssembly
Rust
Web Worker
(comlink
)wasm-pack
Photon
ffmpeg.wasm
- 腳手架生成前端項目
因為,行文字數所限,有些概念可能會一帶而過亦或者提供對應的學習資料。請大家酌情觀看。
前言
說起,前端性能優化,大家可能第一時間就會從網絡/資源加載/壓縮資源
等角度考慮。
正如下面所展示的一樣。
上面所列的措施,是我們常規優化方案。針對上面的內容我們有機會來講講該如何做。
而今天呢,我們和大家嘮嘮利用WebAssembly
來優化前端渲染鏈路或者針對關鍵節點進行調優處理。
好了,天不早了,干點正事哇。
我們能所學到的知識點
- WebAssembly是個啥?
- 項目初始化&配置
- Rust項目初始化
- 處理耗時任務
- 圖像處理
- 優化音視頻
- 優化游戲體驗
1. WebAssembly是個啥?
之前,我們在瀏覽器第四種語言-WebAssembly已經對WebAssembly
有過介紹,為了行文的完整,我們再用簡短的內容解釋一下它。
WebAssembly
是一種二進制指令格式,旨在在瀏覽器中高效執行。
- 它作為JavaScript的補充,允許我們用
Rust
、C++
和C
等語言編寫性能關鍵代碼,并在瀏覽器中運行(還記得我們前幾天的文章Rust 賦能前端 – 寫一個 File 轉 Img 的功能分別講了將C/Rust
編寫成wasm
用于文檔解析)。 - 通過將代碼編譯成
Wasm
,它變得平臺無關,并且可以以接近本地的速度運行。 Rust
是一種以安全性和性能著稱的系統編程語言,由于其強大的保證和與Wasm
的無縫集成,已經在WebAssembly
生態系統中獲得了廣泛的關注。(如果想了解更多Rust
相關內容,可以參考我們的Rust學習筆記系列文章)WebAssembly
為網絡開發開辟了新的可能性,在一些復雜任務如游戲引擎、圖像處理等方面有著顯著的性能提升。
WebAssembly 的優勢
WebAssembly
的一個最具說服力的特點是其在計算密集型任務中的性能提升。例如,在對龐大數據集進行復雜的統計計算時,WebAssembly
可能比常規的 JavaScript
快得多。這是因為 WebAssembly
的高度優化設計使得代碼執行速度遠遠超過 JavaScript
。
WebAssembly
的另一個優點是其可移植性。跨平臺應用程序的開發變得非常簡單,因為可以從多種語言生成 WebAssembly
代碼,并在任何平臺上執行。
最后,安全性也是 WebAssembly
架構中的一個重要考慮因素。由于 WebAssembly
提供了沙箱執行環境,代碼無法訪問敏感數據或運行惡意代碼。
下面是了解和學習WebAssembly
的RoadMap
。
2. 項目初始化&配置
進入正題之前,我們還是和之前一樣,使用我們自己的腳手架-f_cli_f構建一個以Vite
為打包工具的前端項目。
在本地合適的目錄下執行如下代碼:
npx f_cli_f create wasm_preformance
然后,我們在pages
中新建如下的目錄結構
其中wasm
存放的是我們已經構建好的wasm
的資源。
配置Web Worker
由于我們在項目中會用到Web Worker
,所以我們還需要對其做一定的配置。之前呢,我們在React中使用多線程—Web Worker中介紹過,如何在React+Vite
的項目中使用Web Worker
。
而今天,我們再介紹另外一種更加優雅的方式 - Comlink。
Comlink
是一個由Google Chrome Labs
開發的輕量級庫,它旨在簡化Web Worker
與主線程之間的通信,讓我們能夠充分利用多線程處理的威力,提升前端應用性能。
由于,我們是用Vite
搭建的前端項目,所以我們還需要在項目中借助vite-plugin-comlink。
我們可以通過如下代碼安裝對應的依賴。
yarn add -D vite-plugin-comlink
yarn add comlink
然后,將對應的庫配置到vite.config.js
中。
import { comlink } from "vite-plugin-comlink";export default {plugins: [comlink()],worker: {plugins: () => [comlink()],},
};
這里有一點需要額外注意,comlink
要放置在plugins
第一個位置。
針對TypeScript
項目,我們還需要在vite-env.d.ts
中新增/// <reference types="vite-plugin-comlink/client" />
然后我們就可以用優雅的方式來使用WebWorker
了。
可以看到,使用了comlink
后,我們在使用多線程能力時,不需要寫那么多模板代碼,而是通過Promise
來接收從子線程返回的數據。
關于
Web Worker
的相關內容,可以看我們之前的文章
- Web性能優化之Worker線程&#x