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日

相关文章

  • 带你了解NodeJS事件循环

    带你了解NodeJS事件循环 NodeJS中的事件循环是NodeJS异步编程的核心,非常重要。了解NodeJS事件循环对于编写高效的NodeJS程序至关重要。下面,本文将带你深入了解NodeJS事件循环的完整攻略。 NodeJS事件循环的基本原理 NodeJS事件循环的核心概念是事件循环(Single-threaded Event Loop)。NodeJS基…

    node js 2023年6月8日
    00
  • TypeScript获取二叉树的镜像实例

    让我来为您详细讲解“TypeScript获取二叉树的镜像实例”的完整攻略。 什么是二叉树的镜像 在计算机科学中,二叉树(Binary Tree)是一种树形结构,在二叉树中,每个节点最多有两个子节点。 如下图所示,它是一颗二叉树。 4 / \ 2 7 / \ / \ 1 3 6 9 “镜像”是指将一棵二叉树的左右子树镜像对称,如下图所示: 4 / \ 7 2 …

    node js 2023年6月8日
    00
  • 关于Sequelize连接查询时inlude中model和association的区别详解

    关于 Sequelize 连接查询时 include 中 model 和 association 的区别,需要说明的如下: 1. 区别说明 1.1 model 在 Sequelize 中,include 方法可以用来进行关联查询,当使用 include 方法时,需要传入的第一个参数是指定关联的模型。这个参数可以是一个 Sequelize 模型的实例,也可以是…

    node js 2023年6月8日
    00
  • 关于Node.js中Buffer的一些你可能不知道的用法

    关于Node.js中Buffer的一些你可能不知道的用法完整攻略如下: 简介 在Node.js中,Buffer是一个用于处理二进制数据的对象。在Buffer中,可以存储任意长度的数据,并且可以通过索引访问每个字节。 创建Buffer实例 Node.js中Buffer对象可以通过以下方式创建: // 创建指定长度的Buffer const buf1 = Buf…

    node js 2023年6月8日
    00
  • node运行js获得输出的三种方式示例详解

    关于”node运行js获得输出的三种方式示例详解”,我为您提供以下攻略。 1. Node.js 环境基础 在介绍三种方式之前,需要着重强调Node.js环境的必要性。Node.js环境是指运行JavaScript代码的环境,它是基于Google Chrome V8 引擎构建的一种开源的JavaScript运行环境。要在本机运行JavaScript代码,需要在…

    node js 2023年6月8日
    00
  • 利用node.js搭建简单web服务器的方法教程

    下面是详细讲解“利用node.js搭建简单web服务器的方法教程”的完整攻略。 准备工作 在开始之前,需要先安装node.js。安装完成后,可以通过以下命令来检查是否安装成功: node -v 如果返回了版本号,则说明安装成功。 创建项目文件夹 在电脑上创建一个新的文件夹,命名为”web-server”,然后进入该文件夹。 初始化项目 进入”web-serv…

    node js 2023年6月8日
    00
  • Node.js使用http模块实现后台服务器流程解析

    Node.js是一种基于事件驱动的异步I/O框架,拥有轻量级且高效的特点,在服务器端开发中使用较为广泛。使用Node.js作为后台服务器框架搭建网站,可以使用Node.js的http模块来处理客户端和服务端的请求。下面是如何使用http模块实现后台服务器的完整攻略: 一、安装Node.js 首先需要安装Node.js,可以到官网https://nodejs.…

    node js 2023年6月8日
    00
  • Node.js REPL (交互式解释器)实例详解

    Node.js REPL (交互式解释器)实例详解 什么是REPL REPL是一种编程语言解析器,它可以接受用户的输入,解释一条语句并立即执行,然后输出结果。REPL通常用于测试代码片段、学习语言概念以及进行快速原型设计。 Node.js REPL提供了一个交互式环境,通过命令行操作与Node.js交互,可以测试代码片段,进行调试和熟悉Node.js API…

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