按需加載

隨著 web 網(wǎng)頁(yè)的流行扯键,越來(lái)越多的人選擇使用網(wǎng)頁(yè)來(lái)代替?zhèn)鹘y(tǒng)的 APP撩满,隨之而來(lái)的就是網(wǎng)頁(yè)越來(lái)越龐大葵第,前端性能的問(wèn)題尤其顯現(xiàn)圣拄。一些大的項(xiàng)目都會(huì)做一些性能優(yōu)化來(lái)提高訪問(wèn)速度嘴秸,以提升用戶(hù)的體驗(yàn),比如:按需加載,資源優(yōu)化等岳掐。

按需加載可以提高頁(yè)面加載速度凭疮,如果當(dāng)前頁(yè)面只使用了某個(gè)功能,我們可以選擇只加載這個(gè)功能串述,避免過(guò)于龐大的包加載進(jìn)頁(yè)面而需要等等過(guò)長(zhǎng)的時(shí)間执解。

接下來(lái)我們先討論一個(gè)問(wèn)題:什么時(shí)候需要按需加載呢?

如果打包的產(chǎn)物是一個(gè)文件纲酗,這個(gè)文件又很大衰腌,一次性下載下來(lái)的速度就會(huì)比較慢,可能會(huì)造成剛進(jìn)入頁(yè)面時(shí)長(zhǎng)時(shí)間的白屏的情況觅赊,這種體驗(yàn)非常不好右蕊;如果打包成多個(gè)文件,但是瀏覽器在同一時(shí)間內(nèi)可以發(fā)出的請(qǐng)求數(shù)有限制吮螺,這也會(huì)導(dǎo)致用戶(hù)等待饶囚。按需加載就可以很好的去解決這些問(wèn)題。

那么我們?nèi)绾伟葱杓虞d呢鸠补?

簡(jiǎn)單有效的方式是使用 babel-plugin-import萝风。

什么是 babel-plugin-import?

babel-plugin-import 是阿里開(kāi)源的一款 babel 插件,它會(huì)在編譯過(guò)程中將 import 的寫(xiě)法自動(dòng)轉(zhuǎn)換為按需引入的方式紫岩,主要用于組件的按需引入规惰。

如何在項(xiàng)目中添加 babel-plugin-import?

使用方法

安裝

npm install babel-plugin-import --save-dev

配置

通過(guò) .babelrc 配置文件或者 babel-loader 引入。

{
  "plugins": [["import", options]]
}

其中 options 為具體的配置項(xiàng)

如果使用 babel7泉蝌,可以做如下的配置:

{
  "plugins": [["import", options, "antd"]]
}

接下來(lái)一起看看具體的配置項(xiàng) options

{
  "libraryName": "antd",
  "style": true,   // or 'css' or 'function'
  "libraryDirectory": "components",  // default: lib
  "camel2DashComponentName": false,  // default: true
  "styleLibraryDirectory": "lib",
  "customName": (name: string, file: object) => {
        const filename = file.opts.filename;
        if (name === 'TimePicker'){
          return 'antd/lib/custom-time-picker';
        }
        if (filename.indexOf('/path/to/my/different.js') >= 0) {
          return 'antd/lib/custom-name';
        }
        return `antd/lib/${name}`;
      }
}
  • libraryName 代表庫(kù)的名稱(chēng)

  • style 引入樣式卿拴,可以指定 css、true 或者 function

  • libraryDirectory 組件所在目錄梨与,默認(rèn):lib

  • camel2DashComponentName 將引入的組件名轉(zhuǎn)化為"-"連接的文件名

  • styleLibraryDirectory 樣式文件路徑

  • customName 自定義導(dǎo)入文件路徑堕花,也可以是一個(gè)文件,例如:require('path').resolve(__dirname, './customName.js')

customName.js 文件如下:

module.exports = function customName(name) {
  return `antd/lib/${name}`;
};

使用示例

上來(lái)講述了使用方法粥鞋,我們一起來(lái)看看配置后的結(jié)果吧缘挽!

{ "libraryName": "antd" }
import { Button } from 'antd';
import { TimePicker } from "antd"

ReactDOM.render(<Button>xxxx</Button>);

// 最后輸出結(jié)果
var _button = require('antd/lib/button');
var TimePicker = require('antd/lib/time-picker');

ReactDOM.render(<_button>xxxx</_button>);

上面只配置了libraryNameantd,按照默認(rèn)路徑 lib 引入組件呻粹。

{ "libraryName": "antd", style: "css" }
import { Button } from 'antd';
ReactDOM.render(<Button>xxxx</Button>);

// 最后輸出結(jié)果
var _button = require('antd/lib/button');
require('antd/lib/button/style/css');
ReactDOM.render(<_button>xxxx</_button>);

配置 style: "css"壕曼,直接引入經(jīng)過(guò)打包后的 antd 樣式文件

{ "libraryName": "antd", style: true }
import { Button } from 'antd';
ReactDOM.render(<Button>xxxx</Button>);

// 最后輸出結(jié)果
var _button = require('antd/lib/button');
require('antd/lib/button/style');
ReactDOM.render(<_button>xxxx</_button>);

配置 style: true,在項(xiàng)目編譯階段等浊,可以對(duì)引入的 antd 樣式文件進(jìn)行編譯腮郊,從而可以壓縮打包尺寸

{
    "libraryName": "antd",
    "style": (name: string, file: Object) => {
       if(name === 'antd/lib/utils'){
         return false;
       }
     return `${name}/style/2x`;
   }
}

配置 style: (name) => ${name}/style/2x,引入 css 文件路徑是 ComponentName/style/2x筹燕。

{
  "libraryName": "element-ui",
  "styleLibraryDirectory": "lib/theme-chalk",
}
import { Button } from 'element-ui';

// 最后輸出結(jié)果
var _button = require('element-ui/lib/button');
require('element-ui/lib/theme-chalk/button');

配置 "styleLibraryDirectory": "lib/theme-chalk"轧飞,指定樣式在 lib/theme-chalk 目錄下衅鹿。

{
  "libraryName": "element-ui",
  "camel2DashComponentName": false,
}
import { TimePicker } from "antd"

// 最后輸出結(jié)果
var _button = require('antd/lib/TimePicker');

配置 camel2DashComponentName: false,不會(huì)將組件名轉(zhuǎn)化為"-"連接的文件名

{
    "libraryName": "antd",
    "customName": (name: string, file: object) => {
      const filename = file.opts.filename;
      if (name === 'TimePicker'){
        return 'antd/lib/custom-time-picker';
      }
      if (filename.indexOf('/path/to/my/different.js') >= 0) {
        return 'antd/lib/custom-name';
      }
      return `antd/lib/${name}`;
    }
}
import { TimePicker } from "antd"

// 最后輸出結(jié)果
var _button = require('antd/lib/custom-time-picker');

配置 customName过咬,可以根據(jù)指定路徑引入組件大渤。

現(xiàn)在我們可以方便地使用按需加載了,不止是開(kāi)源的組件庫(kù)掸绞,或者是我們自研的組件庫(kù)都可以使用這種方法泵三。但是也需要我們的組件庫(kù)支持,也就是說(shuō)我們的組件庫(kù)要符合一定的目錄結(jié)構(gòu)衔掸,export 導(dǎo)出也要符合規(guī)范才可以烫幕。

總結(jié)

有了 babel-plugin-import 后我們可以愉快地進(jìn)行開(kāi)發(fā)了,只需要在項(xiàng)目中配置一次就不需要關(guān)心了敞映。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末较曼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子驱显,更是在濱河造成了極大的恐慌,老刑警劉巖瞳抓,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件埃疫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡孩哑,警方通過(guò)查閱死者的電腦和手機(jī)栓霜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)横蜒,“玉大人胳蛮,你說(shuō)我怎么就攤上這事〈陨危” “怎么了仅炊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)澎蛛。 經(jīng)常有香客問(wèn)我抚垄,道長(zhǎng),這世上最難降的妖魔是什么谋逻? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任呆馁,我火速辦了婚禮,結(jié)果婚禮上毁兆,老公的妹妹穿的比我還像新娘浙滤。我一直安慰自己,他們只是感情好气堕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布纺腊。 她就那樣靜靜地躺著畔咧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪摹菠。 梳的紋絲不亂的頭發(fā)上盒卸,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音次氨,去河邊找鬼蔽介。 笑死,一個(gè)胖子當(dāng)著我的面吹牛煮寡,可吹牛的內(nèi)容都是我干的虹蓄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼幸撕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼薇组!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起坐儿,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤律胀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后貌矿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體炭菌,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年逛漫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了黑低。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡酌毡,死狀恐怖克握,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情菩暗,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布旭蠕,位于F島的核電站勋眯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏下梢。R本人自食惡果不足惜客蹋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望孽江。 院中可真熱鬧讶坯,春花似錦、人聲如沸岗屏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至婉烟,卻和暖如春娩井,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背似袁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工洞辣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昙衅。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓扬霜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親而涉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子著瓶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容