精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

基于Webpack 2的React組件懶加載

開發 開發工具
Chunks是Webpack的基本概念之一,最直觀的概念是在多入口配置中,誒個單獨的入口會生成單獨的Chunk。而在添加額外的插件配置之后,Webpack會輸出譬如獨立的CSS包體這樣獨立的塊。

Chunks是Webpack的基本概念之一,最直觀的概念是在多入口配置中,誒個單獨的入口會生成單獨的Chunk。而在添加額外的插件配置之后,Webpack會輸出譬如獨立的CSS包體這樣獨立的塊。Webpack內置有如三種類型的Chunk:

  • Entry Chunks:Entry Chunks是我們最常見的Chunks類型,包含了應用所需要的Webpack運行時與即刻加載的模塊。
  • Normal Chunks:Normal Chunks并不會包含Webpack運行時,主要指代那些應用運行時動態加載的模塊,Webpack會為我們創建類似于JSONP這樣合適的加載器來進行動態加載。
  • Initial Chunks:Initial Chunks本質上還是Normal Chunks,不過其會在應用初始化時完成加載,往往這個類型的Chunks由CommonsChunkPlugin生成。

bundle-loader

bundle-loader是Webpack官方出品的Loader之一,bundle-loader可以用來加載異步代碼塊,基本的用法如下:

  1. // 當請求某個Bundle時,Webpack會為我們自動加載 
  2. var waitForChunk = require("bundle-loader!./file.js"); 
  3.  
  4. //我們需要等待Chunk加載完成才能獲取到文件詳情 
  5. waitForChunk(function(file) { 
  6.     // use file like is was required with 
  7.     // var file = require("./file.js"); 
  8. }); 
  9. // wraps the require in a require.ensure block 

我們同樣可以自定義Chunk名:

  1. require("bundle-loader?lazy&name=my-chunk!./file.js"); 

我們可以很方便地利用bundle-loader實現React Router中模塊的懶加載,譬如如果我們的路由設置如下:

  1. import HomePage from "./pages/HomePage"
  2. import AdminPage from "./pages/admin/AdminPage"
  3. import AdminPageSettings from "./pages/admin/AdminPageSettings"
  4. export default function routes(fromServer) { 
  5.   return ( 
  6.     <Router history={browserHistory}> 
  7.       <Route path="/" component={HomePage}/> 
  8.       <Route path="/admin" component={AdminPage}/> 
  9.       <Route path="/admin/settings" component={AdminSettingsPage}/> 
  10.     <Router/> 
  11.   ) 

其中AdminPage可能非常笨重,我們希望只有當用戶真實請求到/admin這個地址時才會加載相關組件,此時我們就可以在Webpack配置中添加bundle-loader的支持:

  1. ... 
  2. module: { 
  3.   loaders: [{ 
  4.     // use `test` to split a single file 
  5.     // or `include` to split a whole folder 
  6.     test: /.*/, 
  7.     include: [path.resolve(__dirname, 'pages/admin')], 
  8.     loader: 'bundle?lazy&name=admin' 
  9.    }] 
  10.    
  11. ... 

該配置會自動幫我們從主文件中移除admin相關的組件代碼,然后將其移動到1.admin.js文件中,然后在React Router中,我們同樣需要沖定義組件加載函數:

  1. import HomePage from "./pages/HomePage"
  2. import AdminPage from "./pages/admin/AdminPage"
  3. import AdminPageSettings from "./pages/admin/AdminPageSettings"
  4. const isReactComponent = (obj) => Boolean(obj && obj.prototype && Boolean(obj.prototype.isReactComponent)); 
  5.  
  6. const component = (component) => { 
  7.   return isReactComponent(component) 
  8.     ? {component} 
  9.     : {getComponent: (loc, cb)=> component( 
  10.          comp=> cb(null, comp.default || comp))} 
  11. }; 
  12. export default function routes(fromServer) { 
  13.   return ( 
  14.     <Router history={browserHistory}> 
  15.       <Route path="/" {...component(HomePage)}/> 
  16.       <Route path="/admin" {...component(AdminPage)}/> 
  17.       <Route path="/admin/settings"       
  18.                   {...component(AdminSettingsPage)}/> 
  19.     <Router/> 
  20.   ) 

React 懶加載組件封裝

有時候我們需要將某個厚重的組件設置為異步加載,這里我們將常見的懶加載操作封裝為某個組件及其高階組件接口,源代碼參考LazilyLoad:

  1. import React from 'react'
  2.  
  3. /** 
  4.  * @function 支持異步加載的封裝組件 
  5.  */ 
  6. class LazilyLoad extends React.Component { 
  7.  
  8.   constructor() { 
  9.     super(...arguments); 
  10.     this.state = { 
  11.       isLoaded: false
  12.     }; 
  13.   } 
  14.  
  15.   componentWillMount() { 
  16.     this.load(this.props); 
  17.   } 
  18.  
  19.   componentDidMount() { 
  20.     this._isMounted = true
  21.   } 
  22.  
  23.   componentWillReceiveProps(next) { 
  24.     if (next.modules === this.props.modules) return null
  25.     this.load(next); 
  26.   } 
  27.  
  28.   componentWillUnmount() { 
  29.     this._isMounted = false
  30.   } 
  31.  
  32.   load(props) { 
  33.     this.setState({ 
  34.       isLoaded: false
  35.     }); 
  36.  
  37.     const {modules} = props; 
  38.     const keys = Object.keys(modules); 
  39.  
  40.     Promise.all(keys.map((key) => modules[key]())) 
  41.       .then((values) => (keys.reduce((agg, keyindex) => { 
  42.         agg[key] = values[index]; 
  43.         return agg; 
  44.       }, {}))) 
  45.       .then((result) => { 
  46.         if (!this._isMounted) return null
  47.         this.setState({modules: result, isLoaded: true}); 
  48.       }); 
  49.   } 
  50.  
  51.   render() { 
  52.     if (!this.state.isLoaded) return null
  53.     return React.Children.only(this.props.children(this.state.modules)); 
  54.   } 
  55.  
  56. LazilyLoad.propTypes = { 
  57.   children: React.PropTypes.func.isRequired, 
  58. }; 
  59.  
  60. export const LazilyLoadFactory = (Component, modules) => { 
  61.   return (props) => ( 
  62.     <LazilyLoad modules={modules}> 
  63.       {(mods) => <Component {...mods} {...props} />} 
  64.     </LazilyLoad> 
  65.   ); 
  66. }; 
  67.  
  68. export const importLazy = (promise) => ( 
  69.   promise.then((result) => result.default
  70. ); 
  71.  
  72. export default LazilyLoad; 

回調方式懶加載

這里我們使用類似于bundle-loader中的回調方式進行懶加載,不過將其封裝為了組件形式。其中的importLazy主要是為了兼容Babel/ES2015,其只是單純的返回默認屬性值,實例代碼參考這里。

  1. render(){ 
  2.     return ... 
  3.         <LazilyLoad modules={{ 
  4.           LoadedLate: () => importLazy(System.import('../lazy/loaded_late.js')) 
  5.         }}> 
  6.           { 
  7.             ({LoadedLate}) => { 
  8.               return <LoadedLate /> 
  9.             } 
  10.           } 
  11.         </LazilyLoad> 
  12.    ... 

高階組件方式懶加載

在入門介紹中我們講過可以利用external屬性來配置引入jQuery,而這里我們也可以使用高階組件方式進行異步加載:

  1. // @flow 
  2. import React, { Component, PropTypes } from 'react'
  3. import { LazilyLoadFactory } from '../../../common/utils/load/lazily_load'
  4.  
  5. /** 
  6.  * 組件LoadedJquery 
  7.  */ 
  8. export default class LoadedJQuery extends Component { 
  9.  
  10.   /** 
  11.    * @function 默認渲染函數 
  12.    */ 
  13.   render() { 
  14.  
  15.     return ( 
  16.       <div 
  17.         ref={(ref) => this.props.$(ref).css('background-color''red')}> 
  18.         jQuery加載完畢 
  19.       </div> 
  20.     ); 
  21.  
  22.   } 
  23.  
  24.  
  25. export default LazilyLoadFactory( 
  26.   LoadedJQuery, 
  27.   { 
  28.     $: () => System.import('jquery'), 
  29.   } 
  30. ); 

這里我們將加載完畢的jQuery作為組件的Props參數傳入到組件中使用,同樣我們也可以使用這種方式加載我們自定義的函數或者組件。上述兩種的效果如下所示:

【本文是51CTO專欄作者“張梓雄 ”的原創文章,如需轉載請通過51CTO與作者聯系】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2024-03-20 09:31:00

圖片懶加載性能優化React

2017-07-06 20:27:38

React.jsHtml5Javascript

2015-07-03 10:41:47

ReactWebpack

2015-10-08 10:58:51

圖片懶加載

2021-08-16 12:32:37

HashMap八股文面試

2021-11-07 20:43:14

React

2024-12-03 14:49:28

2022-06-07 08:18:49

懶加載Web前端

2020-12-03 10:40:23

webpack加載原理前端

2011-01-17 19:35:04

javascriptjqueryweb

2020-11-18 09:30:29

圖片懶加載前端瀏覽器

2017-02-28 21:57:05

React組件

2021-02-21 11:40:25

技術優化實踐

2022-07-10 20:45:47

React加載動畫庫

2023-03-22 23:23:25

React加載動畫庫

2019-07-20 23:30:48

開發技能代碼

2019-07-22 10:42:11

React組件前端

2011-04-22 10:13:35

SimpleFrame

2017-07-11 15:50:11

前端webpack2優化

2022-05-13 08:48:50

React組件TypeScrip
點贊
收藏

51CTO技術棧公眾號

日韩电影在线观看完整免费观看| 香蕉视频黄在线观看| 99欧美视频| 91精品国产综合久久精品图片| 亚洲精美视频| 国产成人精品a视频| 欧美91视频| 日韩精品一二三四区| 国产在线青青草| 午夜视频在线免费观看| 秋霞电影网一区二区| 久久亚洲国产精品| 国产精品久久久免费观看| 国模视频一区| 亚洲精品成人少妇| 久久99国产精品| 亚洲一区 中文字幕| 亚洲天堂黄色| 国产午夜精品全部视频在线播放| 自慰无码一区二区三区| 永久免费av在线| 国产成人午夜片在线观看高清观看| 国语自产精品视频在线看抢先版图片| aaaaa级少妇高潮大片免费看| 日韩三区四区| 午夜精品爽啪视频| 四虎永久国产精品| 丰满人妻一区二区三区免费视频 | 精品99999| av免费在线播放网站| av在线播放观看| 2021国产精品久久精品| 国产精品旅馆在线| 黄网站免费在线| 日韩免费高清| 亚洲精品中文字幕有码专区| 成人不卡免费视频| 亚洲美女久久精品| 亚洲电影在线免费观看| 自拍偷拍亚洲色图欧美| 免费在线一级视频| 国产成人精品亚洲午夜麻豆| 国产福利精品视频| 日本在线视频中文字幕| 91精品电影| 国产亚洲欧美日韩精品| 性欧美丰满熟妇xxxx性久久久| 日日夜夜天天综合| 亚洲一区二区三区免费视频| 影音先锋在线亚洲| 外国精品视频在线观看 | 欧美久久综合| 日韩中文视频免费在线观看| 午夜理伦三级做爰电影| 国产精品zjzjzj在线观看| 6080日韩午夜伦伦午夜伦| www.色就是色| 欧美一区国产| 色综合天天视频在线观看| 欧美又粗又长又爽做受| 婷婷在线播放| 亚洲免费在线看| 三年中文高清在线观看第6集| 天堂а√在线8种子蜜桃视频| 国产iv一区二区三区| 国产精品爽爽爽爽爽爽在线观看| 狠狠人妻久久久久久| 99视频在线精品国自产拍免费观看| 欧美乱大交xxxxx| 日本少妇xxxxx| 国产亚洲一卡2卡3卡4卡新区| 精品网站999www| 最新版天堂资源在线| 日韩欧洲国产| 精品久久久久久无| 精品人妻一区二区三区日产| 99re8精品视频在线观看| 制服丝袜av成人在线看| 午夜国产福利在线观看| 国产精品成人**免费视频| 7777精品伊人久久久大香线蕉经典版下载| 香蕉视频网站入口| 亚洲精品毛片| 正在播放亚洲一区| 欧美丝袜在线观看| 91精品丝袜国产高跟在线| 精品乱码亚洲一区二区不卡| 欧美日韩人妻精品一区在线| 国产精品欧美在线观看| 久久亚洲影音av资源网| av大片免费观看| 麻豆91在线看| 国产一区二区三区四区五区加勒比| 国产在线视频资源| 尤物视频一区二区| 116极品美女午夜一级| 羞羞视频在线观看一区二区| 精品国产髙清在线看国产毛片| www.久久国产| 亚洲综合激情在线| 国产成人精品免费久久久久| 国产av一区二区三区精品| 久久午夜电影网| 影音先锋男人的网站| 一区二区三区电影大全| 日韩视频免费观看高清完整版| wwwwxxxx国产| 亚洲一区二区日韩| 国产精品久久久久久久美男| 欧美自拍偷拍第一页| 亚洲国产高清aⅴ视频| aa视频在线播放| 小说区图片区亚洲| 夜夜嗨av一区二区三区免费区| 九九免费精品视频| 看片的网站亚洲| 欧美精品中文字幕一区二区| 精灵使的剑舞无删减版在线观看| 欧美性色黄大片手机版| 日韩片在线观看| 欧美三级不卡| 成人网在线观看| www亚洲人| 色综合久久综合| 欧美日韩人妻精品一区在线| 欧美激情五月| 国产专区欧美专区| 二区三区在线| 色婷婷激情一区二区三区| 国产精品麻豆入口| 免费在线毛片| 亚洲精品视频自拍| 日本黄色的视频| 黄色不卡一区| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲国产精品欧美久久| 亚洲欧洲综合另类| 午夜精品免费看| 欧美xxav| 91精品中国老女人| 麻豆视频在线观看免费| 欧美三区在线观看| 日本黄色小视频在线观看| 久久精品首页| 欧美18视频| 在线手机中文字幕| 亚洲精品资源在线| 黄色在线免费观看| 91欧美一区二区| 国产美女网站在线观看| 99久久免费精品国产72精品九九| 欧美另类极品videosbestfree| 99在线精品视频免费观看20| 亚洲特级片在线| 手机精品视频在线| 午夜久久tv| 99超碰麻豆| 91黄页在线观看| 亚洲精品福利在线| 波多野结衣av无码| 国产精品沙发午睡系列990531| 99视频在线视频| 日韩精品一区二区三区免费观看| 国产日韩专区在线| 黄网址在线观看| 日韩免费性生活视频播放| 国产奶水涨喷在线播放| 91蜜桃网址入口| 美女网站免费观看视频| 久久麻豆精品| 91青青草免费在线看| 高清电影在线观看免费| 精品一区二区三区电影| 欧美成人精品网站| 亚洲毛片av在线| 看全色黄大色黄女片18| 丝袜诱惑亚洲看片| 日韩最新中文字幕| 久久久久97| 国产精品福利小视频| 国产传媒在线播放| 日韩黄色高清视频| 在线观看国产一区二区三区| 一区二区在线观看不卡| 在线观看福利片| 理论电影国产精品| 丝袜人妻一区二区三区| 超碰成人久久| 不卡视频一区二区| 桃子视频成人app| 欧美精品免费看| 欧洲一区av| 欧美一区二区观看视频| 国产一级免费视频| 亚洲激情图片qvod| www.av天天| 成人污污视频在线观看| 久草福利视频在线| 亚洲精品裸体| 伊人av成人| 蜜臀av一区| 成人在线国产精品| 超碰资源在线| 久热在线中文字幕色999舞| www.亚洲天堂.com| 欧洲精品一区二区| 国产污污视频在线观看| 亚洲欧洲性图库| www.狠狠爱| 成人性生交大合| 亚洲视频一二三四| 免费在线亚洲| 日韩一级性生活片| 亚洲色图网站| 神马影院我不卡午夜| 蜜桃久久久久| 97在线电影| 2020国产精品小视频| 国产成人精品久久| 成人性生交大片免费网站| 久久久久久久91| a毛片在线播放| 色婷婷**av毛片一区| 韩国福利在线| 精品视频在线播放| 少妇av在线播放| 精品少妇一区二区| 成人国产电影网| 亚洲黄色一区二区三区| 麻豆一区二区麻豆免费观看| 亚洲xxxx在线| 伊人久久大香| 国产在线精品一区免费香蕉| 欧美成人ⅴideosxxxxx| 欧美一区深夜视频| 国产自产自拍视频在线观看| 久久久久久久久久久免费精品| 亚洲小说区图片| 九九视频这里只有精品| 黄色动漫在线| 另类专区欧美制服同性| 超碰在线最新| 欧美成人激情视频免费观看| 黄网站在线免费| 久久激情五月丁香伊人| 欧美尤物美女在线| 久久精品国产96久久久香蕉| 精品欧美色视频网站在线观看| 在线观看国产精品91| 最新97超碰在线| 日韩中文字幕欧美| 国产网站在线免费观看| 欧美成人精品xxx| 日韩专区av| 久久久亚洲精品视频| 岛国av在线网站| 538国产精品视频一区二区| 亚洲欧美小说色综合小说一区| 欧美在线免费看| 韩国精品主播一区二区在线观看| 国产精品福利在线| 欧洲午夜精品| 亚洲综合中文字幕68页| 精品无人区一区二区| 女女同性女同一区二区三区91| 国产99久久精品一区二区300| 日本一区高清不卡| 99精品美女| 欧美另类videosbestsex日本| 亚洲激情影院| 激情婷婷综合网| 国产一区二区三区高清播放| 国产亚洲精品成人a| 91麻豆国产福利精品| 懂色av粉嫩av浪潮av| 亚洲精选视频免费看| 国产无遮无挡120秒| 色8久久人人97超碰香蕉987| 91资源在线视频| 精品国产3级a| 成人激情电影在线看| 欧美成人精品影院| 一本大道色婷婷在线| 国产三级精品网站| 欧美一区二区三区红桃小说| 日本一区二区三区免费看| 女人色偷偷aa久久天堂| 美女福利视频在线| 狠狠网亚洲精品| 好吊色视频一区二区三区| 中文在线免费一区三区高中清不卡| 久久久久亚洲av片无码| 精品日韩美女的视频高清| 国产又粗又猛又色又| 日韩成人性视频| а√天堂在线官网| 琪琪第一精品导航| 美国十次综合久久| 日韩精品久久久| 国内揄拍国内精品久久| 天堂av在线网站| 91性感美女视频| 成人免费黄色小视频| 色嗨嗨av一区二区三区| 亚洲精品一区二区三区四区| 国产一区二区三区毛片| 国产乱码在线| 国产精品亚洲网站| 日韩精品免费一区二区三区竹菊 | 视频小说一区二区| 日韩精品第1页| 美女爽到高潮91| 好吊日免费视频| 一区二区三区小说| 在线观看中文字幕av| 亚洲精品一区av在线播放| 欧美韩日亚洲| 91久久精品久久国产性色也91| 国产精品美女久久久久久不卡| 国产av天堂无码一区二区三区| 国产精品自拍网站| 国产精品suv一区二区88| 色哟哟一区二区在线观看| 免费的黄色av| 久久91精品国产91久久久| 日韩av黄色| 亚洲三区四区| 日韩福利电影在线观看| 人妻熟女aⅴ一区二区三区汇编| 一区二区三区鲁丝不卡| 国产精品嫩草影院桃色| 中文字幕最新精品| www.一区| 亚洲一区二区精品在线| 三级影片在线观看欧美日韩一区二区 | 欧美日韩大片| 久久天天狠狠| 亚洲在线成人| 黄色在线观看av| 精品久久中文字幕| 无套内谢的新婚少妇国语播放| 久久久噜噜噜久久| 福利片在线一区二区| 国产肉体ⅹxxx137大胆| 丁香一区二区三区| 国产在线视频99| 亚洲福利视频专区| 日本不卡1234视频| 蜜桃成人在线| 玖玖在线精品| 欧美福利在线视频| 欧美日本在线观看| 成人免费视屏| 国产传媒欧美日韩| 国产午夜精品一区二区三区欧美 | 免费成人蒂法| avav在线看| 欧美高清一级片在线观看| 一二区在线观看| 久久6免费高清热精品| 91麻豆精品国产91久久久久推荐资源| 拔插拔插海外华人免费| 久久亚洲综合色一区二区三区| 无码人妻丰满熟妇精品区| 正在播放欧美视频| 国产电影一区| 男女激情免费视频| 91免费小视频| 亚洲在线精品视频| 欧美日本高清视频| 日韩欧美ww| 五月天激情播播| 亚洲一区精品在线| 精品欧美不卡一区二区在线观看 | 美女av一区二区三区| 国产极品模特精品一二| 中文字幕无码不卡免费视频| 中文字幕亚洲在| 成人午夜免费在线观看| 国产v综合ⅴ日韩v欧美大片| 久久婷婷蜜乳一本欲蜜臀| 岛国av免费观看| 91高清视频免费看| www免费视频观看在线| 精品视频一区二区| 久久国产福利国产秒拍| 国产午夜福利片| 一区二区三区精品99久久| 欧美成人一级| 日韩一级免费在线观看| 亚洲一区二区三区影院| 国产51人人成人人人人爽色哟哟| 亚洲一区二区三区在线免费观看 | 第一区免费在线观看| 午夜视频一区二区| 米奇777四色精品人人爽| 精品久久久久久一区| 国内久久精品视频| 亚洲天堂一区在线| 九色精品美女在线|