亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

React router動態加載組件之適配器模式的應用詳解

2019-11-19 12:58:14
字體:
來源:轉載
供稿:網友

前言

本文講述怎么實現動態加載組件,并借此闡述適配器模式。

一、普通路由例子

import Center from 'page/center';import Data from 'page/data';function App(){ return (  <Router>   <Switch>   <Route exact path="/" render={() => (<Redirect to="/center" />)} />   <Route path="/data" component={Data} />   <Route path="/center" component={Center} />   <Route render={() => <h1 style={{ textAlign: 'center', marginTop: '160px', color:'rgba(255, 255, 255, 0.7)' }}>頁面不見了</h1>} />   </Switch>  </Router> );}

以上是最常見的React router。在簡單的單頁應用中,這樣寫是ok的。因為打包后的單一js文件bundle.js也不過200k左右,gzip之后,對加載性能并沒有太大的影響。

 但是,當產品經歷多次迭代后,追加的頁面導致bundle.js的體積不斷變大。這時候,優化就變得很有必要。

二、如何優化

優化使用到的一個重要理念就是――按需加載。

可以結合例子進行理解為:只加載當前頁面需要用到的組件。

比如當前訪問的是/center頁,那么只需要加載Center組件即可。不需要加載Data組件。

業界目前實現的方案有以下幾種:

•react-router的動態路由getComponent方法(router4已不支持)
•使用react-loadable小工具庫
•自定義高階組件進行按需加載

而這些方案共通的點,就是利用webpack的code splitting功能(webpack1使用require.ensure,webpack2/webpack3使用import),將代碼進行分割。

接下來,將介紹如何用自定義高階組件實現按需加載。

三、自定義高階組件

3.1 webpack的import方法

webpack將import()看做一個分割點并將其請求的module打包為一個獨立的chunk。import()以模塊名稱作為參數名并且返回一個Promise對象。

因為import()返回的是Promise對象,所以不能直接給<Router/>使用。

3.2 采用適配器模式封裝import()

適配器模式(Adapter):將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。

當前場景,需要解決的是,使用import()異步加載組件后,如何將加載的組件交給React進行更新。
 方法也很容易,就是利用state。當異步加載好組件后,調用setState方法,就可以通知到。
 那么,依照這個思路,新建個高階組件,運用適配器模式,來對import()進行封裝。

3.3 實現異步加載方法asyncComponent

import React from 'react';export const asyncComponent = loadComponent => ( class AsyncComponent extends React.Component {  constructor(...args){   super(...args);   this.state = {    Component: null,   };   this.hasLoadedComponent = this.hasLoadedComponent.bind(this);  }  componentWillMount() {   if(this.hasLoadedComponent()){    return;   }   loadComponent()    .then(module => module.default ? module.default : module)    .then(Component => {     this.setState({      Component     });    })    .catch(error => {     /*eslint-disable*/     console.error('cannot load Component in <AsyncComponent>');     /*eslint-enable*/     throw error;    })  }  hasLoadedComponent() {   return this.state.Component !== null;  }  render(){   const {    Component   } = this.state;   return (Component) ? <Component {...this.props} /> : null;  } });// 使用方式const Center = asyncComponent(()=>import(/* webpackChunkName: 'pageCenter' */'page/center'));

如例子所示,新建一個asyncComponent方法,用于接收import()返回的Promise對象。

當componentWillMount時(服務端渲染也有該生命周期方法),執行import(),并將異步加載的組件,set入state,觸發組件重新渲染。

3.4 釋疑

•state.Component初始化

this.state = { Component: null,};

這里的null,主要用于判斷異步組件是否已經加載。

•module.default ? module.default : module

這里是為了兼容具名和default兩種export寫法。

•return (Component) ? <Component {...this.props} /> : null;

這里的null,其實可以用<LoadingComponent />代替。作用是:當異步組件還沒加載好時,起到占位的作用。
this.props是通過AsyncComponent組件透傳給異步組件的。

3.5 修改webpack構建

output: { path: config.build.assetsRoot, filename: utils.assetsPath('js/[name].[chunkhash].js'), chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')}

在輸出項中,增加chunkFilename即可。

四、小結

自定義高階組件的好處,是可以按最少的改動,來優化已有的舊項目。

像上面的例子,只需要改變import組件的方式即可?;ㄗ钌俚拇鷥r,就可以得到頁面性能的提升。

 其實,react-loadable也是按這種思路去實現的,只不過增加了很多附屬的功能點而已。

以上所述是小編給大家介紹的React router動態加載組件之適配器模式的應用,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧洲中文天堂| 日韩极品精品视频免费观看| wwwwwwww亚洲| 亚洲电影免费观看高清| 欧美疯狂做受xxxx高潮| 国产精品亚洲欧美导航| 亚洲图片制服诱惑| 久久久久亚洲精品成人网小说| 精品国产91久久久久久| 精品视频一区在线视频| 亚洲国产精品热久久| 亚洲热线99精品视频| 亚洲黄色av网站| 亚洲第一黄色网| 国产精品久久久久久久久久久久久| 日韩av综合网站| 国产日韩在线视频| 亚洲精品www久久久久久广东| 亚洲国产成人精品久久久国产成人一区| 国产精品99蜜臀久久不卡二区| 韩曰欧美视频免费观看| 欧美一区三区三区高中清蜜桃| 中日韩美女免费视频网址在线观看| 在线精品播放av| 2021国产精品视频| 一个人看的www欧美| 亚洲国产99精品国自产| 亚洲伊人成综合成人网| 日韩av电影中文字幕| 美女啪啪无遮挡免费久久网站| 久久亚洲私人国产精品va| 日韩亚洲欧美中文在线| 97在线看免费观看视频在线观看| 国内外成人免费激情在线视频网站| 欧美日韩免费观看中文| 欧美在线观看视频| 中文字幕久精品免费视频| 中文字幕久热精品在线视频| 欧美成人精品在线观看| 亚洲综合中文字幕在线观看| 欧美精品一本久久男人的天堂| 亚洲色图35p| 成人xxxx视频| 欧美人与性动交a欧美精品| 在线成人激情黄色| 青草青草久热精品视频在线观看| 中日韩美女免费视频网站在线观看| 精品视频中文字幕| 欧美xxxx做受欧美| 久久久久久国产精品久久| 亚洲第一视频网站| 视频在线观看一区二区| 在线观看久久av| 欧美在线免费观看| 91sao在线观看国产| 欧美人成在线视频| 亚洲一区二区在线播放| 亚洲午夜女主播在线直播| 精品高清一区二区三区| 91丨九色丨国产在线| 亚洲精品成a人在线观看| 国产脚交av在线一区二区| 韩国精品美女www爽爽爽视频| 大量国产精品视频| 国产精品96久久久久久又黄又硬| 在线精品国产成人综合| 亚洲无亚洲人成网站77777| 91中文精品字幕在线视频| 色综合视频一区中文字幕| 日韩中文字幕在线观看| 91高清视频免费观看| 欧美电影在线观看| 91色视频在线观看| 亚洲xxxx3d| 国产激情综合五月久久| 亚洲精品乱码久久久久久金桔影视| 日韩在线观看网站| 92裸体在线视频网站| 亚洲加勒比久久88色综合| 色妞在线综合亚洲欧美| 992tv在线成人免费观看| 久久久久久com| 国产日本欧美视频| 亚洲国产精品一区二区三区| 日韩av综合网| 清纯唯美亚洲激情| 国产精品男人的天堂| xxxxx成人.com| 亚洲一区二区三区xxx视频| 亚洲精品久久久久久下一站| 911国产网站尤物在线观看| 国产精品久久久久久久久久久久久久| 欧美精品手机在线| 亚洲人成网站999久久久综合| 久久视频免费在线播放| 久久亚洲一区二区三区四区五区高| 亚洲成人黄色在线观看| 亚洲va久久久噜噜噜久久天堂| 欧美日韩在线第一页| 欧美国产日韩一区二区三区| 这里只有精品丝袜| 国产黑人绿帽在线第一区| 国产一区二区黄| 色偷偷av一区二区三区| 欧美日韩国产va另类| 亚洲国产免费av| 日日摸夜夜添一区| 欧美电影免费播放| 91美女片黄在线观| 国产午夜精品理论片a级探花| 国产精品高清免费在线观看| 欧美一区三区三区高中清蜜桃| 日韩在线观看免费高清完整版| 日韩国产精品亚洲а∨天堂免| 欧美乱大交做爰xxxⅹ性3| 日韩69视频在线观看| 亚洲精品国产精品国自产在线| 亚洲视频国产视频| 久久久久久高潮国产精品视| 韩国三级电影久久久久久| 欧美性受xxx| 久久6免费高清热精品| 国产aaa精品| 国产欧美精品在线| 最近中文字幕mv在线一区二区三区四区| 精品调教chinesegay| 亚洲人成毛片在线播放| 亚洲第一视频网站| 久久电影一区二区| 欧美性猛交xxxx免费看漫画| 欧美精品在线免费观看| 欧美裸体xxxxx| 影音先锋欧美在线资源| 精品偷拍各种wc美女嘘嘘| 另类图片亚洲另类| 国产精品视频内| 91欧美精品午夜性色福利在线| 欧美国产精品日韩| 91精品啪aⅴ在线观看国产| 亚洲综合中文字幕在线| 日韩欧美高清视频| 欧美贵妇videos办公室| 欧美一级电影免费在线观看| 久久久久久久激情视频| 国产一区二区三区在线播放免费观看| 57pao成人永久免费视频| 91国产精品视频在线| 综合网中文字幕| 国产精品久久久久久亚洲调教| 国产日韩精品在线| 午夜精品www| www.亚洲成人| 在线观看精品国产视频| 国产午夜精品一区二区三区| 九九热精品视频在线播放| 久久久免费高清电视剧观看| 欧美在线激情网| 久久精品欧美视频| 日韩电影中文字幕在线观看| 欧美日韩激情小视频| 97色在线观看免费视频| 亚洲激情 国产| 欧美精品在线免费| 欧美精品性视频|