Cloudflare在其雲端無伺服器Cloudflare Workers上支援最新的JavaScript格式BinaryAST,以大幅縮短網頁應用程式碼解析的時間。BinaryAST目前仍未為完全穩定,幾個月前的Firefox Nightly版本加入支援,而現在Cloudflare則在Worker中的JavaScript引擎支援BinaryAST。

由於現在網頁應用程式功能越來越豐富,也就需要靠更多的JavaScript程式碼堆疊,網頁觀測服務HTTPArchive顯示,平均網頁會載入350KB的JavaScript,甚至有10%的頁面使用超過1MB,更複雜的應用程式,甚至還會使用容量大上許多的JavaScript。而在裝置上載入JavaScript的速度主要受兩個因素影響,網路下載速度以及JavaScript程式碼解析與編譯的時間,但由於網路速度越來越快,後者逐漸成為影響效率的主要因素。

當JavaScript第一次載入到裝置中的時候,在執行之前,JavaScript程式碼需要經過解析,以確保程式碼語法正確,再將其編譯為位元組碼,Cloudflare表示,影響這個過程的速度,取決於裝置CPU與記憶體的效能,以1MB的JavaScript檔案來說,現代裝置可能在100毫秒就能解析完成,但在老舊裝置像是Moto G4,卻需要1秒鐘。

為此,Cloudflare、Mozilla、臉書以及彭博工程師共同合作,開發了新的線上格式BinaryAST,目的是要加快解析速度,又能同時完整的保有JavaScript原始語意,其使用了高效的二元碼表示法以及資料結構,並透過儲存和提供額外的資訊,預先給予解析器指示,達成快速解析JavaScript的目的。

過去傳統瀏覽器會將JavaScript解析為抽象語法樹(Abstract Syntax Trees,AST),作為程式碼執行步驟描述,接著再將其編譯成機器代碼或是由客戶端JIT編譯器執行,而新的BinaryAST格式允許部分檔案解析,瀏覽器得以優先解析需要啟動的程式碼,而這個動作將為解析器省下不少工作量。

現代瀏覽器常用延遲解析(Lazy Parsing)技術,以預先準備、跳過或是延遲解析程式碼內函式,以減去步驟降低解析時間,但延遲解析存在一些預先準備的成本,像是需要手動標記函式,且在錯誤標記函式的狀況,反而會增加執行成本等狀況,但在BinaryAST中,瀏覽器可以使用經過分析和驗證的JavaScript,以無成本的方式執行延遲解析。

另外,Cloudflare指出,由於ES6+有一些模糊的語法,在程式碼完全解析之前,函式都會處於模糊的狀態,而要解決這個問題,瀏覽器通常必須要進行回溯,但這樣又會造成指數等級的效能下降,或是透過中介節點類型的解法,以維持線性效能,卻會大大增加實作困難度,但在BinaryAST中則不存在這個問題,因為BinaryAST在解析完成之前就會優先揭露節點類型。

目前BinaryAST雛形由Cloudflare與Mozilla實作,先透過解析器將JavaScript程式碼轉成AST,並使用編碼器標記註釋以產生最終BinaryAST檔案。Cloudflare使用的方案由解析器與編碼器兩部分組成,JavaScript實作的解析器,負責產生初始的AST檔案,而編碼器是以Rust撰寫,負責獲取AST檔案,註釋需要的相關訊息。

所有的Cloudflare網站都支援BinaryAST,使用者可以使用工具預先進行JavaScript程式碼標碼,然後在Cloudflare使用BinaryAST Worker,當瀏覽器發出特殊請求時,BinaryAST Worker就能送出相關BinaryAST檔案給客戶端,但客戶端目前仍只能使用Firefox Nightly版本,並需要先在about:config中啟用BinaryAST支援。


Advertisement

更多 iThome相關內容