React服务端渲染(总结)

yizhihongxing

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日

相关文章

  • ES6标准 Arrow Function(箭头函数=>)

    ES6标准 Arrow Function(箭头函数=>)攻略 ES6标准 Arrow Function是一个非常实用的函数特性,它能够简化函数定义的写法,同时提高代码可读性。本文将为您详细讲解 Arrow Function 的语法、作用、适用场景和注意事项。 Arrow Function 的语法 Arrow Function 的语法结构为: (para…

    node js 2023年6月8日
    00
  • nest.js,egg.js,midway,express,koa的区别小结

    这是一篇关于几个Node.js的框架的区别小结的攻略。这里我们将会对Nest.js、Egg.js、Midway、Express和Koa几个框架进行比较,并从不同的角度去探讨它们的各自优势和适用场景。 Nest.js 架构风格:基于Angular开发的服务端MVC框架,基于模块化和依赖注入的理念。 优势: 具有很好的可扩展性和可维护性。 内置了丰富的功能模块,…

    node js 2023年6月8日
    00
  • npm ERR!Cannot read properties of null(reading ‘pickAlgorithm’)报错问题解决

    当你在使用npm包管理器或执行npm命令时,有时候你会遇到“npm ERR!Cannot read properties of null(reading ‘pickAlgorithm’)”这个错误提示,这是一个常见的npm错误。 这个错误提示通常说明你在使用npm包管理器时,执行了某个npm命令,但是在执行这个命令的过程中,出现了问题,可能是由于某些npm配…

    node js 2023年6月8日
    00
  • node.js制作一个简单的登录拦截器

    下面是node.js制作一个简单的登录拦截器的完整攻略: 什么是登录拦截器 登录拦截器是一种常用的认证机制,用于对各种应用程序进行安全性验证,以防止未经授权的用户进入应用程序。在Node.js中,我们可以通过编写一个中间件来实现这一功能。 如何制作一个登录拦截器 以下是制作一个登录拦截器的步骤: 配置 Express 应用程序 const express =…

    node js 2023年6月8日
    00
  • pm2发布node配置文件ecosystem.json详解

    下面是pm2发布node配置文件ecosystem.json的完整攻略: 概述 PM2是一个流程管理工具,它可以帮助我们管理运行在服务器上的Node.js应用程序。通过使用PM2,我们可以轻松地启动、停止、重启、添加和监视应用程序。为了方便管理,可以将应用程序的配置文件编写成一个名为ecosystem.json的JSON文件,以描述应用程序的基本信息。 步骤…

    node js 2023年6月8日
    00
  • 使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目

    关于“使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目”的完整攻略,我们可以分为以下几个部分来进行讲解。 I. 环境准备 首先,需要安装Node.js,并且建议安装最新版本。在安装完成之后,我们可以打开终端(Command Prompt或者Terminal),输入以下命令: npm install -g grunt-cli 这个命令…

    node js 2023年6月8日
    00
  • js获取html页面节点方法(递归方式)

    当我们需要获取页面内的某个节点时,我们可以使用JavaScript对DOM树进行遍历,找到目标节点并返回。递归是一种逐级下降的方式,在DOM树上寻找目标节点。下面是详细的攻略: 核心思路 判断当前节点是否是目标节点,是的话则返回该节点 不是目标节点则遍历该节点的所有子节点,并依次调用自己,直到找到目标节点或子节点均为null时停止递归。 代码实现 funct…

    node js 2023年6月8日
    00
  • 红黑树的插入详解及Javascript实现方法示例

    下面是关于“红黑树的插入详解及Javascript实现方法示例”的完整攻略: 红黑树的插入详解及Javascript实现方法示例 什么是红黑树? 红黑树是一种自平衡的二叉搜索树,被广泛应用于各种计算机科学领域,例如操作系统、数据库和编译器等。它的性能非常优秀,在最坏情况下,时间复杂度为O(log n)。 红黑树的每个节点都有一个颜色,可能是红色或黑色。同时,…

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