摘要:使用動(dòng)態(tài)之前使用動(dòng)態(tài)后注意,動(dòng)態(tài)并不是標(biāo)準(zhǔn)的,所以需要配置可以以一個(gè)標(biāo)準(zhǔn)組件的方法渲然一個(gè)動(dòng)態(tài)引入的組件。以前的做法使用這樣在組件渲然的時(shí)候才加載。
代碼分隔
我們現(xiàn)在大多數(shù)React項(xiàng)目都是以Webpack 或者 Browserify等將一堆的jsx文件組織一起,并且由一個(gè)類似index.js的入口文件串聯(lián)起來的單頁面web頁面。
例如:
// math.js export function add(a, b) { return a + b; }
App:
// app.js import { add } from "./math.js"; console.log(add(16, 26)); // 42
打完包后:
function add(a, b) { return a + b; } console.log(add(16, 26)); // 42
從這個(gè)例子可以看出,打完包后將所有的js都?jí)嚎s到一個(gè)文件里了。隨著項(xiàng)目越來越大,打包的文件也會(huì)越來越大,如果再引入一些第三方的js庫,那就更龐大了。
接下來介紹一下如何將React代碼分隔。(以下內(nèi)容是16.6.0版本才支持的)
Code Splitting會(huì)幫助你的應(yīng)用實(shí)現(xiàn)lazy load.
這么做,即使沒有減少整個(gè)項(xiàng)目的代碼量,也會(huì)避免在項(xiàng)目初始加載時(shí),加載沒必須的js,從而使用項(xiàng)目性能有所提升。
import()最簡單直接的方式就是引入動(dòng)態(tài) import 實(shí)現(xiàn)代碼分隔。
使用 動(dòng)態(tài) import 之前:
import { add } from "./math"; console.log(add(16, 26));
使用動(dòng)態(tài) import 后:
import("./math").then(math => { console.log(math.add(16, 26)); });
注意,動(dòng)態(tài) import 并不是標(biāo)準(zhǔn)的EcmaScript,所以需要配置 babel-plugin-syntax-dynamic-importReact.lazy
React.lazy 可以以一個(gè)React標(biāo)準(zhǔn)組件的方法渲然一個(gè)動(dòng)態(tài)引入的組件。
以前的做法:
import OtherComponent from "./OtherComponent"; function MyComponent() { return (); }
使用 React.lazy :
const OtherComponent = React.lazy(() => import("./OtherComponent")); function MyComponent() { return (); }
這樣在組件MyComponent渲然的時(shí)候才加載OtherComponent。
React.lazy 必須使用動(dòng)態(tài) import() 引入組件,必須返回一個(gè) Promise Component。
React.lazy 目前不支持服務(wù)端渲然Suspense
假如在 React.lazy 時(shí),import 失敗或者異常時(shí),我們需要給于提示,或者一個(gè)默認(rèn)的組件,我們就需要使用 Suspense .
例如:
const OtherComponent = React.lazy(() => import("./OtherComponent")); function MyComponent() { return (}>Loading...
fallback 也是一個(gè)組件,但不能通過 動(dòng)態(tài) import 引入的組件.
Suspense 只能包裹一個(gè)單結(jié)點(diǎn),如果有多個(gè) 動(dòng)態(tài) import 的組件需要放在一個(gè) Suspense 中時(shí),可以使用類似 React.Fragmet 包裹一下,也可以使用其他的 React 組件包裹。例如:
const OtherComponent = React.lazy(() => import("./OtherComponent")); const AnotherComponent = React.lazy(() => import("./AnotherComponent")); function MyComponent() { return (}>Loading...
基于 Router 的代碼分隔,也是我們通常所說的按需加載。是我們推薦的方式。
例如:
import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; import React, { Suspense, lazy } from "react"; const Home = lazy(() => import("./routes/Home")); const About = lazy(() => import("./routes/About")); const App = () => (Loading...
React.lazy 目前只支持 default 導(dǎo)出,不支持命名導(dǎo)出。例如,只支持:
export default () => { return(I am a Lazy component); }
如果要支持命令導(dǎo)出,需要重新再 export ,例如:
// ManyComponents.js export const MyComponent = /* ... */; export const MyUnusedComponent = /* ... */;
// MyComponent.js export { MyComponent as default } from "./ManyComponents.js";
// MyApp.js import React, { lazy } from "react"; const MyComponent = lazy(() => import("./MyComponent.js"));
推薦閱讀 《React 手稿》
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/99906.html
摘要:配置方式找到文件如需添加路由則在里面添加,同時(shí)需要后端更改配置除了上面的路徑,其他路徑全部指向單頁應(yīng)用多路由預(yù)渲染指南使用說明源碼為方便快速構(gòu)建項(xiàng)目,本例所有配置的代碼均放在項(xiàng)目中。 寫在前面 每次構(gòu)建react項(xiàng)目的時(shí)候都會(huì)配置一大堆東西,時(shí)間久了就會(huì)忘記怎么配置。為了方便自己記憶也為了其他開發(fā)者在構(gòu)建react應(yīng)用時(shí)能夠快速開發(fā),故作此記錄。 本項(xiàng)目基于 create-react-...
摘要:一基礎(chǔ)配置項(xiàng)目安裝安裝并新建文件,并初始化文件入口出口配置插件安裝配置用來解析文件轉(zhuǎn)譯成瀏覽器可以識(shí)別的文件。以形式在頁面中插入代碼加載文件是否開啟代碼壓縮。 一.基礎(chǔ)配置 1.init項(xiàng)目 mkdir react-webpack-demo cd react-webpack-demo mkdir src mkdir dist npm init -y 2.安裝webpack 安裝webp...
摘要:或者的,都會(huì)對(duì)其進(jìn)行分析。舒適的開發(fā)體驗(yàn),有助于提高我們的開發(fā)效率,優(yōu)化開發(fā)體驗(yàn)也至關(guān)重要組件熱刷新熱刷新自從推出熱刷新后,前端開發(fā)者在開環(huán)境下體驗(yàn)大幅提高。實(shí)現(xiàn)熱調(diào)試后,調(diào)試流程大幅縮短,和普通非直出模式調(diào)試體驗(yàn)保持一致。 showImg(https://segmentfault.com/img/bVbtOR3?w=1177&h=635); webpack,打包所有的資源 不知道不...
摘要:或者的,都會(huì)對(duì)其進(jìn)行分析。舒適的開發(fā)體驗(yàn),有助于提高我們的開發(fā)效率,優(yōu)化開發(fā)體驗(yàn)也至關(guān)重要組件熱刷新熱刷新自從推出熱刷新后,前端開發(fā)者在開環(huán)境下體驗(yàn)大幅提高。實(shí)現(xiàn)熱調(diào)試后,調(diào)試流程大幅縮短,和普通非直出模式調(diào)試體驗(yàn)保持一致。 showImg(https://segmentfault.com/img/bVbtOR3?w=1177&h=635); webpack,打包所有的資源 不知道不...
閱讀 1385·2019-08-30 15:55
閱讀 1657·2019-08-26 10:21
閱讀 3449·2019-08-23 18:28
閱讀 3384·2019-08-23 15:38
閱讀 754·2019-08-23 15:24
閱讀 2148·2019-08-23 13:59
閱讀 788·2019-08-23 11:31
閱讀 2878·2019-08-23 10:53