React服务端渲染(总结)

React服务端渲染是指把React组件在服务端渲染成HTML字符串,然后再把这些HTML字符串发送给客户端展示,这种渲染方式能够在很大程度上提升页面的渲染速度和SEO友好性。

下面我们将详细讲解React服务端渲染的完整攻略,它主要包括以下步骤:

步骤一:安装依赖

首先,我们需要安装React和React DOM以及相关的babel插件:

npm install react react-dom @babel/core @babel/preset-react babel-loader express

其中,@babel/preset-react 主要用于将JSX编译成JavaScript代码。

步骤二:创建服务端文件

接着,我们需要在项目根目录下创建一个 server.js 文件,用于处理服务端渲染的逻辑。代码如下:

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

const server = express();
server.use(express.static('public'));

server.get('/', (req, res) => {
  const app = ReactDOMServer.renderToString(<App />);
  res.send(`
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8">
        <title>React SSR</title>
      </head>
      <body>
        <div id="root">${app}</div>
        <script src="./bundle.js"></script>
      </body>
    </html>
  `);
});

server.listen(8080, () => {
  console.log('Server is running on http://localhost:8080');
});

这段代码首先会使用 express 创建一个 HTTP 服务器,并且将 public 目录暴露出来,之后,我们使用 ReactDOMServer.renderToString() 方法将 App 组件渲染成 HTML 字符串。

最后,我们将生成的 HTML 字符串插入到 HTML 模板中,最终返回给客户端。需要注意的是,我们还需要在 HTML 模板中添加置入客户端代码的占位符。

步骤三:创建客户端文件

在创建了服务端文件后,我们还需要创建一个客户端文件,用于渲染 React 组件并附加事件等逻辑。代码如下:

import React from 'react';
import ReactDOM from 'react-dom';
import App from './src/App';

ReactDOM.hydrate(<App />, document.getElementById('root'));

这里,我们使用 ReactDOM.hydrate() 方法对 App 组件进行渲染,同时还需要将其插入到服务端渲染生成的 HTML 文件中,之后再将生成的 JS 文件引入到 HTML 模板中。

步骤四:配置打包工具和脚本

最后,我们还需要配置打包工具和脚本,使得我们的服务端代码和客户端代码能够打包成单独的文件并在启动时正确加载。这里以 webpack 为例,示例代码如下:

const path = require('path');

module.exports = {
  mode: 'production',
  entry: './index.js',
  output: {
   path: path.resolve(__dirname, 'public'),
   filename: 'bundle.js'
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /(node_modules|bower_components)/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-react'],
          },
        },
      },
    ],
  },
};

再用如下 script 命令来启动打包:

npx webpack --config webpack.config.js

至此,我们的 React 服务端渲染应用已经完成了,可以使用 npm start 启动项目并在浏览器中访问 http://localhost:8080 进行查看。

下面以 React服务端渲染购物车为例,进行演示:

示例一:购物车列表页

服务端代码:

import express from 'express';
import React from 'react';
import ReactDOMServer from 'react-dom/server';
import App from './src/App';
import path from 'path';
import fs from 'fs';

const server = express();

server.use(express.static(path.resolve(__dirname, '..', 'build')));

server.get('/', (req, res) => {
  const app = ReactDOMServer.renderToString(<App />);
  const html = fs.readFileSync(
    path.resolve(__dirname, '..', 'build', 'index.html'),
    'utf-8'
  );

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

server.listen(8080, () => {
 console.log('Server is running on http://localhost:8080');
});

客户端代码:

import React from 'react';
import ReactDOM from 'react-dom';
import App from './src/App';

ReactDOM.hydrate(<App />, document.getElementById('root'));

示例二:购物车详情页

服务端代码:

import express from 'express';
import React from 'react';
import ReactDOMServer from 'react-dom/server';
import App from './src/Detail';
import path from 'path';
import fs from 'fs';

const server = express();

server.use(express.static(path.resolve(__dirname, '..', 'build')));

server.get('/:id', (req, res) => {
  const app = ReactDOMServer.renderToString(<App id={req.params.id} />);
  const html = fs.readFileSync(
    path.resolve(__dirname, '..', 'build', 'index.html'),
    'utf-8'
  );

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

server.listen(8080, () => {
 console.log('Server is running on http://localhost:8080');
});

客户端代码:

import React from 'react';
import ReactDOM from 'react-dom';
import Detail from './src/Detail';

ReactDOM.hydrate(<Detail id={window.__PRELOADED_STATE__.id} />, document.getElementById('root'));

此外,还需要在服务端代码中增加对静态资源的处理。这里我们使用了 Express 框架提供的 express.static() 方法,将构建好的静态资源目录(build)暴露给客户端。

server.use(express.static(path.resolve(__dirname, '..', 'build')));

以上就是React服务端渲染的完整攻略,并且包含了两个示例的说明,供大家进行参考。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:React服务端渲染(总结) - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • Vue3渲染器与编译器深入浅析

    Vue3渲染器与编译器深入浅析 什么是Vue3渲染器与编译器? Vue3渲染器与编译器是Vue3的核心组件,负责将Vue3定义的模板语法,解析成浏览器可以理解的JavaScript代码,并将解析出来的JavaScript代码渲染到视图中。Vue3通过优化渲染器和编译器的性能,提高了Vue3的性能表现。 Vue3渲染器的工作原理 Vue3渲染器的工作原理可以简…

    node js 2023年6月8日
    00
  • Node.js Express安装与使用教程

    Node.js Express安装与使用教程 概述 Node.js Express是一个流行的Web应用开发框架,可以用来快速构建Web应用、API和单页应用程序。本教程将介绍如何安装和使用Node.js Express框架。 安装 Node.js 首先需要安装Node.js,可以在Node.js官网下载适合自己系统的安装包,或者使用命令行安装: # Ubu…

    node js 2023年6月8日
    00
  • Node.js 日志处理模块log4js

    Node.js 日志处理模块log4js是一个流行的日志库,可用于记录应用程序的日志。 下面是使用log4js的完整攻略: 1. 安装log4js 使用以下npm命令安装log4js:npm install log4js –save 2. 配置log4js 创建一个名为log4js.json的配置文件(或者是一个JavaScript模块),定义日志的输出和…

    node js 2023年6月8日
    00
  • 如何在CocosCreator中使用JSZip压缩

    下面是详细讲解如何在CocosCreator中使用JSZip压缩的完整攻略: 准备工作 在开始之前,我们需要先准备以下工作: 下载JSZip库文件 点击这里进入JSZip的github页面:https://github.com/Stuk/jszip 点击页面右侧的“Clone or download”按钮,选择“Download ZIP”下载JSZip的代码…

    node js 2023年6月8日
    00
  • Vite + React从零开始搭建一个开源组件库

    下面是详细讲解“Vite + React从零开始搭建一个开源组件库”的完整攻略。 一、前置知识 在学习“Vite + React从零开始搭建一个开源组件库”之前,需要具备以下知识: 基础的HTML、CSS、JavaScript的知识 熟悉React框架及其生态圈 熟悉ES6语法以及模块化编程思想 熟悉npm包管理工具 熟悉Git版本控制工具 二、搭建项目 1…

    node js 2023年6月9日
    00
  • 纯异步nodejs文件夹(目录)复制功能

    下面是“纯异步nodejs文件夹(目录)复制功能”的完整攻略。 一、了解异步编程 在介绍纯异步nodejs文件夹(目录)复制功能之前,需要先了解一下异步编程。 异步编程是指在一个执行单元(A)中调用另一个执行单元(B),而在B执行的同时,执行单元A可以继续执行,不必等待B完成。这种编程方式在Node.js中非常常见,因为Node.js处理大量I/O(输入输出…

    node js 2023年6月8日
    00
  • 利用VS Code开发你的第一个AngularJS 2应用程序

    以下是利用VS Code开发AngularJS 2应用程序的完整攻略: 背景介绍 AngularJS 2是一个强大的前端框架,在现代Web开发中被广泛使用。VS Code是一个轻量级的代码编辑器,支持很多编程语言,适合前端开发人员。在本攻略中,我们将介绍如何使用VS Code为AngularJS 2开发一个简单的应用程序。 环境准备 Node.js的安装:我…

    node js 2023年6月8日
    00
  • 详解基于Node.js的HTTP/2 Server实践

    详解基于Node.js的HTTP/2 Server实践 前言 HTTP/2是浏览器最新的协议,比HTTP/1.1更快、更高效。Node.js天然支持HTTP/2协议,并且使用起来也非常容易。本文将讲解如何使用Node.js创建基于HTTP/2协议的服务器。 实现步骤 创建Node.js项目:首先,需要创建一个新的Node.js项目。在终端进入到你创建项目的路…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部