国产探花免费观看_亚洲丰满少妇自慰呻吟_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>  )}

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 庐江县| 苏州市| 永修县| 长沙县| 玛纳斯县| 盐池县| 叶城县| 赣榆县| 县级市| 永靖县| 两当县| 鹤庆县| 沙雅县| 连山| 宁化县| 潞城市| 镇宁| 昌邑市| 上栗县| 清苑县| 阜南县| 江城| 米泉市| 东辽县| 罗定市| 贡觉县| 洛川县| 疏勒县| 嘉义市| 霍城县| 五莲县| 唐河县| 定安县| 进贤县| 河东区| 库车县| 阳高县| 那坡县| 九龙县| 丁青县| 崇义县|