亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

react按需加載

2024-04-27 15:12:12
字體:
來源:轉載
供稿:網友

react-router webpack 按需加載,與路由權限控制

說明

當網站規模越來越大,通過webpack 打包后的 react 項目也會越來越大,這會導致首頁渲染時間變長,影響用戶體驗,webpack 提供了一種按需加載的方式,需要結合 react-router 使用,他會將代碼拆分成多個小包,需要哪個部分就加載響應的包。

webpack 配置

首先需要對 config 文件修改一下,如下

output: { path: path.join(__dirname, 'dev'), // 輸出路徑 filename: '/js/bundle.js', // 輸出文件名 publicPath: path.join(__dirname, 'dev'), // 必填項 chunkFilename : '/js/routes/[name].chunk.js?[chunkhash:10]', // 按需加載輸出的文件名 },

路由配置頁(app/js/routes.js

react 按需加載,關鍵是讓路由動態加載組件,react-router 提供了一個屬性 getComponent ,它與 component 屬性一樣,但是是異步的,當路由匹配時才會調用這個方法,常用于代碼分割; 相關內容查看 API文檔

webpack 為我們提供了一個按需加載函數 require.ensure(dependencies, callback, chunkName),

dependencies : 依賴的模塊數組callback : 回調函數,該函數調用時會傳入一個 require 參數chunkName : 模塊名,用于構建時生成文件名

更多了解,查看官方文檔

一般寫法
/* app/js/routes.js 路由配置文件 */ import React from 'react'; import { Route, IndexRoute} from 'react-router'; // 引入容器組件 import App from './containers/App'; export default ( <Route path="/" component={App}> <IndexRoute getComponent={(location, cb) => { require.ensure([], require => { cb(null, require('./containers/Login.js').default) },'login'); }} /> <Route path="home" getComponent={(location, cb) => { require.ensure([], require => { cb(null, require('./containers/Home.js').default) },'home'); }} /> <Route path="login" getComponent={(location, cb) => { require.ensure([], require => { cb(null, require('./containers/Login.js').default) },'login'); }} /> </Route> );

注意:cb(null, require('./containers/Login.js').default) 因為我用 es6 的 export default 導出的組件,所以 require 之后要加上 default,如果使用 module.export 導出組件 則不需要加 default

拆分寫法

以上寫法在 路由層級或者數量較多的時候會比較臃腫,所以還需要對路由進行拆分

路由拆分,需要對目錄結構做一下改變,在js 文件夾下添加 routes 路由配置文件夾

|---js | |---actions | | | |---components | | | |---containers | | | |---reducers | | | |---store | | | |---routes | | |---login.js // 主路由的下一級路由 | | |---login // login 路由的下一級路由目錄 | |---constants.js // 靜態常量 | |---index.js // 項目入口文件 | |---routes.js // 路由配置主文件 |

routes.js 路由配置的主文件

const routes = { path : '/', // 將匹配的路由,對應標簽中的 path 屬性 indexRoute: { // 設置默認顯示頁面,對應標簽中的 IndexRoute 組件 getComponent(nextState, cb) { require.ensure([], (require) => { cb(null, require('./containers/Login').default); }, 'Login'); } }, // childRoutes:[] // 子 route 的一個數組,與在 JSX route 配置中的 children 一樣。 getChildRoutes(partialNextState, cb) { // 與 childRoutes 一樣,但是是異步的,并且可以接收 partialNextState(location 信息) require.ensure([], (require) => { cb(null, [ require('./routes/login'), require('./routes/home'), require('./routes/error') ]) }) }, getComponent(nextState, cb) { // 定義對應的組件,對應標簽中的 component 屬性,但是是異步的,路由匹配時才會調用這個方法 require.ensure([], (require) => { // require.ensure : webpack 提供的按需加載方法 cb(null, require('./containers/App').default); }, 'App'); } } export default routes;

js/routes/home.js 路由分支

module.exports = { path: 'home', getChildRoutes(partialNextState, cb) { require.ensure([], (require) => { cb(null, [ require('./home/page'), require('./home/student'), require('./home/admin') ]) }) }, getComponent(nextState, cb) { require.ensure([], (require) => { cb(null, require('../containers/Home').default) }, 'Home') } }

路由權限控制

基本思路 : 每當指定路由要發生改變,就使用一個中間服務,介于上一級路由和將要到達路由之間啟動,來判斷我們是否有進入這個路由的權限,React 中的 <Route /> 提供了一個 onEnter方法,表示正要進入這個路由,在這里判斷進入權限,可以修改要進入的頁面

<Route path="home" getComponent={(location, cb) => { require.ensure([], require => { cb(null, require('./containers/Home.js').default) },'home'); }} onEnter={request}/>function request(nextState, replace, next){ let auth = nextState.location.query.auth; if(auth === 'home'){ next(); } else if (auth === 'other') { replace('/other'); next(); } else { replace('/'); next(); }}

注:nextState : 表示跳轉后的location 信息;replace 用于 更改下一個進入的頁面地址,但是不會跳轉;next : 用于跳轉頁面,沒有其他操作則顯示當前路由對應頁面

如果使用路由拆分,如下

module.exports = { path: 'home', getChildRoutes(partialNextState, cb) { require.ensure([], (require) => { cb(null, [ require('./home/page'), require('./home/student'), require('./home/admin') ]) }) }, getComponent(nextState, cb) { require.ensure([], (require) => { cb(null, require('../containers/Home').default) }, 'Home') }, onEnter: (nextState, replace, next) => { console.log(nextState.location.state); let isAuth = nextState.location.state.isAuth; if (isAuth === 'student' || isAuth === 'teacher' || isAuth === 'admin') { next(); } else { replace('/error'); next(); } } }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久久久免费看| 成人a在线观看| 久久久成人精品| 欧美黄网免费在线观看| 久久亚洲精品毛片| 成人黄色在线播放| 揄拍成人国产精品视频| 久久精品一本久久99精品| 国产综合视频在线观看| 午夜精品久久久久久久白皮肤| 亚洲午夜激情免费视频| 97在线免费观看| 亚洲综合在线中文字幕| 一区二区av在线| 欧美性jizz18性欧美| 一区二区三区视频免费在线观看| 欧美专区在线观看| 日韩欧美成人免费视频| 亚洲a在线播放| 国产成人啪精品视频免费网| 精品亚洲一区二区三区在线观看| 久久久视频精品| 国产精品激情av电影在线观看| 国产精品h在线观看| 久久久欧美精品| 亚洲国产私拍精品国模在线观看| 色综合久久88| 欧美大片免费观看在线观看网站推荐| 欧美大尺度在线观看| 91成人国产在线观看| 日韩福利伦理影院免费| 日韩精品免费在线| 日韩欧美精品网址| 久久人人爽人人爽人人片亚洲| 日韩av电影在线网| 久久夜精品va视频免费观看| 国产精品久久久久久av下载红粉| 久久在线免费观看视频| 亚洲国产日韩欧美在线图片| 98精品在线视频| 91av视频在线播放| 4444欧美成人kkkk| 亚洲男人av电影| 91超碰中文字幕久久精品| 欧美性视频网站| 性金发美女69hd大尺寸| 国产亚洲精品久久久久久777| 在线电影欧美日韩一区二区私密| 97国产suv精品一区二区62| 亚洲国产日韩一区| 久久久日本电影| 清纯唯美亚洲综合| 亚洲影院高清在线| 欧美激情videos| 北条麻妃99精品青青久久| 日韩欧美aaa| 亚洲欧美另类中文字幕| 国产精品自产拍在线观看| 亚洲免费成人av电影| 成人国内精品久久久久一区| 欧美日韩国产黄| 色777狠狠综合秋免鲁丝| 日韩精品免费综合视频在线播放| 欧美色另类天堂2015| 欧美成人免费在线观看| 欧美理论片在线观看| 日韩h在线观看| 精品久久久久久久久久国产| 欧美与黑人午夜性猛交久久久| 在线免费看av不卡| 麻豆乱码国产一区二区三区| 日韩小视频在线观看| 少妇精69xxtheporn| 中文字幕精品在线视频| 亚洲男人的天堂在线| 国产精品白嫩美女在线观看| 亚洲国产日韩欧美综合久久| 影音先锋日韩有码| 91免费欧美精品| 国产精品自产拍高潮在线观看| 成人激情视频小说免费下载| 狠狠做深爱婷婷久久综合一区| 欧洲亚洲免费视频| 国产高清视频一区三区| 亚洲一区二区三区久久| 亚洲国产私拍精品国模在线观看| 欧美电影第一页| 国产日韩欧美黄色| 久久久噜噜噜久噜久久| 日韩黄色在线免费观看| 久久综合伊人77777尤物| 欧美电影免费观看大全| 欧美大片va欧美在线播放| 97在线观看免费| 亚洲成人免费网站| 欧美日韩ab片| 26uuu另类亚洲欧美日本老年| 亚洲国产成人精品电影| 精品中文字幕久久久久久| 69久久夜色精品国产69乱青草| 欧美精品性视频| 91在线色戒在线| 久久人人爽人人爽人人片av高请| 亚洲大胆人体视频| 日韩欧美在线网址| 亚洲丁香久久久| 欧美精品做受xxx性少妇| 中文字幕在线观看亚洲| 日韩av免费在线播放| 日韩在线视频国产| 欧美激情亚洲综合一区| 国产激情综合五月久久| 国产性猛交xxxx免费看久久| 少妇久久久久久| 日韩高清免费在线| 色噜噜狠狠狠综合曰曰曰88av| 国产精品草莓在线免费观看| 欧美成人小视频| 这里只有精品在线播放| 日韩中文视频免费在线观看| 97精品视频在线观看| 欧美在线视频一区| 国产精品99久久久久久久久| 亚州欧美日韩中文视频| 国产91精品久久久久久| 国产亚洲a∨片在线观看| 97精品伊人久久久大香线蕉| 色偷偷9999www| 国产精品99免视看9| 久久亚洲精品一区二区| 国产精品久久久久久久电影| 综合国产在线观看| 日本久久久久久久久久久| 国产亚洲欧美日韩美女| 91色视频在线导航| 亚洲第一中文字幕| 91视频九色网站| 欧美精品videosex极品1| 久久精品国产69国产精品亚洲| 久久久免费高清电视剧观看| 欧美综合第一页| 亚洲精品国产精品自产a区红杏吧| 久久久精品久久久久| 色综合久久中文字幕综合网小说| 亚洲国产97在线精品一区| 日韩精品高清视频| 久久视频国产精品免费视频在线| 亚洲有声小说3d| 日韩国产一区三区| 97视频免费在线观看| 欧美精品福利视频| 久久精品视频99| 欧美在线不卡区| 成人av电影天堂| 亚洲精品国产品国语在线| 欧美肥老妇视频| 在线电影中文日韩| 欧美乱人伦中文字幕在线| 亚洲午夜av电影| 日韩美女主播视频| www亚洲欧美| 亚洲福利视频二区| 成人午夜在线视频一区| 欧美日韩美女视频|