摘要:怎樣知道何時(shí)需要請(qǐng)求這個(gè)組件呢社區(qū)建議的是先加載一個(gè)容器組件這個(gè)容器組件本身非常小,當(dāng)這個(gè)容器組件被渲染到時(shí)則可認(rèn)為我們需要請(qǐng)求對(duì)應(yīng)的懶加載組件了。
React組件懶加載
Web應(yīng)用一個(gè)重要的優(yōu)勢(shì)就在于可以只加載我們想要的功能,而不必每次打開(kāi)都把整個(gè)系統(tǒng)載入
那么,在React里我們?cè)鯓訉?shí)現(xiàn)當(dāng)用到我們需求的功能時(shí)再請(qǐng)求對(duì)應(yīng)的組件,而不是一次性的請(qǐng)求全部代碼呢?
bundle-loader新版的React建議我們使用bundle-loader進(jìn)行代碼的分離,下面我們看下它的用法:
// 當(dāng)你用到這個(gè)函數(shù)時(shí),這個(gè)chunk才會(huì)被請(qǐng)求 var waitForChunk = require("bundle-loader!./file.js"); // 當(dāng)請(qǐng)求的chunk加載完成才會(huì)執(zhí)行傳入的回調(diào)函數(shù),并將請(qǐng)求的模塊作為參數(shù)傳入回調(diào)函數(shù) waitForChunk(function(file) { // 接收到懶加載模塊,類(lèi)似于下面代碼 // var file = require("./file.js"); });
這個(gè)插件使用非常簡(jiǎn)單,只是對(duì)require.ensure的封裝,使用起來(lái)類(lèi)似于AMD的方式,
只需在回調(diào)函數(shù)里接收到懶加載的模塊即可。
React 組件也是模塊,因此可以使用bundle-loader進(jìn)行代碼分離,只是需要在合適的地方請(qǐng)求調(diào)用即可。
怎樣知道何時(shí)需要請(qǐng)求這個(gè)組件呢?社區(qū)建議的是先加載一個(gè)bundle容器組件(這個(gè)bundle容器組件本身非常?。?dāng)這個(gè)容器組件被渲染到dom時(shí)則可認(rèn)為我們需要請(qǐng)求對(duì)應(yīng)的懶加載組件了。
我們可以為所有的懶加載組件封裝一個(gè)通用的容器組件:
(這里也有已經(jīng)封裝好的:react-lazy-bundle,直接安裝即可)
import React, { Component } from "react"; class Bundle extends Component { state = { // 因?yàn)閙odule被占用了,我們用mod定義變量 mod: null }; componentWillMount() { this.load(this.props); } componentWillReceiveProps(nextProps) { if (nextProps.load !== this.props.load) { this.load(nextProps); } } load(props) { this.setState({ mod: null }); props.load(mod => { this.setState({ // 為了兼容es module 和 AMD module mod: mod.default ? mod.default : mod }); }); } render() { //若加載完成則渲染對(duì)應(yīng)懶加載的組件,反之加載beforeLoad傳入的組件 return this.state.mod ?: ; } } export default Bundle;
如上封裝,使用時(shí)我們只需如下即可:
import React, { Component } from "react"; import Bundle from "./Bundle"; import Test from "bundle-loader?lazy&name=[name]!./test"; const BeforeLoadComponent = props =>before load {props.name}; class HomePage extends Component { render() { return (); } } export default HomePage;
怎么樣,是不是特別簡(jiǎn)單
結(jié)合React Router結(jié)合React Router也非常簡(jiǎn)單,因?yàn)橐呀?jīng)把Bundle作為Route的component參數(shù)了,
所以要再封裝一層,把load和beforeLoad預(yù)先傳入即可。
import Bundle from "./Bundle"; import About from "bundle-loader?lazy&name=[name]!./About"; const AboutWrapper = props =>; class App extends Component { render() { return ( ) } }Welcome!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/87274.html
摘要:粗讀近來(lái)沒(méi)什么特別要做的事,下班回來(lái)的空閑時(shí)間也比較多,所以抽空看看懶加載是怎么實(shí)現(xiàn)的,特別是看了下的庫(kù)的實(shí)現(xiàn)。之先別關(guān)注,按他給注釋說(shuō)測(cè)試用。之是組件綁定事件時(shí)會(huì)觸發(fā)的函數(shù)。 react-lazy-load粗讀 近來(lái)沒(méi)什么特別要做的事,下班回來(lái)的空閑時(shí)間也比較多,所以抽空看看懶加載是怎么實(shí)現(xiàn)的,特別是看了下 react-lazy-load 的庫(kù)的實(shí)現(xiàn)。 懶加載 這里懶加載場(chǎng)景不是路由...
摘要:同時(shí),懶加載按需加載概念至關(guān)重要。時(shí)至今日,這些實(shí)現(xiàn)懶加載腳本的代碼仍有學(xué)習(xí)意義。代碼實(shí)戰(zhàn)下面讓我們動(dòng)手實(shí)現(xiàn)一個(gè)按需加載輪子。同樣,對(duì)于組件也可以使用無(wú)狀態(tài)組件函數(shù)式組件實(shí)現(xiàn)這樣無(wú)疑更加簡(jiǎn)潔。 組件化在當(dāng)今前端開(kāi)發(fā)領(lǐng)域中是一個(gè)非常重要的概念。著名的前端類(lèi)庫(kù),比如 React、Vue 等對(duì)此概念都倍加推崇。確實(shí),組件化復(fù)用性(reusability)和模塊性(modularization...
摘要:同時(shí),懶加載按需加載概念至關(guān)重要。時(shí)至今日,這些實(shí)現(xiàn)懶加載腳本的代碼仍有學(xué)習(xí)意義。代碼實(shí)戰(zhàn)下面讓我們動(dòng)手實(shí)現(xiàn)一個(gè)按需加載輪子。同樣,對(duì)于組件也可以使用無(wú)狀態(tài)組件函數(shù)式組件實(shí)現(xiàn)這樣無(wú)疑更加簡(jiǎn)潔。 組件化在當(dāng)今前端開(kāi)發(fā)領(lǐng)域中是一個(gè)非常重要的概念。著名的前端類(lèi)庫(kù),比如 React、Vue 等對(duì)此概念都倍加推崇。確實(shí),組件化復(fù)用性(reusability)和模塊性(modularization...
摘要:同時(shí),懶加載按需加載概念至關(guān)重要。時(shí)至今日,這些實(shí)現(xiàn)懶加載腳本的代碼仍有學(xué)習(xí)意義。代碼實(shí)戰(zhàn)下面讓我們動(dòng)手實(shí)現(xiàn)一個(gè)按需加載輪子。同樣,對(duì)于組件也可以使用無(wú)狀態(tài)組件函數(shù)式組件實(shí)現(xiàn)這樣無(wú)疑更加簡(jiǎn)潔。 組件化在當(dāng)今前端開(kāi)發(fā)領(lǐng)域中是一個(gè)非常重要的概念。著名的前端類(lèi)庫(kù),比如 React、Vue 等對(duì)此概念都倍加推崇。確實(shí),組件化復(fù)用性(reusability)和模塊性(modularization...
閱讀 3517·2021-09-27 13:35
閱讀 3557·2019-08-29 17:09
閱讀 2426·2019-08-26 11:30
閱讀 698·2019-08-26 10:32
閱讀 532·2019-08-26 10:23
閱讀 1194·2019-08-26 10:20
閱讀 3150·2019-08-23 15:26
閱讀 3551·2019-08-23 14:33