使用 React 18 流式传输 SSR 的指南

React 18 引入了许多令人兴奋的变化和特性。这可能是您已经听说过很多的事情,并且有充分的理由。尽管稍微不那么引人注目,但在 React SSR 架构中也有一些非常令人兴奋的发展。要了解 React 18 带来的突破,必须查看整个时间线和导致它的增量步骤。

在我们深入研究 SSR 的前后对比之前,修复 Face ID 在 iPad 上不起作用的十大方法首先了解我们进行 SSR 的原因至关重要。特别是,我们将深入探讨它的重要性以及影响 React 团队决定改进其 SSR 架构的方式的各个方面。

在本文中,我们将仔细研究 SSR,iPhone 上 Notes 应用程序无法扫描文档的 5 个最佳修复因为对这个主题有一个基本的了解以及它与其他技术(最重要的客户端呈现 (CSR))的比较非常重要。不幸的是,我们无法在本文中涵盖所有内容,只会关注 React 18 上下文中 SSR 的重要方面。在 iPhone 上阻止垃圾电话的 7 种方法虽然不是绝对必要的,修复 iPhone 卡在搜索屏幕上的 6 大方法但我们建议您复习一下这个主题以充分利用它文章。

跳跃前进:

  • SSR 简介

  • (流媒体)SSR,反应前 18

  • 流式 SSR post-React 18组件Suspense_renderToPipeableStream应用程序接口引入选择性水合作用ReactDOMClient.hydrateRoot

SSR 简介

就其核心而言,实施 SSR 的最重要原因是:

  • 表现

  • 搜索引擎优化 (SEO)

  • 用户体验(UX)

本质上,存在使用 SSR 的 React 应用程序的特定渲染流程。6 种最佳修复电子邮件从 iPhone 上的邮件应用程序中消失的方法首先,服务器接管客户端获取所有数据并渲染整个 React 应用程序的责任。这样做之后,生成的 HTML 和 JavaScript 从服务器发送到客户端。最后,该客户端将 HTML 显示在屏幕上并将其与适当的 JavaScript 连接,这也称为水合过程。现在,如何在 iPhone、iPad 和 Mac 上设置应用限制客户端收到的是整个 HTML 结构,而不是它自己需要呈现的一大堆 JavaScript。

此流程的好处包括网络爬虫更容易访问以索引这些页面,修复 Apple Music 搜索在 iPhone 上不起作用的 8 种方法从而改进 SEO,并且客户端可以快速向用户显示生成的 HTML 而不是空白屏幕,从而改进 UX。因为所有的渲染都发生在服务端,客户端免除了这个职责,如何使用“查找我的 iPhone 和 iPad”:终极指南在低端设备场景下不会有成为瓶颈的风险,从而提高性能。

但是,所描述的设置只是 SSR 的起点。基于上面的实现方式,在性能和用户体验方面还有很多收获。考虑到这两个方面,让我们沿着 React SSR 记忆通道走一趟,WhatsApp 画中画在 iPhone 上不起作用的 5 个最佳修复深入研究 React 18 之前的问题,体验它随时间的演变,并了解 React 18 及其流功能如何改变一切。

(流媒体)SSR,反应前 18

在 React 18、Suspense或任何新的流功能存在之前,在 iPhone 和 iPad 上使用 Web 应用程序的指南React 中典型的 SSR 设置如下所示。虽然不同的实现可能会有细微差别,但大多数设置都遵循相似的架构。

// server/index.ts
import path from 'path';
import fs from 'fs';

import React from 'react';
import ReactDOMServer from 'react-dom/server';
import express from 'express';

import { App } from '../client/App';

const app = express();

app.get('/', (req, res) => {
    const appContent = ReactDOMServer.renderToString(<App />);
    const indexFile = path.resolve('./build/index.html');


    fs.readFile(indexFile, 'utf8', (err, data) => {
        if (err) {
                console.error('Something went wrong:', err);
                return res.status(500).send('Failed to load the app.');
        }

        return res.send(
                data.replace('<div id="root"></div>', `<div id="root">${app}</div>`)
        );
    });
});

app.use(express.static('./build'));

app.listen(8080, () => {
    console.log(`Server is listening on port ${PORT}`);
});

// build/index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <title>React App</title>
    <script src="main.js" async defer></script>
  </head>
  <body>
    <div id="root"></div>
  </body>
</html>

SSR 设置的最大部分是服务器,所以让我们从那里开始。在此示例中,我们使用 Express 启动服务器以build在端口 8080 上提供文件夹中的文件。如何在 iPhone 上转换单位、时区和货币当服务器在根 URL 接收到请求时,它将使用函数将 React 应用程序呈现为 HTML 字符串renderToStringfrom包裹ReactDOMServer。

然后需要将结果发送回客户端。但在此之前,如何手动或自动更新 iPhone 和 iPad 上的应用程序服务器需要用适当的 HTML 结构包围呈现的应用程序。为此,此示例在文件build夹中查找文件,将其导入,并将呈现的应用程序注入根元素:index.html

// client/index.ts
import React from "react";
import ReactDOM from 'react-dom';
import { App } from './App';

// Instead of `ReactDOM.render(...)`
ReactDOM.hydrate(<App />, document.getElementById('root'));

然后,需要在客户端进行的主要更改是它不必再呈现应用程序。

正如我们在上一步中看到的,应用程序已经由服务器呈现。修复 Windows 11 上 Steam 库黑屏问题的 7 种最佳方法所以现在,客户端只负责为应用程序补水。它通过使用函数而不是.ReactDOM.hydrateReactDOM.render

虽然这是 React SSR 的工作设置,如何从 Microsoft Edge 中删除必应聊天按钮但它在性能和 UX 方面仍然存在一些主要缺点:

  • 虽然服务器现在负责渲染 React 应用程序,但服务器端渲染的内容仍然是一大块 HTML,需要在渲染之前传输给客户端

  • 水合过程需要一次性完成,但组件只有在水合后才能进行交互,这意味着在水合完成之前用户无法与页面进行交互

最后,所有这些缺点都归结为当前的设置,NVIDIA 控制面板无法在 Windows 11 上打开的 7 个主要修复它仍然是从服务器到客户端的瀑布式方法。这创建了一个从一端到另一端的全有或全无流程:要么将整个 HTML 响应发送到客户端,要么所有数据都已完成提取以便服务器可以开始渲染,要么不发送整个应用程序是否水合,整个页面是否响应。

在 React 16 中,在现有的. 就设置和结果而言,修复 Android 的 Windows 子系统无法在 Windows 11 上运行的 7 种最佳方法除了此函数返回 Node.js 之外,这并没有太大变化。这允许服务器将 HTML 流式传输到客户端。renderToNodeStream server rendering functionrenderToStringReadableStream

app.get('/', (req, res) => {
    const endHTML = "</div></body></html>";
    const indexFile = path.resolve('./build/index.html');

    fs.readFile(indexFile, 'utf8', (err, data) => {
            if (err) {
              console.error('Something went wrong:', err);
              return res.status(500).send('Failed to load the app.');   
        }

        // Split the HTML where the React app should be injected and send the first part to the client
        const beginHTML = data.replace('</div></body></html>', '');
        res.write(beginHTML);


        // Render the application into a stream using `renderToNodeStream`  and pipe that into the response
        const appStream = ReactDOMServer.renderToNodeStream(<App />);
        appStream.pipe(res, { end: 'false' });


        // When the server is done rendering, send the rest of the HTML
        appStream.on('end', () => {
            response.end(endHTML);
        )};
    });  
});

这个新功能部分解决了我们描述的一个缺点;Google Chrome 无法在 Windows 11 上打开新标签页的 6 个最佳修复也就是说,它必须将 HTML 响应作为一个大 blob 从服务器传输到客户端。但是,服务器仍然需要等待生成整个 HTML 结构,如何在 Windows 11 中检查或更改注册所有者和组织名称然后才能开始向客户端传输任何内容。因此,它并没有真正解决我们描述的任何其他缺点。

现在,让我们看看 React 18 之后的情况以及新引入的功能以及它们如何解决这些缺点。

流式 SSR post-React 18

React 18 之后的 SSR 架构涉及几个不同的部分。修复 Discord 搜索在 Windows 上不起作用的 7 大方法这些都不能单枪匹马地解决我们描述的任何缺点,但它们的组合使魔法起作用。因此,修复 Windows 11 中 Google Chrome 中的 DNS_PROBE_FINISHED_NXDOMAIN 错误的 8 种最佳方法要完全了解整个设置,有必要研究所有这些设置以及它们的贡献。

组件Suspense_

这一切的核心是著名的。在 Windows 11 上卸载程序的 5 种快速方法它是通向我们将要描述的所有功能的主要途径,所以让我们从它开始吧。Suspense component

// client/src/SomeComponent.js
import { lazy, Suspense } from 'react';

const SomeInnerComponent = lazy(() => import('./SomeInnerComponent.js' /* webpackPrefetch: true */));

export default function SomeComponent() {
    // ...
    return (
        <Suspense fallback={<Spinner />}>
          <SomeInnerComponent />
        </Suspense>
    );
}

简而言之,Suspense 是一种让开发人员告诉 React 应用程序的某个部分正在等待数据的机制。与此同时,修复 Windows 11 中所有摄像头都保留错误的 7 大方法React 将在其位置显示一个后备 UI,并在数据准备就绪时更新它。

这听起来与以前的方法并没有太大不同,但从根本上说,它以一种更加优雅和集成的方式同步了 React 的渲染过程和数据获取过程。在 Windows 11 上访问控制面板的 7 种快速方法要了解有关详细信息的更多信息,请查看本 Suspense 指南。

TherenderToPipeableStreamAPI

为了理解剩余的连接拼图,我们将看一下React 团队在他们的工作组讨论React 18 之后的架构时提供的Suspense SSR 示例。

import ReactDOMServer from "react-dom/server";
import { App } from "../client/App";

app.get('/', (req, res) => {
    res.socket.on('error', (error) => console.log('Fatal', error));

    let didError = false;
    const stream = ReactDOMServer.renderToPipeableStream(
        <App />,
        {
            bootstrapScripts: ['/main.js'],
            onShellReady: () => {
                res.statusCode = didError ? 500 : 200;
                res.setHeader('Content-type', 'text/html');
                stream.pipe(res);
            },
            onError: (error) => {
                didError = true;
                console.log(error);
            } 
        }
    );
});

renderToPipeableStream与之前的设置相比,修复 Windows 11 笔记本电脑显示错误电池百分比的 6 大方法最显着的变化是在服务器端使用API。这是 React 18 中新引入的服务器渲染功能,它返回一个可管道化的 Node.js 流。虽然前一个renderToNodeStream不能等待数据并且会缓冲整个 HTML 内容直到流结束,但该renderToPipeableStream函数不受这些限制。

当边界上方的内容Suspense准备就绪时,onShellReady将调用回调。如果在此期间发生任何错误,它将反映在对客户端的响应中。然后,我们将通过将 HTML 管道传输到响应中,开始将 HTML 流式传输到客户端。


来自 LogRocket 的更多精彩文章:

  • 不要错过The Replay的精彩瞬间,这是一份来自 LogRocket 的精心策划的时事通讯

  • 了解LogRocket 的 Galileo 如何消除干扰以主动解决应用程序中的问题

  • 使用 React 的 useEffect来优化应用程序的性能

  • 在多个版本的 Node之间切换

  • 了解如何使用AnimXYZ 为您的 React 应用程序制作动画

  • 探索 Tauri,一个用于构建二进制文件的新框架

  • 比较NestJS 与 Express.js


之后,流将保持打开状态并将任何后续呈现的 HTML 块传输到客户端。DirectX 11 和 OpenGL 核心与以前的版本相比,这是最大的变化。

此渲染功能与服务端的Suspense 功能和代码拆分完全集成,从而实现了 SSR 的流式 HTML 功能。这解决了前面描述的 HTML 和数据获取的瀑布,Valorant:如何修复需要 DX11 功能级别 10.0 才能运行引擎错误因为应用程序可以根据数据需求递增地呈现和传输。React.lazy

// client/index.ts
import React from "react";
import ReactDOMClient from 'react-dom/client';
import { App } from './App';

// Instead of `ReactDOM.hydrate(...)`
ReactDOMClient.hydrateRoot(document.getElementById('root'), <App />);

引入选择性水合作用ReactDOMClient.hydrateRoot

在客户端,唯一需要改变的是应用程序在屏幕上的显示方式。如何修复 Windows 11 DirectX 错误?这里有6个解决方案!作为之前的替代品,React 团队在 React 18 中引入了一个新的。虽然变化很小,但它实现了许多改进和功能。对于我们的背景,如何修复 Fortnite 崩溃和技术问题最重要的是选择性水合作用。ReactDOM.hydrateReactDOMClient.hydrateRoot

如前所述,Suspense 根据数据需求将应用程序拆分为 HTML 块,而代码拆分将应用程序拆分为 JavaScript 块。选择性水化允许 React 将这些东西放在客户端上,并在不同的时间和优先级开始水化块。一旦接收到 HTML 和 JS 块,它就可以开始水化,如何在 Windows 10、11 中下载和更新 DirectX并优先处理用户与之交互的部分的水化队列。

这解决了我们剩下的两个瀑布问题:必须等待所有 JavaScript 加载才能开始水化,DirectX 12 与 DirectX 11:哪个最适合 PC 游戏?以及水化整个应用程序或不水化。

选择性混合和其他提到的特性的结合允许 React 在加载必要的 JavaScript 代码后立即开始混合,同时还能够根据优先级分别混合应用程序的不同部分。

下一步是什么?

React 18 是其 SSR 架构经过几个主要版本和多年微调的长期发展变化之上的樱桃。悬念和代码拆分是拼图的早期部分,但在 React 18 中引入流式 HTML 和选择性水合之前,修复:Valorant“运行引擎需要 DX11 功能级别 10.0”它们无法在服务器上发挥全部潜力。

为了帮助您了解这些变化是如何实现的,我们研究了 React 18 之前和之后的情况,探索了设置 SSR 的典型方法的代码示例,深入研究了 React SSR 架构面临的主要缺点,如何在 Windows 10 中卸载或重新安装 DirectX 12最后回顾了如何Suspense、代码拆分、流式 HTML 和选择性水合作用的组合解决了这些问题。

猜你喜欢

转载自blog.csdn.net/weixin_47967031/article/details/129958891
今日推荐