React中代碼分割的4種實(shí)現(xiàn)方式
前言
在 React 應(yīng)用中,我們通常的做法是直接將某個(gè)模塊導(dǎo)入到頁(yè)面中,這樣做導(dǎo)致的結(jié)果是打包出來(lái)的包體積過(guò)大。尤其是在引入了體積巨大的第三個(gè)庫(kù)的情況下,打包后的包體積會(huì)十分巨大。因此,我們需要關(guān)注我們的應(yīng)用中所包含的代碼,以避免因體積過(guò)大而導(dǎo)致加載時(shí)間過(guò)長(zhǎng)。
對(duì)代碼進(jìn)行分割能夠“懶加載”當(dāng)前用戶所需要的內(nèi)容,能夠顯著提高應(yīng)用的性能。盡管并沒(méi)有減少應(yīng)用的整體代碼體積,但可以避免加載用戶永遠(yuǎn)不需要的代碼,并在初始加載的時(shí)候可以減少所需加載的代碼量。
下面,我們分別來(lái)介紹下在 React 中實(shí)現(xiàn)代碼分割的幾種方式。
import()
import() 是 Webpack 提供的用于分割代碼的一個(gè)方法。該方法的返回結(jié)果是Promise,當(dāng)文件加載完成后悔將模塊導(dǎo)出給 promise.then 方法的回調(diào)。
例如有一個(gè) math 模塊,導(dǎo)出了 add方法和 minus 方法:
export const add = (a, b) => {
return a + b;
}
export const minus = (a, b) => {
return a - b;
}通常的做法是在頁(yè)面直接引入模塊:
import { add } from './math'
console.log(add(5, 10));使用 import 動(dòng)態(tài)導(dǎo)入模塊:
import('./math').then((math) => {
console.log(math.add(5, 10))
})當(dāng) Webpack 解析到該語(yǔ)法時(shí),會(huì)自動(dòng)進(jìn)行代碼分割。如果是使用 Create React App 創(chuàng)建的 React 應(yīng)用,import 功能已開(kāi)箱即用。
import React, { Component } from 'react';
class App extends Component {
handleClick = () => {
import('./math')
.then(({ add }) => {
add(5, 10)
})
.catch(err => {
// Handle failure
});
};
render() {
return (
<div>
<button onClick={this.handleClick}>兩數(shù)相加</button>
</div>
);
}
}
export default App;React.lazy
React.lazy 方法可以讓我們動(dòng)態(tài)加載組件,有助于縮減打包后 bundle 的體積,并延遲加載在初次渲染時(shí)未用到的組件。
React.lazy 接受一個(gè)函數(shù),這個(gè)函數(shù)需要?jiǎng)討B(tài)調(diào)用 import()。它必須返回一個(gè) Promise,該 Promise 需要 resolve 一個(gè) export default 的 React 組件。
const AsyncComponent = React.lazy(() => import('./OtherComponent'));React.lazy 返回的是一個(gè)異步組件 不能單獨(dú)使用,需要配合 React.Suspense 使用。當(dāng)這個(gè)異步組件的狀態(tài)是 pending 時(shí)顯示的是 Suspense 中 fallback 的內(nèi)容,只有 resolve 時(shí)才會(huì)顯示加載好的組件。如此使得我們可以在使用 lazy 組件時(shí)做優(yōu)雅降級(jí)(如在 fallback添加 loading 效果等)。
import React, { Suspense } from 'react';
const AsyncComponent = React.lazy(() => import('./OtherComponent'));
function MyComponent() {
return (
<div>
<Suspense fallback={<div>Loading...</div>}>
<AsyncComponent />
</Suspense>
</div>
);
}import() + React Loadable
React Loadable 是一個(gè)輕量級(jí)的代碼分割組件,它是一個(gè)高階組件,能讓你的應(yīng)用程序在渲染之前動(dòng)態(tài)的加載任何模塊。
使用 import() + React Loadable ,能優(yōu)雅的實(shí)現(xiàn)基于 react-router 4.x 版本的路由分割:
import Loadable from 'react-loadable';
const LoadableBar = Loadable({
loader: () => import('./components/Bar'),
loading() {
return <div>Loading...</div>
}
});
class MyComponent extends React.Component {
render() {
return <LoadableBar/>;
}
}在實(shí)際業(yè)務(wù)開(kāi)發(fā)中,我們通常會(huì)使用一些框架來(lái)快速開(kāi)發(fā)React應(yīng)用。在這些框架中,通常都會(huì)提供按需加載的功能。下面,我們來(lái)看看 UmiJS 框架中的按需加載。
UmiJS 按需加載
UmiJS 是一個(gè)可擴(kuò)展的企業(yè)級(jí)前端應(yīng)用框架,它以路由為基礎(chǔ),支持配置式路由和約定式路由。UmiJS 封裝了一個(gè) dynamic 組件來(lái)實(shí)現(xiàn)代碼分割。
啟用按需加載
UmiJS 的按需加載功能默認(rèn)是關(guān)閉的,需要在使用之前通過(guò)配置開(kāi)啟。在 UmiJS 項(xiàng)目中添加如下的配置開(kāi)啟:
export default {
dynamicImport: {},
}使用按需加載
首先封裝一個(gè)異步組件:
import { dynamic } from 'umi';
export default dynamic({
loader: async function() {
// 這里的注釋 webpackChunkName 可以指導(dǎo) webpack 將該組件 HugeA 以這個(gè)名字單獨(dú)拆出去
const { default: HugeA } = await import(/* webpackChunkName: "external_A" */ './HugeA');
return HugeA;
},
});然后使用封裝好的異步組件:
import React from 'react';
import AsyncHugeA from './AsyncHugeA';
export default () => {
return <AsyncHugeA />;
}總結(jié)
到此這篇關(guān)于React中代碼分割的文章就介紹到這了,更多相關(guān)React代碼分割內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
react-router?重新加回跳轉(zhuǎn)攔截功能詳解
這篇文章主要為大家介紹了react-router?重新加回跳轉(zhuǎn)攔截功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
react國(guó)際化化插件react-i18n-auto使用詳解
這篇文章主要介紹了react國(guó)際化化插件react-i18n-auto使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
React SSR服務(wù)端渲染的實(shí)現(xiàn)示例
本文主要介紹了實(shí)現(xiàn)React服務(wù)端渲染,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
React 遞歸手寫(xiě)流程圖展示樹(shù)形數(shù)據(jù)的操作方法
這篇文章主要介紹了React 遞歸手寫(xiě)流程圖展示樹(shù)形數(shù)據(jù)的操作方法,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11
React?中的?JS?報(bào)錯(cuò)及容錯(cuò)方案
這篇文章主要為大家介紹了React?中的?JS?報(bào)錯(cuò)及容錯(cuò)方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08

