PrepackJavaScript 代碼優(yōu)化工具
官方宣稱Prepack是一個優(yōu)化JavaScript源代碼的工具,實際上它是一個JavaScript的部分求值器(Partial Evaluator),可在編譯時執(zhí)行原本在運行時的計算過程,并通過重寫JavaScript代碼來提高其執(zhí)行效率。Prepack用簡單的賦值序列來等效替換JavaScript代碼包中的全局代碼,從而消除了中間計算過程以及對象分配的操作。對于重初始化的代碼,Prepack可以有效緩存JavaScript解析的結(jié)果,優(yōu)化效果最佳。
官方提供的Prepack優(yōu)化示例:
/* Hello World */// Input(function () {
function hello() { return 'hello'; }
function world() { return 'world'; }
global.s = hello() + ' ' + world();
})();// Output(function () {
s = "hello world";
})();
Prepack團隊對未來的規(guī)劃如下:
穩(wěn)定現(xiàn)有功能集,用于預(yù)優(yōu)化(Prepack)React Native代碼包
集成React Native工具鏈
根據(jù)React Native所用模塊系統(tǒng)的假設(shè)來構(gòu)建優(yōu)化
進一步優(yōu)化序列化(Serialization),包括:消除不暴露特性(identity)的對象;消除未使用的導(dǎo)出屬性,等等
預(yù)優(yōu)化每個函數(shù)、基本代碼塊、語句、表達式
與ES6保持完全一致
支持廣泛的模塊系統(tǒng)
假設(shè)ES6支持某些功能,延遲完成或直接忽略Polyfill應(yīng)用
進一步實現(xiàn)Web和Node.js環(huán)境中的兼容性目標
深入集成JavaScript虛擬機,改進堆反序列化過程,包括 :暴露“對象懶初始化”的概念 - 以一種JavaScript無感知的方式,在首次使用對象時對其進行初始化;通過專門的字節(jié)碼提高普通對象創(chuàng)建的編碼效率;將代碼分為兩個階段:1) 非環(huán)境依賴階段,虛擬機可以安全地捕獲并恢復(fù)生成的堆;2)環(huán)境依賴階段,通過從環(huán)境中獲得的值執(zhí)行所有剩余的計算過程來拼湊具體的堆,等等
總結(jié)循環(huán)和遞歸
JavaScript Playground - 通過調(diào)整JavaScript引擎體驗JavaScript特性,這些引擎由JavaScript所編寫,托管在瀏覽器中;你可以把它想象成一個“Babel虛擬機”,實現(xiàn)了不能被編譯的JavaScript新特性
捉Bug - 發(fā)現(xiàn)異常崩潰、執(zhí)行問題……
效果分析,例如檢測模塊工廠函數(shù)可能的副作用或強制純凈注釋
類型分析
信息流分析
調(diào)用圖推理,允許內(nèi)聯(lián)和代碼索引
自動測試生成,利用符號執(zhí)行的特性與約束求解器(Constraint Solver)結(jié)合來計算執(zhí)行不同執(zhí)行路徑的輸入
智能模糊(Smart Fuzzing)
JavaScript沙盒 - 以不可觀察的方式有效地測試JavaScript代碼
目前Prepack仍處于早期開發(fā)階段,尚未準備好在生產(chǎn)環(huán)境中使用,官方建議僅嘗試使用,并歡迎提供反饋以幫助修復(fù)錯誤。
