我的编程空间,编程开发者的网络收藏夹
学习永远不晚

react服务器渲染的示例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

react服务器渲染的示例分析

这篇文章给大家分享的是有关react服务器渲染的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

前言

本文是基于react ssr的入门教程,在实际项目中使用还需要做更多的配置和优化,比较适合第一次尝试react ssr的小伙伴们。技术涉及到 koa2 + react,案例使用create-react-app创建

SSR 介绍

Server Slide Rendering,缩写为 ssr 即服务器端渲染,这个要从SEO说起,目前react单页应用HTML代码是下面这样的

<!DOCTYPE html>
<html lang="en">
 <head>
  <meta charset="utf-8" />
  <link rel="shortcut icon" href="favicon.ico" rel="external nofollow" />
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/>
  <meta name="theme-color" content="#000000" />
  <title>React App</title>
 </head>
 <body>
  <noscript>You need to enable JavaScript to run this app.</noscript>
  <div id="root"></div>
  <script class="lazy" data-src="/js/main.js"></script>
 </body>
</html>
  1. 如果main.js 加载比较慢,会出现白屏一闪的现象。

  2. 传统的搜索引擎爬虫因为不能抓取JS生成后的内容,遇到单页web项目,抓取到的内容啥也没有。在SEO上会吃很多亏,很难排搜索引擎到前面去。

React SSR(react服务器渲染)正好解决了这2个问题。

React SSR介绍

这里通过一个例子来带大家入坑!先使用create-react-app创建一个react项目。因为要修改webpack,这里我们使用react-app-rewired启动项目。根目录创建一个server目录存放服务端代码,服务端代码我们这里使用koa2。目录结构如下:

react服务器渲染的示例分析

这里先来看看react ssr是怎么工作的。

react服务器渲染的示例分析

这个业务流程图比较清晰了,服务端只生成HTML代码,实际上前端会生成一份main.js提供给服务端的HTML使用。这就是react ssr的工作流程。有了这个图会更好的理解,如果这个业务没理解清楚,后面的估计很难理解。

react提供的SSR方法有两个renderToString 和 renderToStaticMarkup,区别如下:
  • renderToString 方法渲染的时候带有 data-reactid 属性. 在浏览器访问页面的时候,main.js能识别到HTML的内容,不会执行React.createElement二次创建DOM。

  • renderToStaticMarkup 则没有 data-reactid 属性,页面看上去干净点。在浏览器访问页面的时候,main.js不能识别到HTML内容,会执行main.js里面的React.createElement方法重新创建DOM。

实现流程

好了,我们都知道原理了,可以开始coding了,目录结构如下:

react服务器渲染的示例分析

create-react-app 的demo我没动过,直接用这个做案例了,前端项目基本上就没改了,等会儿我们服务器端要使用这个模块。代码如下:

 render() {
  return (
   <div className="App">
    <header className="App-header">
     <img class="lazy" data-src={logo} className="App-logo" alt="logo" />
     <p>
      Edit <code>class="lazy" data-src/App.js</code> and save to reload.
     </p>
     <a
      className="App-link"
      href="https://reactjs.org" rel="external nofollow" 
      target="_blank"
      rel="noopener noreferrer"
     >
      Learn React
     </a>
    </header>
   </div>
  );
 }
}

export default App;

在项目中新建server目录,用于存放服务端代码。为了简化,我这里只有2个文件,项目中我们用的ES6,所以还要配置下.babelrc

react服务器渲染的示例分析

.babelrc 配置,因为要使用到ES6
{
  "presets": [
    "env",
    "react"
  ],
  "plugins": [
    "transform-decorators-legacy",
    "transform-runtime",
    "react-hot-loader/babel",
    "add-module-exports",
    "transform-object-rest-spread",
    "transform-class-properties",
    [
      "import",
      {
        "libraryName": "antd",
        "style": true
      }
    ]
  ]
}
index.js 项目入口做一些预处理,使用asset-require-hook过滤掉一些类似 import logo from "./logo.svg"; 这样的资源代码。因为我们服务端只需要纯的HTML代码,不过滤掉会报错。这里的name,我们是去掉了hash值的
require("asset-require-hook")({
 extensions: ["svg", "css", "less", "jpg", "png", "gif"],
 name: '/static/media/[name].[ext]'
});
require("babel-core/register")();
require("babel-polyfill");
require("./app");
public/index.html html模版代码要做个调整,{{root}} 这个可以是任何可以替换的字符串,等下服务端会替换这段字符串。
<!DOCTYPE html>
<html lang="en">
 <head>
  <meta charset="utf-8" />
  <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico" rel="external nofollow" />
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/>
  <meta name="theme-color" content="#000000" />
  <link rel="manifest" href="%PUBLIC_URL%/manifest.json" rel="external nofollow" />
  <title>React App</title>
 </head>
 <body>
  <noscript>You need to enable JavaScript to run this app.</noscript>
  <div id="root">{{root}}</div>
 </body>
</html>
app.js 服务端渲染的主要代码,加载App.js,使用renderToString 生成html代码,去替换掉 index.html 中的 {{root}} 部分
import App from '../class="lazy" data-src/App';
import Koa from 'koa';
import React from 'react';
import Router from 'koa-router';
import fs from 'fs';
import koaStatic from 'koa-static';
import path from 'path';
import { renderToString } from 'react-dom/server';

// 配置文件
const config = {
 port: 3030
};

// 实例化 koa
const app = new Koa();

// 静态资源
app.use(
 koaStatic(path.join(__dirname, '../build'), {
  maxage: 365 * 24 * 60 * 1000,
  index: 'root' 
  // 这里配置不要写成'index'就可以了,因为在访问localhost:3030时,不能让服务默认去加载index.html文件,这里很容易掉进坑。
 })
);

// 设置路由
app.use(
 new Router()
  .get('*', async (ctx, next) => {
   ctx.response.type = 'html'; //指定content type
   let shtml = '';
   await new Promise((resolve, reject) => {
    fs.readFile(path.join(__dirname, '../build/index.html'), 'utfa8', function(err, data) {
     if (err) {
      reject();
      return console.log(err);
     }
     shtml = data;
     resolve();
    });
   });
   // 替换掉 {{root}} 为我们生成后的HTML
   ctx.response.body = shtml.replace('{{root}}', renderToString(<App />));
  })
  .routes()
);

app.listen(config.port, function() {
 console.log('服务器启动,监听 port: ' + config.port + ' running~');
});
config-overrides.js 因为我们用的是create-react-app,这里使用react-app-rewired去改下webpack的配置。因为执行npm run build的时候会自动给资源加了hash值,而这个hash值,我们在asset-require-hook的时候去掉了hash值,配置里面需要改下,不然会出现图片不显示的问题,这里也是一个坑,要注意下。
module.exports = {
 webpack: function(config, env) {
  // ...add your webpack config
  // console.log(JSON.stringify(config));
  // 去掉hash值,解决asset-require-hook资源问题
  config.module.rules.forEach(d => {
   d.oneOf &&
    d.oneOf.forEach(e => {
     if (e && e.options && e.options.name) {
      e.options.name = e.options.name.replace('[hash:8].', '');
     }
    });
  });
  return config;
 }
};

好了,所有的代码就这些了,是不是很简单了?我们koa2读取的静态资源是 build目录下面的。先执行npm run build打包项目,再执行node ./server 启动服务端项目。看下http://localhost:3030页面的HTML代码检查下:

react服务器渲染的示例分析

react服务器渲染的示例分析
没有{{root}}了,服务器渲染成功!

感谢各位的阅读!关于“react服务器渲染的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

react服务器渲染的示例分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

React条件渲染实例分析

本篇内容介绍了“React条件渲染实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!条件渲染可以将一个数组内的所有数据依次展示在界面上,
2023-06-27

浏览器渲染的示例分析

这篇文章将为大家详细讲解有关浏览器渲染的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。浏览器渲染1.浏览器渲染图解浏览器渲染页面主要经历了下面的步骤:1.处理 HTML 标记并构建 DOM 树。2
2023-06-15

Vue中条件渲染和列表渲染的示例分析

这篇文章将为大家详细讲解有关Vue中条件渲染和列表渲染的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言什么是条件渲染?在我们的页面中会有很多这样的应用场景,比如说我们今天要上架一个活动,这个活
2023-06-25

vue3中渲染系统的示例分析

这篇文章给大家分享的是有关vue3中渲染系统的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。思考在开始今天的文章之前,大家可以想一下:vue文件是如何转换成DOM节点,并渲染到浏览器上的?数据更新时,整个
2023-06-22

编程热搜

目录