簡要介紹:在React-router中,暴露了3個接口,如果結合webpack的code splitting,就通過切換路由實現按需加載。
1.webpack的code splitting
webpack可以通過一些方法,來實現按需加載,暴露的接口為require.ensure
require.ensure(["module-a", "module-b"], function() { var a = require("module-a"); // ...});這個require.ensure保證了模塊的異步調用,當callback回調中調用了一個模塊的時候,可以實現按需加載。
2.React-router實現按需加載的接口
React-router定義了 getChildRoutes, getIndexRoute, getComponents這樣3個方法,這3個方法是異步的,并且只在需要的時候調用,通過這3個方法定義的路由,我們稱之為“漸進式路由匹配”,React-router在匹配到路由時,只是漸進式的加載改路由所需要的組件,這樣就能實現按需加載。
(1)webpack的配置:
 output: {    path: __dirname + '/dist/js/',    publicPath:'/js/',    filename: '[name].js',    chunkFilename: '[name].[chunkhash:5].chunk.js'  },在這里我們加上了chunkFilename:…. 這句代碼用于分割js,特別注意publicPath這個路徑要與服務器的資源的路徑對應,否則加載js的時候會出現404錯誤。
(2)通過getComponents等3個方法重新配置路由
export const routes={ path:'/', getComponent(nextState,callback){  require.ensure([],require=>{   callback(null,require('../components/nav').default);  },'nav'); }, indexRoute:{  getComponent(nextState,callback){   require.ensure([],require=>{    callback(null,require('../components/examine').default);   },'examine');  } }, childRoutes:[{  path:'examine',  getComponent(nextState,callback){   require.ensure([],require=>{    callback(null,require('../components/examine').default);   },'examine');   } }, {  path:'admin',  getComponent(nextState,callback){   require.ensure([],require=>{    callback(null,require('../components/admin').default);   },'admin');  } }, {  path:'history',  getComponent(nextState,callback){   require.ensure([],require=>{    callback(null,require('../components/history').default);   },'history');  } }, {  path:'feedback',  getComponent(nextState,callback){   require.ensure([],require=>{    callback(null,require('../components/feedback').default);   },'feedback')  } }]};這里我們將路由定義中的component替換成了 getComponent。
(3)最后效果:
首頁時候,加載了examine.js和nav.js: 

切換路由時,比如從首頁切換到了商品管理,這樣除了加載examine.js外,多加載了admin.js:

(4)總結:
我們看到react-router的按需加載,作用主要表現在可以減少首頁請求的文件的大小。
3.注意事項:
1、require(‘components/Index').default中require方法的參數不能使用變量,只能使用字符串!
2、如果你的組件是使用es5的module.exports導出的話,那么只需要require(‘components/Index')即可。而如果你的組件是使用es6的export default導出的話,那么需要加上default!例如:require(‘components/Index').default
3、如果在路由頁面使用了按需加載(require.ensure)加載路由級組件的方式,那么在其他地方(包括本頁面)就不要再import了,否則不會打包生成chunk文件。簡而言之,需要按需加載的路由級組件必須在路由頁面進行加載。
特別是第3點,筆者就是因為這個原因導致按需加載失敗,特別注意import不能在任何地方引入按需加載的組件。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答