国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

react 實(shí)現(xiàn)頁面代碼分割、按需加載的方法

2019-11-19 14:04:12
字體:
供稿:網(wǎng)友

雖然一直有做 react 相關(guān)的優(yōu)化,按需加載、dll 分離、服務(wù)端渲染,但是從來沒有從路由代碼分割這一塊入手過,昨天在本地開發(fā)時(shí)沒有測試成功,今天又搞了下,已經(jīng)部署到線上環(huán)境了,今天就這個(gè)記錄一下。

修改配置

開發(fā)環(huán)境:webpack@v3 、react-router@v4

安裝依賴:

$ yarn add babel-plugin-syntax-dynamic-import -dev

修改 .babelrc 文件:在 plugins 中添加 "syntax-dynamic-import"

改造項(xiàng)目代碼

安裝依賴:

$ yarn add react-loadable

根據(jù) react-loadable 文檔提示,我們需要提供一個(gè)載入新頁面時(shí)的 Loading 組件,同時(shí)對加載和超時(shí)狀態(tài)進(jìn)行區(qū)別提示:

import React from 'react';import { Icon } from 'antd';const Loading = ({ pastDelay, timedOut, error }) => { if (pastDelay) { return <div><Icon type="loading" /></div>; } else if (timedOut) { return <div>Taking a long time...</div>; } else if (error) { return <div>Error!</div>; } return null;};

更改頁面組件導(dǎo)入方法:

import React from 'react';import Loadable from 'react-loadable';import { Route, Switch } from 'react-router-dom';const Home = Loadable({ loader: () => import('../Home'), loading: Loading, timeout: 10000});const EditArticle = Loadable({ loader: () => import('../EditArticle'), loading: Loading, timeout: 10000});...<Switch> <Route exact path="/home" component={Home} /> <Route path="/editarticle" component={EditArticle} /></Switch>

然后打包結(jié)果就會(huì)分離出各頁面代碼:

在頁面中我們只需要載入入口文件 app.js ,其他腳本在訪問到對應(yīng)頁面時(shí)都會(huì)經(jīng)由這個(gè)文件載入。

驗(yàn)證結(jié)果

在將靜態(tài)資源上傳到 cdn 之后,在頁面中加載 app.css 和 app.js ,運(yùn)行之后訪問各個(gè)頁面就會(huì)依次加載對應(yīng)腳本,結(jié)果如圖:

可以看到,在訪問第一個(gè)頁面時(shí)加載的頁面腳本經(jīng) gzip 壓縮后僅有 21.8KB ?。?!當(dāng)然這與頁面復(fù)雜度也有關(guān),但是相較于加載全部腳本,已經(jīng)是大幅減少了,這種優(yōu)化對訪問目標(biāo)性很強(qiáng)的用戶感受起來尤為明顯。

這么做的另一個(gè)好處就是當(dāng)我們只更改項(xiàng)目中某些頁面的業(yè)務(wù)代碼時(shí),其他頁面的代碼依然是不變的,所以這個(gè)時(shí)候其他頁面用的是客戶端緩存,從另一個(gè)層面又做了一次優(yōu)化。

Tips

react-loadable 還有其他配置選項(xiàng),可以按需配置;

這里還需要注意的一點(diǎn)是:webpack 中的 output.publicPath 選項(xiàng),這個(gè)配置會(huì)影響 app.js 從何處加載頁面腳本,正確的寫法應(yīng)該是腳本文件載入的前綴地址,例如: 0.js 的遠(yuǎn)程鏈接為 http://static.domain.com/release/0.js ,那么這個(gè)應(yīng)該配置為http://static.domain.com/release/。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 兴安盟| 宁都县| 阿图什市| 阿坝| 洞口县| 南木林县| 天津市| 汶川县| 榆社县| 凭祥市| 卓资县| 白山市| 湘阴县| 噶尔县| 天柱县| 青河县| 玛纳斯县| 泽库县| 惠水县| 洪洞县| 印江| 遂昌县| 宁河县| 筠连县| 沁阳市| 台中市| 原阳县| 侯马市| 微山县| 剑阁县| 马边| 柯坪县| 交城县| 留坝县| 宁晋县| 仲巴县| 瑞金市| 梅河口市| 柘城县| 临泽县| 平舆县|