本文提供了按需加載了幾種思路,并給出了相應實踐皇型。
為了探究按需加載的本質媚狰,選擇了對先前造的輪子 diana 進行實驗。
實驗一:全量引用
import * as _ from 'diana'
打包體積結果如下:
測試的是 diana 0.4.1
實驗二:部分引用
import { equal } from 'diana'
打包體積結果如下:
經(jīng)過測試躯嫉,發(fā)現(xiàn)兩種方式打包后的體積都為 21 k,第二種方式仍然將整個包
引入項目中了卓起『途矗可是 lodash 就是這么玩的呀凹炸,這和說好的不一樣呀戏阅,難道是忽視了什么細節(jié)么。
下文就來揭開面紗啤它,并動手改造項目奕筐,最終目標是用第二種寫法實現(xiàn)按需加載,減小打包體積变骡。
按需加載的方案
按需加載的效果是最終打包的代碼里沒有未引入的模塊离赫,從而優(yōu)化項目體積。下面給出 3 種可以按需加載的方案塌碌。
給每個函數(shù)單獨發(fā)布 npm 模塊
按需加載的方案一是將每個函數(shù)都單獨發(fā)布一個包渊胸,可以在 npm 上查閱 lodash,這種引用方式如下:
import { isEqual } from 'lodash.isequal'
每一個函數(shù)都作為一個單一的模塊導出
按需加載的方案二是將每一個函數(shù)都作為一個單一的模塊導出台妆,參照這種思路將 diana 的每個函數(shù)暴露在 lib 目錄下翎猛,部分截圖如下:
這時候再來測試下打包體積:
import equal from 'diana/lib/equal'
打包體積結果如下:
可以看到打包體積減小約為原來的 1/7 了,但是這種方案在寫法上過于冗長接剩,那要不借助下 babel 切厘?
方案二 + babel
方案三是在方案二的基礎上借助 babel 插件后,寫法可以如下:
import { equal } from 'diana'
在 .babelrc
里進行如下配置:
// .babelrc
{
"plugins": [
["on-demand-loading", {"library": "diana"}]
]
}
此時打包體積如下:
實際上懊缺,babel 插件 的作用是將 import { equal } from 'diana'
編譯成 import equal from 'diana/lib/equal'
疫稿。
關于 babel 插件執(zhí)行機制,可以在babel執(zhí)行機制中探討鹃两,這里先不展開了遗座。