代码分割(精读React官方文档—14)

简介: 代码分割(精读React官方文档—14)

这是我参与更文挑战的第28天,活动详情查看:更文挑战

打包

官方描述:大多数 React 应用都会使用 Webpack,Rollup 或 Browserify 这类的构建工具来打包文件。打包是一个将文件引入并合并到一个单独文件的过程,最终形成一个 “bundle”。接着在页面上引入该 bundle,整个应用即可一次性加载。

实例:打包前文件和打包后文件对比

  • 打包前
// app.js
import { add } from './math.js';
console.log(add(16, 26)); // 42
复制代码
// math.js
export function add(a, b) {
  return a + b;
}
复制代码
  • 打包后
function add(a, b) {
  return a + b;
}
console.log(add(16, 26)); // 42
复制代码

代码分割

打包应该注意的问题:

  1. 随着应用体积的增加,避免因为体积过大而导致加载过慢的问题。
  2. Webapck等构建工具是支持代码分割的。
  3. 代码分割能够懒加载用户所需要的内容,能显著的提高应用的性能。
  4. 尽管没有减少应用整体的代码体积,但是避免了加载用户永远不需要的代码,减少了所需的代码量。

import()

官方描述:引入代码分割的最佳方式是通过动态import语法。

  • 使用之前
import { add } from './math';
console.log(add(16, 26));
复制代码
  • 使用之后
import("./math").then(math => {
  console.log(math.add(16, 26));
});
复制代码

解读

  1. 当Webpack解析到该语法的时候,会进行自动的代码分割。
  2. 如果你是使用的create-react-app等脚手架的情况下,该功能开箱即用。
  3. 当自己配置Webpack或者Babel的时候,需要根据相关配置文件进行操作。

React.lazy

React.lazy函数能让你像渲染常规这件一样处理动态引入。

  • 使用之前
import OtherComponent from './OtherComponent';
复制代码
  • 使用之后
const OtherComponent = React.lazy(() => import('./OtherComponent'));
复制代码

上面的代码将会在组件首次渲染的时候,自动导入包含OtherComponent的组件,React.lazy接收一个函数,这个函数动态调用import并返回一个Promise,该Promise需要resolve一个default export 的组件。然后应在Suspense组件中渲染lazy组件。

import React, { Suspense } from 'react';
const OtherComponent = React.lazy(() => import('./OtherComponent'));
function MyComponent() {
  return (
    <div>
      <Suspense fallback={<div>Loading...</div>}>
        <OtherComponent />
      </Suspense>
    </div>
  );
}
复制代码

解读

  1. fallback属性中可以接收任何在组件加载过程中想要展示的React组件。
  2. 可以将Suspense组件至于懒加载组件之上的任何位置。
  3. 可以用一个Suspense组件包裹多个懒加载组件。
import React, { Suspense } from 'react';
const OtherComponent = React.lazy(() => import('./OtherComponent'));
const AnotherComponent = React.lazy(() => import('./AnotherComponent'));
function MyComponent() {
  return (
    <div>
      <Suspense fallback={<div>Loading...</div>}>
        <section>
          <OtherComponent />
          <AnotherComponent />
        </section>
      </Suspense>
    </div>
  );
}
复制代码

异常捕获边界

为什么需要异常捕获边界?

  • 因为一旦模块加载失败,会触发一个错误,我们可以通过异常捕获边界技术来处理这些情况,以显示良好的用户体验。

解读

解决这个问题的本质还是通过Supense和React.lazy进行结合。

import 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>
);
复制代码

基于路由的代码分割

  1. 如何选择代码分割的位置,需要考虑代码分割不能影响用户的体验。
  2. 一般选择从路由开始进行分割。

基于路由的分割实例

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>
);
复制代码

命名导出

React.lazy目前只支持默认导出,如果想让其支持命名导出,可以考虑创建一个中间模块。

第一步:分别暴露组件地址

// 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官方文档!


相关文章
|
6月前
|
监控 前端开发 API
React代码在电脑监控软件开发中的应用
这篇文章除了介绍React在电脑监控软件开发中的应用,还展示了如何通过组件化构建监控界面,如`MonitorDashboard`、`StatusWidget`和`ActivityLog`组件。文章强调了React的生命周期方法和Hooks在实时数据获取和显示中的作用,如`SystemStatus`组件的`useEffect`钩子。此外,还讲解了如何监听和记录用户行为的`UserActivity`组件,以及利用axios自动提交监控数据的`DataSubmitter`组件。React的这些特性使得开发高效、响应式的监控软件变得更加便捷。
98 8
|
1月前
|
资源调度 前端开发 Android开发
如何在 React Native 中进行代码签名验证?
如何在 React Native 中进行代码签名验证?
|
3月前
|
前端开发 JavaScript 区块链
react18函数组件+antd使用指南-使用代码集合以及报错记录汇总
本文介绍了多个React开发中常见的问题及其解决方案,包括但不限于:1)`useForm`实例未连接到任何`Form`元素的警告及解决方法;2)监听页面滚动事件的实现方式;3)React 18与antd 5.8.6中定制主题的方法;4)React结合antd 4.x版本自定义主题色的步骤;5)解决`ResizeObserver loop`相关报错的技巧;6)处理React设计表单时遇到的CDN资源加载失败问题;7)解决onClick事件传参问题;8)修复类型错误等。每部分均提供详细分析与实用代码示例,帮助开发者快速定位并解决问题。
64 2
|
4月前
|
开发者 搜索推荐 Java
超越传统:JSF自定义标签库如何成为现代Web开发的个性化引擎
【8月更文挑战第31天】JavaServer Faces(JSF)框架支持通过自定义标签库扩展其内置组件,以满足特定业务需求。这涉及创建`.taglib`文件定义标签库及组件,并实现对应的Java类与渲染器。本文介绍如何构建和应用JSF自定义标签库,包括定义标签库、实现标签类与渲染器逻辑,以及在JSF页面中使用这些自定义标签,从而提升代码复用性和可维护性,助力开发更复杂且个性化的Web应用。
79 0
|
4月前
|
前端开发 测试技术 UED
React性能优化的神奇之处:如何用懒加载与代码分割让你的项目一鸣惊人?
【8月更文挑战第31天】在现代Web开发中,性能优化至关重要。本文探讨了React中的懒加载与代码分割技术,通过示例展示了如何在实际项目中应用这些技术。懒加载能够延迟加载组件,提高页面加载速度;代码分割则将应用程序代码分割成多个块,按需加载。两者结合使用,可以显著提升用户体验。遵循合理使用懒加载、编写测试及关注性能等最佳实践,能够更高效地进行性能优化,提升应用程序的整体表现。随着React生态的发展,懒加载与代码分割技术将在未来Web开发中发挥更大作用。
55 0
|
4月前
|
前端开发 UED 开发者
React.lazy()与Suspense:实现按需加载的动态组件——深入理解代码分割、提升首屏速度和优化用户体验的关键技术
【8月更文挑战第31天】在现代Web应用中,性能优化至关重要,特别是减少首屏加载时间和提升用户交互体验。React.lazy()和Suspense组件提供了一种优雅的解决方案,允许按需加载组件,仅在需要渲染时加载相应代码块,从而加快页面展示速度。Suspense组件在组件加载期间显示备选内容,确保了平滑的加载过渡。
168 0
|
4月前
|
XML 前端开发 JavaScript
【React新手必看】JSX,让你的代码舞动起来!
【8月更文挑战第24天】JSX(JavaScript XML)是React开发的核心,作为一种JavaScript语法扩展,它支持在代码中使用类似HTML的标签。JSX并非模板语言,在编译过程中转换为纯JavaScript,使React能高效更新DOM并渲染页面。其优势在于直观性、简洁性和灵活性:简化复杂用户界面构建、减少代码量,并支持HTML标签、React组件及JavaScript变量的表达式插入。基本用法涉及定义组件UI,如创建包含标题和段落的简单组件。
95 0
|
5月前
|
前端开发
React官网 - 井字棋 - 游戏改进参考答案(含汉化和完整范例代码)
React官网 - 井字棋 - 游戏改进参考答案(含汉化和完整范例代码)
48 1
|
7月前
|
设计模式 前端开发 API
写出易维护的代码|React开发的设计模式及原则
本文对React社区里出现过的一些设计模式进行了介绍,并讲解了他们遵循的设计原则。
|
7月前
|
前端开发 JavaScript 定位技术
Docusaurus框架——react+antd+echarts自定义mdx生成图表代码解释文档
Docusaurus框架——react+antd+echarts自定义mdx生成图表代码解释文档
690 0