React-router中結(jié)合webpack實(shí)現(xiàn)按需加載實(shí)例
簡(jiǎn)要介紹:在React-router中,暴露了3個(gè)接口,如果結(jié)合webpack的code splitting,就通過切換路由實(shí)現(xiàn)按需加載。
1.webpack的code splitting
webpack可以通過一些方法,來實(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)用,通過這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)通過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:
切換路由時(shí),比如從首頁(yè)切換到了商品管理,這樣除了加載examine.js外,多加載了admin.js:
(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不能在任何地方引入按需加載的組件。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
React中使用TS完成父組件調(diào)用子組件的操作方法
由于在項(xiàng)目開發(fā)過程中,我們往往時(shí)需要調(diào)用子組件中的方法,這篇文章主要介紹了React中使用TS完成父組件調(diào)用子組件,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07React不能將useMemo設(shè)置為默認(rèn)方法原因詳解
這篇文章主要為大家介紹了React不能將useMemo設(shè)置為默認(rèn)方法原因詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2022-07-07詳解React Native 屏幕適配(炒雞簡(jiǎn)單的方法)
React Native 可以開發(fā) ios 和 android 的 app,在開發(fā)過程中,勢(shì)必會(huì)遇上屏幕適配,這篇文章主要介紹了詳解React Native 屏幕適配(炒雞簡(jiǎn)單的方法),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06JS中使用react-tooltip插件實(shí)現(xiàn)鼠標(biāo)懸浮顯示框
前段時(shí)間遇到的一個(gè)需求,要求鼠標(biāo)懸停顯示使用描述, 用到了react-tooltip插件,今天寫一個(gè)總結(jié),感興趣的朋友跟隨小編一起看看吧2019-05-05React?UI組件庫(kù)之快速實(shí)現(xiàn)antd的按需引入和自定義主題
react入門學(xué)習(xí)告一段路,下面這篇文章主要給大家介紹了關(guān)于React?UI組件庫(kù)之快速實(shí)現(xiàn)antd的按需引入和自定義主題的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07react.js 獲取真實(shí)的DOM節(jié)點(diǎn)實(shí)例(必看)
下面小編就為大家?guī)硪黄猺eact.js 獲取真實(shí)的DOM節(jié)點(diǎn)實(shí)例(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04解析react?函數(shù)組件輸入卡頓問題?usecallback?react.memo
useMemo是一個(gè)react hook,我們可以使用它在組件中包裝函數(shù)??梢允褂盟鼇泶_保該函數(shù)中的值僅在依賴項(xiàng)之一發(fā)生變化時(shí)才重新計(jì)算,這篇文章主要介紹了react?函數(shù)組件輸入卡頓問題?usecallback?react.memo,需要的朋友可以參考下2022-07-07