React 源码解析(四)

React 源码解析(四)

十一、React 中的代码分割与懒加载

  1. 代码分割的方式
    • 动态 import():这是一种基于 ES2020 动态导入语法实现代码分割的方式。在 React 中,我们可以在函数组件内使用动态 import() 来实现组件的懒加载。例如:

import React, { lazy, Suspense } from'react';

const SomeComponent = lazy(() => import('./SomeComponent'));

function App() {
    return (
        <Suspense fallback={<div>Loading...</div>}>
            <SomeComponent />
        </Suspense>
    );
}
  • 这里 lazy 函数接受一个返回动态 import() 的函数,它会告诉 React 该组件应该被懒加载。Suspense 组件用于在组件加载过程中显示一个加载指示器(fallback 属性指定)。当 SomeComponent 首次被渲染时,才会触发 import('./SomeComponent'),从而实现代码分割,只有在需要时才加载该组件的代码。
  • Webpack 的 splitChunks:Webpack 是 React 项目中常用的打包工具,splitChunks 是 Webpack 提供的一种代码分割配置选项。通过配置 splitChunks,可以将第三方库、公共代码等分离出来,形成单独的 chunk 文件。例如:

module.exports = {
    optimization: {
        splitChunks: {
            chunks: 'all'
        }
    }
};
  • chunks: 'all' 表示对所有类型的 chunks(initialasyncall)都进行代码分割。这样配置后,Webpack 会自动分析项目中的依赖关系,将重复的模块提取到单独的文件中,避免在多个 chunk 文件中重复包含相同的代码,从而减小整体的打包体积。
  1. 懒加载的原理与优势
    • 原理:懒加载的核心原理是延迟组件的加载和渲染,直到真正需要使用该组件时才进行加载。在 React 中,通过动态 import() 实现懒加载时,当 lazy 组件首次渲染,JavaScript 引擎会执行动态 import() 返回的 Promise。这个 Promise 被解析时,会加载对应的组件代码。在加载过程中,Suspense 组件会显示加载指示器。当组件代码加载完成并解析后,React 会渲染该组件。
    • 优势
      • 提高应用加载速度:通过懒加载,初始加载时只需要加载必要的代码,减少了初始 bundle 的大小,加快了页面的首次渲染速度。例如,对于一个大型的单页应用,有一些不常用的功能模块(如用户设置页面的某个高级设置子组件),如果不进行懒加载,这些模块的代码会在应用启动时就被加载,增加了加载时间。而使用懒加载,只有当用户进入到相关页面时才会加载这些模块的代码。
      • 优化用户体验:对于用户很少访问的部分,不占用初始加载资源,使得应用在启动时更加流畅。同时,加载指示器(Suspense 组件的 fallback)能让用户知道应用正在加载内容,避免用户因为等待而产生困惑。

十二、React 与服务器端渲染(SSR)

  1. SSR 的基本概念与流程
    • 基本概念:服务器端渲染是指在服务器端将 React 组件渲染为 HTML 字符串,然后将这个 HTML 发送到客户端。客户端在接收到 HTML 后,可以直接呈现页面内容,之后再通过 React 激活(hydration)过程,将静态的 HTML 转换为可交互的 React 应用。这样做的主要目的是提高应用的初始加载速度和 SEO 性能,因为搜索引擎爬虫可以直接获取到服务器渲染好的 HTML 内容。
    • 流程
      • 服务器端渲染阶段:服务器接收到请求后,使用 React 相关的库(如 Next.js 或 Gatsby 等框架提供的 SSR 功能)将 React 应用渲染为 HTML。在这个过程中,可能会涉及到数据获取,例如从数据库中获取文章内容用于渲染博客页面。服务器将渲染好的 HTML 以及相关的状态数据(如 Redux 的 store 数据,如果应用使用了 Redux)发送给客户端。
      • 客户端激活阶段:客户端接收到服务器发送的 HTML 后,首先会展示页面内容。然后 React 会在客户端运行,将服务器渲染的静态 HTML 与客户端的 JavaScript 代码进行 “hydration”。这个过程中,React 会重新创建组件树,并将事件处理等交互功能添加到页面上,使页面成为一个可交互的 React 应用。
  2. SSR 在 React 框架中的实现(以 Next.js 为例)
    • 页面预渲染:Next.js 提供了两种预渲染模式:静态生成(Static Generation)和服务器端渲染(Server – Side Rendering,SSR)。对于静态生成,在构建时(next build),Next.js 会将页面渲染为静态 HTML 文件。例如,对于一个博客文章列表页面,Next.js 可以在构建时从数据库中获取文章列表数据,并将页面渲染为静态 HTML。对于服务器端渲染,在每次请求时,服务器会实时渲染页面。例如,对于一个需要根据用户登录状态显示不同内容的页面,可以使用 SSR,在每次请求时获取用户登录状态并渲染相应的页面。
    • 数据获取:Next.js 提供了 getStaticProps 和 getServerSideProps 等函数来方便地进行数据获取。getStaticProps 用于在构建时获取数据,适用于数据变化不频繁的情况,例如博客文章内容。getServerSideProps 用于在每次请求时获取数据,适用于数据需要实时更新的情况,例如获取当前用户的实时订单数量。例如:

export async function getStaticProps() {
    const response = await fetch('https://example.com/api/articles');
    const articles = await response.json();
    return {
        props: {
            articles
        },
        revalidate: 60 // 可选,用于增量静态再生,每 60 秒重新生成一次页面
    };
}

function ArticleList({ articles }) {
    return (
        <div>
            {articles.map(article => (
                <div key={article.id}>{article.title}</div>
            ))}
        </div>
    );
}

export default ArticleList;
  • 在上述代码中,getStaticProps 函数在构建时会获取文章数据,并将其作为 props 传递给 ArticleList 组件。

通过对代码分割与懒加载以及服务器端渲染的解析,我们进一步了解了 React 在优化应用加载性能、提升用户体验以及满足不同应用场景需求方面的实现方式和原理。这些技术对于构建高效、优质的 React 应用至关重要。

© 版权声明
THE END
喜欢就支持一下吧
点赞19 分享
评论 抢沙发

    暂无评论内容