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

首頁 > 編程 > 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>  )}

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阳谷县| 清原| 吴旗县| 新昌县| 紫阳县| 甘泉县| 穆棱市| 蓬溪县| 同仁县| 阿拉尔市| 万安县| 涟源市| 错那县| 肇庆市| 大英县| 古浪县| 化德县| 永吉县| 突泉县| 长垣县| 凉城县| 桃园县| 黄冈市| 措勤县| 鲁甸县| 吉林市| 肇庆市| 惠来县| 红原县| 淮南市| 郓城县| 永清县| 封丘县| 弋阳县| 类乌齐县| 怀安县| 郸城县| 平顶山市| 从江县| 尚义县| 科技|