溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

React-router中結(jié)合webpack實(shí)現(xiàn)按需加載的示例分析

發(fā)布時(shí)間:2021-07-07 14:28:26 來(lái)源:億速云 閱讀:166 作者:小新 欄目:web開(kāi)發(fā)

這篇文章主要為大家展示了“React-router中結(jié)合webpack實(shí)現(xiàn)按需加載的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“React-router中結(jié)合webpack實(shí)現(xiàn)按需加載的示例分析”這篇文章吧。

1.webpack的code splitting

webpack可以通過(guò)一些方法,來(lái)實(shí)現(xiàn)按需加載,暴露的接口為require.ensure

require.ensure(["module-a", "module-b"], function() {
 var a = require("module-a");
 // ...
});

這個(gè)require.ensure保證了模塊的異步調(diào)用,當(dāng)callback回調(diào)中調(diào)用了一個(gè)模塊的時(shí)候,可以實(shí)現(xiàn)按需加載。

2.React-router實(shí)現(xiàn)按需加載的接口

React-router定義了 getChildRoutes, getIndexRoute, getComponents這樣3個(gè)方法,這3個(gè)方法是異步的,并且只在需要的時(shí)候調(diào)用,通過(guò)這3個(gè)方法定義的路由,我們稱之為“漸進(jìn)式路由匹配”,React-router在匹配到路由時(shí),只是漸進(jìn)式的加載改路由所需要的組件,這樣就能實(shí)現(xiàn)按需加載。

(1)webpack的配置:

 output: {
    path: __dirname + '/dist/js/',
    publicPath:'/js/',
    filename: '[name].js',
    chunkFilename: '[name].[chunkhash:5].chunk.js'
  },

在這里我們加上了chunkFilename:…. 這句代碼用于分割js,特別注意publicPath這個(gè)路徑要與服務(wù)器的資源的路徑對(duì)應(yīng),否則加載js的時(shí)候會(huì)出現(xiàn)404錯(cuò)誤。

(2)通過(guò)getComponents等3個(gè)方法重新配置路由

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)最后效果:

首頁(yè)時(shí)候,加載了examine.js和nav.js:

React-router中結(jié)合webpack實(shí)現(xiàn)按需加載的示例分析

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

React-router中結(jié)合webpack實(shí)現(xiàn)按需加載的示例分析

(4)總結(jié):

我們看到react-router的按需加載,作用主要表現(xiàn)在可以減少首頁(yè)請(qǐng)求的文件的大小。

3.注意事項(xiàng):

1、require(‘components/Index').default中require方法的參數(shù)不能使用變量,只能使用字符串!

2、如果你的組件是使用es5的module.exports導(dǎo)出的話,那么只需要require(‘components/Index')即可。而如果你的組件是使用es6的export default導(dǎo)出的話,那么需要加上default!例如:require(‘components/Index').default

3、如果在路由頁(yè)面使用了按需加載(require.ensure)加載路由級(jí)組件的方式,那么在其他地方(包括本頁(yè)面)就不要再import了,否則不會(huì)打包生成chunk文件。簡(jiǎn)而言之,需要按需加載的路由級(jí)組件必須在路由頁(yè)面進(jìn)行加載。

特別是第3點(diǎn),筆者就是因?yàn)檫@個(gè)原因?qū)е掳葱杓虞d失敗,特別注意import不能在任何地方引入按需加載的組件。

以上是“React-router中結(jié)合webpack實(shí)現(xiàn)按需加載的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI