精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲一级免费观看| 91精品网站| 一色道久久88加勒比一| 麻豆久久久久| 亚洲线精品一区二区三区八戒| 精品国产一区二区三区麻豆小说| 欧美日韩 一区二区三区| 你懂的视频一区二区| 日韩大陆毛片av| 午夜免费看视频| 136福利第一导航国产在线| 欧美激情在线看| 国产成人免费观看| 国产一区二区三区中文字幕| 亚洲国产三级| 久久精品成人欧美大片| 国产成人精品日本亚洲| 欧美一级二级三级九九九| 国产精品久久影视| 亚洲一区欧美激情| 欧美国产日韩一区二区在线观看 | 日本道在线视频| 可以在线观看的av| 成人深夜视频在线观看| 国产美女直播视频一区| 你懂的国产视频| 欧美在线资源| 俺去啦;欧美日韩| 丰满少妇一区二区| 精品国产18久久久久久洗澡| 欧美高清一级片在线| 黑鬼大战白妞高潮喷白浆| 日本在线观看高清完整版| 欧美激情在线看| 秋霞在线观看一区二区三区| 三级网站在线看| 国产精品99久久不卡二区| 成人黄色影片在线| 成人亚洲激情网| 亚洲av片不卡无码久久| 视频国产精品| 91精品视频网| а 天堂 在线| 亚洲伊人精品酒店| 欧美视频一区二区三区四区| 99re在线视频免费观看| 人在线成免费视频| 亚洲国产精品人人做人人爽| 大荫蒂性生交片| 日本动漫同人动漫在线观看| 亚洲手机成人高清视频| 一区二区三区四区在线视频| 91社区在线观看| 中文字幕电影一区| 亚洲国产日韩欧美| melody高清在线观看| 国产欧美日韩综合| 日本一区二区三区视频在线观看 | 国产精品久久无码一三区| 亚洲影院在线播放| 欧美人妖视频| 亚洲成人黄色在线| 波多野结衣先锋影音| 欧美美女啪啪| 国产亚洲美女久久| 蜜桃av免费在线观看| 国产精品精品国产一区二区| 久久精品美女视频网站 | 亚洲国产一区二区在线观看| 久久激情视频久久| 免费一级片在线观看| 亚洲天堂激情| 欧美在线精品免播放器视频| 欧美一区二区三区久久久| 日韩成人一级片| 成人精品视频99在线观看免费 | 激情久久五月天| 成人淫片在线看| 精品人妻无码一区二区| 不卡av电影在线播放| 欧美成人在线免费观看| 91在线看片| 国产不卡av在线播放| 久久国产88| 国产美女扒开尿口久久久| 国产精品欧美亚洲| 成人精品视频.| 日韩精品一区二区三区色偷偷| 亚洲欧美视频一区二区| 亚洲在线一区二区三区| 免费在线观看毛片网站| 91精品国产一区二区在线观看| 日韩美女在线视频| 亚欧洲乱码视频| 亚洲精品国产成人影院| 97超级碰在线看视频免费在线看| 中文字幕精品一区二| 国产二区国产一区在线观看| 鲁丝一区二区三区免费| 超碰在线无需免费| 色综合一区二区三区| 天天久久综合网| 亚洲资源网你懂的| 欧美成在线视频| 波多野结衣电影在线播放| 国产精品一区二区无线| 欧洲亚洲一区二区| 午夜久久久久久久久久久| 午夜精品久久久久久久99| 91亚洲永久精品| 看一级黄色录像| 欧洲一级精品| 亚洲精品一区二区在线观看| 国产精品18在线| 亚洲一区不卡| 99九九电视剧免费观看| 福利小视频在线观看| 五月天欧美精品| 超碰人人cao| 色偷偷综合网| 欧美在线影院在线视频| 成人免费视频国产| 亚洲欧美日本韩国| 在线观看高清免费视频| 精品亚洲自拍| 欧美极品xxxx| 99热这里只有精品在线| 国产精品沙发午睡系列990531| 黄色www网站| 亚洲视频精选| 欧美巨大黑人极品精男| 国产又粗又黄又爽| 欧美激情一区三区| 中文字幕日韩高清| 韩国一区二区av| 日韩有码av| 亚洲2020天天堂在线观看| av小说天堂网| 亚洲人成网站色在线观看| 国产高潮免费视频| 精品视频免费在线观看| 国产成人午夜视频网址| 精品推荐蜜桃传媒| 色综合天天综合网天天狠天天 | 成人av一级片| 久久影院资源站| 国模吧一区二区| 丰满人妻妇伦又伦精品国产| 一区二区三区欧美| 国产精品一级无码| 在线观看一区| 国产伦精品一区二区三区照片| 黄色网址在线免费播放| 69av一区二区三区| 一级片一级片一级片| 国产一区三区三区| 欧美日韩一级在线| 日本成人精品| 国模叶桐国产精品一区| 国模精品视频一区二区| 国产91国语对白在线| 久久久精品欧美丰满| 国产精品第12页| 欧美人妖在线| 国产一区玩具在线观看| a级网站在线播放| 欧美成人精品二区三区99精品| 精品视频久久久久| 久久午夜色播影院免费高清| 99视频在线免费| 99久久99久久精品国产片果冰| 91亚洲精品一区二区| 免费男女羞羞的视频网站在线观看| 欧美不卡一区二区三区四区| 影音先锋亚洲天堂| 欧美激情综合在线| 免费观看黄网站| 国产精品日韩| 日韩中文字幕一区| 警花av一区二区三区| 91av在线不卡| 91xxx在线观看| 精品日韩成人av| 蜜臀尤物一区二区三区直播| 中文字幕综合网| 亚洲av成人片无码| 秋霞午夜av一区二区三区| 熟女熟妇伦久久影院毛片一区二区| 亚洲第一二区| 国产成人综合精品| 在线免费观看的av| 亚洲色图25p| 性一交一乱一伧老太| 一本色道久久加勒比精品| 希岛爱理中文字幕| 久久久欧美精品sm网站| 涩多多在线观看| 日本三级在线播放完整版| 亚洲另类春色国产| 精品无码人妻一区| 国产伦精品一区二区三区免费| 99精品在线免费视频| 亚洲v在线看| 欧美三级网色| 91综合精品国产丝袜长腿久久| 国产精品第七影院| 阿v视频在线观看| 久久精品久久久久久| 国模精品一区二区| 精品捆绑美女sm三区| 亚洲一区二区天堂| 欧美日韩激情小视频| 国产成人久久久久| 中文在线一区二区| 国产黑丝在线观看| 狠狠色丁香久久婷婷综| 日韩有码免费视频| 最新成人av网站| 久久久成人精品一区二区三区| 九热爱视频精品视频| 国产区日韩欧美| 欧美高清一级片| 国产日韩精品综合网站| 欧美不卡高清一区二区三区| 97婷婷大伊香蕉精品视频| av网址在线| 久久av在线播放| 男人天堂手机在线| 日韩在线免费视频| 超碰在线国产| 在线播放国产一区中文字幕剧情欧美| 五月天丁香视频| 亚洲大胆人体视频| 亚洲av无码一区二区三区性色| 欧美高清性hdvideosex| 一级全黄少妇性色生活片| 欧美性猛片aaaaaaa做受| 亚洲影院在线播放| 色综合色狠狠综合色| 日韩欧美成人一区二区三区| 香蕉成人伊视频在线观看| 九九热国产在线| 一区二区三区欧美| 久久免费黄色网址| 一区二区三区在线观看网站| 国产精品老熟女一区二区| 亚洲色欲色欲www| 国产天堂av在线| 亚洲视频狠狠干| 亚洲欧洲黄色网| 国产露脸无套对白在线播放| 欧美精选午夜久久久乱码6080| 姑娘第5集在线观看免费好剧| 色综合久久中文综合久久97| 91在线视频免费播放| 一本色道a无线码一区v| 伊人久久久久久久久久久久 | 久久久久久久久99精品| 欧美激情aaa| 国产精品人妖ts系列视频| 婷婷综合在线视频| 日韩一区有码在线| 免费无遮挡无码永久在线观看视频 | av片在线观看| 久久久久久伊人| 国产传媒在线观看| 欧美最顶级丰满的aⅴ艳星| 欧美电影免费观看高清完整| 国产精品美女主播在线观看纯欲| 久久久久久一区二区三区四区别墅| 国产精品视频白浆免费视频| 亚洲欧洲专区| 成人一区二区三区四区| 欧美a一欧美| 亚洲国产日韩综合一区| 女人天堂亚洲aⅴ在线观看| 99国产精品白浆在线观看免费| 日韩午夜精品| 在线免费视频a| 国产一区二区导航在线播放| 屁屁影院国产第一页| 国产婷婷色一区二区三区在线| 亚洲激情图片网| 亚洲午夜一区二区三区| 波多野结衣黄色网址| 制服丝袜亚洲播放| 欧美日韩一区二区区别是什么 | 国产成人精品一区二三区| 色欧美片视频在线观看在线视频| 91精品国产乱码久久久| 精品国产伦一区二区三区观看体验| 你懂的在线观看视频网站| 日韩亚洲综合在线| 欧美少妇网站| 亚洲一区二区三区乱码aⅴ| 亚洲成在人线免费观看| 国产又爽又黄ai换脸| 在线亚洲欧美| 免费黄频在线观看| 久久久久久久综合狠狠综合| 一区二区国产精品精华液| 性久久久久久久久久久久| 伊人久久一区二区| 精品丝袜一区二区三区| 91福利国产在线观看菠萝蜜| 国产精品成人播放| 国产一区二区三区不卡av| 在线成人性视频| 久久婷婷激情| 少妇一级淫免费观看| 亚洲美腿欧美偷拍| 在线观看免费观看在线| 日韩精品免费在线视频| 欧美男男video| 成人黄色生活片| 成人同人动漫免费观看| 日本精品一区在线观看| 国产成人自拍网| 日本成人精品视频| 色美美综合视频| 天堂在线一二区| 久久久久久18| 亚洲国产中文在线| 青春草在线视频免费观看| 日韩av一区二区在线影视| 麻豆国产精品一区| 午夜精品久久一牛影视| 亚洲欧美另类视频| 超碰精品一区二区三区乱码| 欧美一区二区三区婷婷| 亚洲成人网上| 蜜桃久久精品一区二区| 国产又粗又猛又爽又黄av| 欧美视频在线视频| 天天综合网天天综合| 欧美激情手机在线视频| 欧美欧美在线| 神马午夜伦理影院| 国产激情一区二区三区| 私库av在线播放| 日韩写真欧美这视频| av网站大全在线| 91精品网站| 国产伊人精品| 日本人添下边视频免费| 亚洲风情在线资源站| 蜜桃视频久久一区免费观看入口| 欧美国产日韩免费| 精品网站aaa| 色综合av综合无码综合网站| 久久日一线二线三线suv| 国产成人无码一区二区在线播放| 亚洲欧美日韩网| 性感美女一区二区在线观看| 色一情一区二区三区四区| 日本美女一区二区| 女性裸体视频网站| 日韩一区二区电影网| 欧美人与牲禽动交com| 久久久亚洲综合网站| 久久久久免费| 肉色超薄丝袜脚交69xx图片 | 91视频综合| 日韩欧美中文在线视频| 亚洲国产日韩在线一区模特| 天天色棕合合合合合合合| 日本久久久a级免费| 色小子综合网| 天堂va欧美va亚洲va老司机| 午夜成人在线视频| 成人性爱视频在线观看| 欧美日韩久久久| 日韩精品一区二区在线播放| 日韩av在线网址| 电影久久久久久| 最近免费观看高清韩国日本大全| 成人夜色视频网站在线观看| 欧美videossex极品| 中文字幕无线精品亚洲乱码一区 | 日韩一区不卡| 国产一区二区0| 久久夜色精品国产噜噜亚洲av| 日韩专区在线播放| 成人福利一区| 亚洲国产精品三区| 亚洲一区二区视频在线观看| 欧美美女搞黄| 99国产高清| 久久男女视频| 久草视频免费播放| 亚洲欧美中文另类| 亚洲开心激情| 91插插插插插插插插| 亚洲成年人网站在线观看| 国产高清免费av在线| 懂色一区二区三区av片| 日韩在线一区二区三区| 精品无码久久久久| 日韩在线免费观看视频| 亚洲va久久久噜噜噜久久|