1.打包
- 概念:
是一个将文件引入并合并到一个单独文件的过程,最终形成一个”bundle”。接着在页面上引入该bundle,整个应用即可一次性加载。
- 示例:
1234567891011121314151617// App文件// app.jsimport { add } from './math'console.log(add(10, 20))// math.jsexport function add(a, b) {return a + b}// 打包后文件function add(a, b) {return a + b}console.log(add(10, 20))
2.代码分割
随着应用的增长,代码包也随之增长;
代码分割能够帮助“懒加载”所需要的内容,可以显著地提高应用性能;
尽管并没有减少应用整体的代码体积,但你可以避免加载用户永远不需要的代码,并在初始加载的时候减少所需加载的代码量。
3.import()
在应用中引入代码分割的最佳方式是通过动态
import()
语法
- 使用前:
123import { add } from './math'console.log(add(10, 20)) - 使用后:
123import('./math').then(math => {console.log(math.add(10, 20))})
4.React.lazy
React.lazy
函数能让你像渲染常规组件一样处理动态引入(的组件)。
- 使用前:
1import OtherComponent from './OtherComponent' - 使用后:
1const OtherComponent = React.lazy(() => import('./OtherComponent'))- 此代码将会在组件首次渲染时,自动导入包含
OtherComponent
组件的包。并返回一个Promise
,该 Promise 需要 resolve 一个defalut
export 的 React 组件。 - 在
Suspense
组件中渲染 lazy 组件 fallback
属性接受任何在组件加载过程中你想展示的 React 元素- 可以用一个
Suspense
组件包裹多个懒加载组件。
- 此代码将会在组件首次渲染时,自动导入包含
- 示例:
123456789101112131415161718192021222324252627282930313233343536// HelloWorld.jsimport React from 'react'function HelloWorld() {return <div>Hello World!</div>}export default HelloWorld// App.jsimport React, { Suspense } from 'react'// React.lazyconst HelloWorld = React.lazy(() => import('./components/HelloWorld'))function MyComponent() {return (<div><Suspense fallback={<div>Loading...</div>}><HelloWorld /></Suspense></div>)}function App() {return (<div className="App"><MyComponent /></div>)}export default App -
模块加载失败,会触发一个错误,可以通过
异常捕获边界
123456789101112131415161718import React, { Suspense } from 'react';import MyErrorBoundary from './MyErrorBoundary';const OtherComponent = React.lazy(() => import('./OtherComponent'));const AnotherComponent = React.lazy(() => import('./AnotherComponent'));const MyComponent = () => (<div><MyErrorBoundary><Suspense fallback={<div>Loading...</div>}><section><OtherComponent /><AnotherComponent /></section></Suspense></MyErrorBoundary></div>);
5.基于路由的代码分割
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import React, { Suspense, lazy } from 'react'; import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'; const Home = lazy(() => import('./routes/Home')); const About = lazy(() => import('./routes/About')); const App = () => ( <Router> <Suspense fallback={<div>Loading...</div>}> <Switch> <Route exact path="/" component={Home}/> <Route path="/about" component={About}/> </Switch> </Suspense> </Router> ) |
6.命名导出
React.lazy
目前只支持默认导出(default exports)- 如果你想被引入的模块使用命名导出(named exports),你可以创建一个中间模块,来重新导出为默认模块。
123// ManyComponents.jsexport const MyComponent = /* ... */export const MyUnusedComponent = /* ... */
12// MyComponent.jsexport { MyComponent as default } from "./ManyComponents.js"
123// MyApp.jsimport React, { lazy } from 'react'const MyComponent = lazy(() => import("./MyComponent.js"))