網(wǎng)站制作NEWS
tree-shaking
樹搖動(dòng)(tree-shaking)最早由 Rich Harris 在 rollup 中提出,是為了減少最終構(gòu)建體積而誕生的。樹搖動(dòng)術(shù)語的發(fā)明者 Rich Harris 使用做蛋糕的例子來解釋樹搖動(dòng)與死代碼消除(dead code elimination,簡稱 DCE)之間的區(qū)別。
樹搖動(dòng)的目標(biāo)是通過分析靜態(tài)的 ES 模塊,剔除未使用的代碼。而死代碼消除則是在成品完成后,嘗試移除不想要的代碼塊。兩者的主要區(qū)別在于過程的不同,樹搖動(dòng)在制作蛋糕前就排除了不需要的蛋殼,而死代碼消除則是在蛋糕制作完成后剔除蛋殼。
樹搖動(dòng)依賴于 ES2015 中的 import 和 export 語句,檢測代碼模塊是否被導(dǎo)入、導(dǎo)出且被 JavaScript 文件使用。現(xiàn)代 JavaScript 應(yīng)用程序使用模塊打包工具如 webpack 或 Rollup 將多個(gè) JavaScript 文件打包為單個(gè)文件時(shí),自動(dòng)刪除未引用的代碼,這對于準(zhǔn)備發(fā)布代碼的工作非常重要,可以減小最終文件的大小和結(jié)構(gòu)復(fù)雜性。
死代碼通常具有以下特征:在 webpack 中,在 mode: development 模式下對特定代碼進(jìn)行打包時(shí),可以發(fā)現(xiàn)仍存在無法執(zhí)行到的代碼塊。然而,webpack 不支持死代碼消除,這一功能需要通過如 uglify 的插件實(shí)現(xiàn)。在 mode: production 模式下進(jìn)行打包時(shí),可以發(fā)現(xiàn)死代碼已經(jīng)被刪除,并且代碼被壓縮,注釋也被刪除。
在使用 webpack 的簡單配置進(jìn)行打包時(shí),前六種情況都能成功消除死代碼,但第七種情況未能實(shí)現(xiàn)。這可能是因?yàn)?JavaScript 作為動(dòng)態(tài)語言的特性使得靜態(tài)分析較為困難,當(dāng)前解析器僅能通過靜態(tài)分析進(jìn)行,無法完全分析全量導(dǎo)入和動(dòng)態(tài)使用的語法。
側(cè)效標(biāo)記(sideEffects)提供了一種方式來手動(dòng)標(biāo)記代碼是否具有副作用,可以設(shè)置為 false 或數(shù)組。在 package.js 或 module.rules 中進(jìn)行設(shè)置后,重新打包時(shí),只有 main.js 模塊的代碼被保留,而 app.js 的代碼被消除。
webpack 中還提供了一種標(biāo)記消除的方式,通過配置項(xiàng) usedExports。optimization.usedExports 收集的信息可以用于優(yōu)化代碼生成,如去除未使用的導(dǎo)出內(nèi)容。在 mode: production 下默認(rèn)開啟,terser 等 DCE 工具會(huì)基于 usedExports 的信息移除無效代碼。
樹搖動(dòng)本身也采用了靜態(tài)分析方法,程序靜態(tài)分析(Static Code Analysis)是在不運(yùn)行代碼的情況下,通過詞法分析、語法分析、控制流分析、數(shù)據(jù)流分析等技術(shù)對程序代碼進(jìn)行掃描,驗(yàn)證代碼是否滿足規(guī)范性、安全性、可靠性、可維護(hù)性等指標(biāo)的一種代碼分析技術(shù)。樹搖動(dòng)依賴 ES6 的語法:import 和 export,因?yàn)樾枰谶@些語法進(jìn)行靜態(tài)結(jié)構(gòu)分析。
在遠(yuǎn)古版本的 rollup 中,實(shí)現(xiàn)樹搖動(dòng)的過程包括創(chuàng)建 bundle、讀取文件內(nèi)容、使用 acorn 編譯器進(jìn)行 ast 轉(zhuǎn)化、查找 import 和 export 關(guān)鍵字、收集導(dǎo)入和導(dǎo)出信息、關(guān)聯(lián)函數(shù)、變量、類和塊級(jí)作用域、使用 magicString 添加內(nèi)容修改功能、初始化 Scope、遍歷 ast 查找變量函數(shù)、收集依賴和修改信息、最終將相關(guān)信息重組到 bundle 中。
樹搖動(dòng)的實(shí)現(xiàn)還需要繼續(xù)探索,例如研究如何更有效地處理動(dòng)態(tài)導(dǎo)入和副作用標(biāo)記的優(yōu)化。
參考資料:
多重隨機(jī)標(biāo)簽
電腦怎么用文檔編程 中關(guān)村科技園區(qū)豐臺(tái)園的基礎(chǔ)配套設(shè)施 衢州怎么讀拼音是什么 都說引流軟件是騙局為什么還有那么多人在用引流軟件呢 廣州永和晉陽電子怎樣 木朵服飾有限公司株洲項(xiàng)目是那個(gè)建筑工司成建 服裝發(fā)布會(huì)發(fā)言稿模板 寶寶折紙國慶系列之五星紅旗怎么做 商務(wù)禮儀在電商專業(yè)中與其他課程呈現(xiàn)怎樣的關(guān)系 動(dòng)天國際文化傳媒有限公司活動(dòng)案例 有什么第三方工具可以查網(wǎng)站哪些關(guān)鍵詞有排名 手機(jī)上如何算百分比 求個(gè)英語練習(xí)網(wǎng)站要免費(fèi)的thank you 為什么長春有錢人多 ??婆鷮W(xué)數(shù)字媒體技術(shù)專業(yè)和大數(shù)據(jù)與會(huì)計(jì)專業(yè)哪個(gè)好 礦泉水瓶廢物利用 江門地區(qū)有什么大型網(wǎng)站 優(yōu)化網(wǎng)絡(luò)的2個(gè)技術(shù)wan聚合和sdn的技術(shù)分析 阿克蘇廣播電視大學(xué)報(bào)名時(shí)間是什么時(shí)候 大學(xué)生實(shí)習(xí)簡歷要求 報(bào)考消防中級(jí)職稱重慶市開州區(qū)哪里可以報(bào)名 快克軟件試用版是什么 中安天津企業(yè)管理服務(wù)怎么樣 揚(yáng)州交通標(biāo)志牌廠家哪家好 網(wǎng)易云是什么語言開發(fā)的 龍華有哪些樓盤在建 各是什么 賀蘭縣的縣城榮譽(yù) 萬圣節(jié)的手工制作方法 匯豐軟件是外包嗎