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

首頁 > 編程 > JavaScript > 正文

詳解webpack + react + react-router 如何實現懶加載

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

在 Webpack 1 中主要是由bundle-loader進行懶加載,而 Webpack 2 中引入了類似于 SystemJS 的System.import語法,首先我們對于System.import的執行流程進行簡單闡述:

  1. Webpack 會在編譯過程中掃描代碼庫時將發現的System.import調用引入的文件及其相關依賴進行單獨打包,注意,Webpack 會保證這些獨立模塊及其依賴不會與主應用的包體相沖突。
  2. 當我們訪問到這些獨立打包的組件模塊時,Webpack 會發起 JSONP 請求來抓取相關的包體。
  3. System.import 同樣也是 Promise,在請求完成之后System.import會將抓取到的模塊作為參數傳入then中的回調函數。
  4. 如果我們重復訪問已經加載完畢的模塊,Webpack 不會重復執行抓取與解析的過程。

而 React Router 路由的懶加載實際上分為動態路由與與懶加載兩步,典型的所謂動態路由配置如下:

/** * <Route path="/" component={Core}> *  <IndexRoute component={Home}/> *  <Route path="about" component={About}/> *  <Route path="users" component={Users}> *  <Route path="*" component={Home}/> * </Route> */export default { path: '/',  component: Core, indexRoute: {   getComponent(location, cb) {    ...  }, }, childRoutes: [  {   path: 'about',    getComponent(location, cb) {    ...   },  },  {   path: 'users',    getComponent(location, cb) {    ...   },  },  {   path: '*',    getComponent(location, cb) {    ...   },  }, ],};

正常打包

import IndexPage from './views/app.jsx'import AboutPage from './views/about.jsx'export default function({history}) {  return (    <Router history={history}>      <Route path="/" component={IndexPage} />      <Route path="/about" component={AboutPage} />    </Router>  )}

這是一個正常打包的路由寫法, 如果需要分割代碼, 我們需要改造下路由, 借助getComponent和require.ensure

webpack 代碼分割

export default function({history}) {  return (    <Router history={history}>      <Route path="/" getComponent={(location, callback) => {        require.ensure([], function(require) {          callback(null, require('./HomePage.jsx'))        })      }} />      <Route path="/about" getComponent={(location, callback) => {        require.ensure([], function(require) {          callback(null, require('./AboutPage.jsx'))        })      }} />    </Router>  )}

這樣看來代碼有點累, 我們稍微改造下

const home = (location, callback) => { require.ensure([], require => {  callback(null, require('./HomePage.jsx')) }, 'home')}const about = (location, callback) => { require.ensure([], require => {  callback(null, require('./AboutPage.jsx')) }, 'about')}export default function({history}) {  return (    <Router history={history}>      <Route path="/" getComponent={home}></Route>      <Route path="/about" getComponent={about}></Route>    </Router>  )}

這樣看起來是不是簡潔了很多

注意: 由于webpack的原因, 如果直接require('./AboutPage.jsx')不能正常加載, 請嘗試require('./AboutPage.jsx').default

webpack2 代碼分割

上面的代碼看起來好像都是webpack1的寫法, 那么webpack2呢?

webpac2就需要借助System.import了

export default function({history}) {  return (    <Router history={history}>      <Route path="/" getComponent={(location, callback) => {        System.import('./HomePage.jsx').then(component => {          callback(null, component.default || component)        })      }} />      <Route path="/about" getComponent={(location, callback) => {        System.import('./AboutPage.jsx').then(component => {          callback(null, component.default || component)        })      }} />    </Router>  )}

我們一樣可以把上面的代碼優化一下

const home = (location, callback) => {  System.import('./HomePage.jsx').then(component => {    callback(null, component.default || component)  })}const about = (location, callback) => {  System.import('./AboutPage.jsx').then(component => {    callback(null, component.default || component)  })}export default ({ history }) => {  return (    <Router history={history}>      <Route name="home" path="/" getComponent={home} />      <Route name="about" path="/about" getComponent={about} />    </Router>  )}

webpack2 + dva 實現路由和 models 懶加載

const routerThen = (app, callback, [component, model]) => {  app.model(model.default || model)  callback(null, component.default || component)}export default ({ history, app }) => {  return (    <Router history={history}>      <Route name="home" path="/" getComponent={(location, callback) => {        Promise.all([          System.import('./views/app.jsx'),          System.import('./models/topics')        ]).then(routerThen.bind(null, app, callback))      }} />      <Route name="article" path="/article/:id" getComponent={(location, callback) => {        Promise.all([          System.import('./views/article.jsx'),          System.import('./models/topic')        ]).then(routerThen.bind(null, app, callback))      }} />    </Router>  )}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中日韩美女免费视频网站在线观看| 欧美日韩一区二区三区在线免费观看| 热99精品里视频精品| 久久亚洲精品小早川怜子66| 亚洲久久久久久久久久久| 国产日韩在线视频| 成人免费观看49www在线观看| 日韩精品高清在线观看| 欧美日韩国产中字| 欧美最顶级丰满的aⅴ艳星| 欧美激情图片区| 日韩av网站导航| 日韩麻豆第一页| 亚洲老头同性xxxxx| 久久久久久久久久久免费精品| 欧美性做爰毛片| 夜夜嗨av一区二区三区四区| 欧美日韩在线视频一区二区| 精品国产网站地址| 国产成人亚洲综合| 日韩av中文字幕在线| 亚洲乱码av中文一区二区| 91夜夜未满十八勿入爽爽影院| 久久久久久久久爱| 日本在线观看天堂男亚洲| 成人免费福利视频| 国产日韩在线精品av| 欧美老少做受xxxx高潮| 中文字幕日韩有码| 色综合色综合久久综合频道88| 国产日韩欧美电影在线观看| 亚洲视频日韩精品| 国产精品国语对白| 中文字幕无线精品亚洲乱码一区| 日本久久91av| 国产精品www色诱视频| 亚洲精品美女视频| 国产亚洲综合久久| 亚洲精品视频在线播放| 日韩专区在线播放| 久久久久久久国产精品视频| 久久亚洲精品一区二区| 亚洲男人天天操| 伊人久久男人天堂| 国产精品偷伦视频免费观看国产| 精品视频久久久久久久| 91在线观看免费高清| 国产精品视频区1| 日韩视频欧美视频| 亚洲国产精品福利| 不卡伊人av在线播放| 日本亚洲欧美成人| 精品国产一区二区三区久久| 日韩黄色av网站| 国产精品色悠悠| 伊人伊人伊人久久| 久久精品电影网站| 日韩在线观看精品| 国产一区深夜福利| 国产精品91久久久久久| 欧美在线观看一区二区三区| 福利二区91精品bt7086| 欧美日韩性生活视频| 日韩中文字幕网| 亚洲男女自偷自拍图片另类| 亚洲电影在线观看| 国产99视频在线观看| 日本欧美国产在线| 久久九九免费视频| 国产欧美精品一区二区三区-老狼| 一区二区亚洲精品国产| 色偷偷综合社区| 久久久国产一区二区三区| 在线看片第一页欧美| 亚洲影院色在线观看免费| 欧美夫妻性视频| 不卡中文字幕av| 欧美激情免费看| 亚洲天堂免费视频| 欧美成年人在线观看| 国产精品jizz在线观看麻豆| 亚洲黄色av网站| 最好看的2019年中文视频| 国产中文字幕日韩| 亚洲精品一区二三区不卡| 九九精品在线视频| 日韩av第一页| 亚洲性视频网址| 久久久久久成人精品| 亚洲天堂免费在线| 69视频在线免费观看| 777国产偷窥盗摄精品视频| 亚洲电影第1页| 国外色69视频在线观看| 日本精品久久中文字幕佐佐木| 国产91色在线|| 综合国产在线视频| 九九精品在线视频| 麻豆精品精华液| 96pao国产成视频永久免费| 国产精品丝袜久久久久久不卡| 永久免费看mv网站入口亚洲| 亚洲综合在线播放| 亚洲香蕉成人av网站在线观看| 色阁综合伊人av| 亚洲伊人一本大道中文字幕| 国产精品一区二区久久国产| 精品视频在线播放免| 亚洲欧美日韩综合| 国产亚洲免费的视频看| 亚洲国产精品久久91精品| 久久免费视频这里只有精品| 美女久久久久久久久久久| 久久av中文字幕| 久久高清视频免费| 欧美日韩国产综合新一区| 欧美肥老妇视频| 国产日韩精品一区二区| 日本韩国在线不卡| 亚洲国产高潮在线观看| 亚洲第一页在线| 狠狠色香婷婷久久亚洲精品| 国产欧美一区二区三区四区| 午夜剧场成人观在线视频免费观看| 奇米四色中文综合久久| 国产精品一区二区久久久久| 成人免费xxxxx在线观看| 永久免费看mv网站入口亚洲| 国产z一区二区三区| 亚洲香蕉伊综合在人在线视看| 精品国产美女在线| 亚洲欧美国内爽妇网| 欧美二区乱c黑人| 国产精品成人国产乱一区| 欧美激情一级欧美精品| 日韩在线视频网| 久久伊人精品一区二区三区| 日本精品一区二区三区在线| 欧美日韩一区免费| 精品久久久久久中文字幕一区奶水| 欧美激情一级二级| 国产综合视频在线观看| 亚洲美女激情视频| 色偷偷偷综合中文字幕;dd| 国产精品网站大全| 亚洲美女精品成人在线视频| 日本电影亚洲天堂| 亚洲人成在线观看| 中文字幕一区电影| 亚洲国产日韩欧美在线图片| 亚洲欧美第一页| 亚洲男人天堂2023| 欧美激情日韩图片| 精品一区二区三区四区在线| 精品精品国产国产自在线| 久久国产精品电影| 91九色国产视频| 欧美日韩激情美女| 亚洲欧美激情视频| 亚洲一区二区三区777| 久久av在线播放| 亚洲人成电影网站色www| 亚洲国产女人aaa毛片在线| 国产精品永久免费观看|