react前后端同构渲染实例分享

前后端同构渲染当客户端请求一个包含react组件页面的时候,服务端首先响应输出这个页面,客户端和服务端有了第一次交互。然后,如果加载组件的过程需要向服务端发出ajax请求等,客户端和服务端又进行了一次交互,这样,耗时相对较长。前后端同构渲染可以在页面初次加载时把所有地方渲染好一次性响应给客户端。

本文主要和大家分享react前后端同构渲染,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。

实现方式:保证包管理工具和模块依赖方式一致

包管理工具-npm管理,保证前后端都使用同一个兼容包

模块依赖方式-webpack,保证前后端都采用commonjs的依赖方式,确保代码可以互相依赖

服务端如何渲染:
react全家桶:react、react-router、redux

react 和 reactDOM

reactDOM在这里提供的支持就是reactDOM.render和reactDOM.renderToString函数,其中欠着会在浏览器生成DOM结构,后者会在服务端生成对应的HTML字符串模板。react会在生成的DOM结构上添加一个 data-react-checksum的属性,这是一个 adler32 算法的校验和,用以确保两份模板的一致性。

这里写图片描述 

同时 react 的生命周期在前后端渲染过程中也有所不同。前端渲染的组件拥有完整的生命周期,而后端渲染仅有 componentWillMount 的生命周期。这就意味着,如果我们想进行前后端共同操作的逻辑,如发送数据请求等,可以放在 componentWillMount 的生命周期中;如果想单独处理客户端的逻辑,可以放在其他生命周期,如 componentDidMount 中。

react-router

react-router是react的路由-视图控制库,可以书写边界的声明式路由以控制不同页面的渲染。react-router 本身是一个状态机,根据配置好的路由规则,和输入的 url 路径,通过 match 方法找到对应的组件并进行渲染。

这里写图片描述

这套机制在前端和后端都是相通的,例如在后端,就是下面这样一种实现形式来进行渲染:

app.use(async (ctx, next) => { match({ location: ctx.originalUrl, routes }, callback) // 渲染完成之后,调用 callback 回调 // 将 组件 renderToString 返回前端即可 })

登录后复制

对于前端来说,其实也是处理的上面这些逻辑,不过它被很好的封装在 组件中,我们只需要写好声明式的路由,这一切就可以随着 url 的变化自动发生。

redux

redux是react的数据流管理库,他对服务端渲染的支持很简单,就是单一的store和状态可初始化。后端在进行渲染的时候会构建好单一的store,并将构建好的初始状态通过以json格式,通过全局变量写到生成好的html字符串模板上。
前端通过获取初始状态,生成跟后端徐然完成后一模一样的store,就可以保证前后端渲染数据的一致性,以确保前后端生成的dom结构一致。

优化结果:

开发效率低的问题:同构应用只有一个项目和一套技术栈,只要拥有 react 开发经验,就可以快速投入前端和后端的开发当中;
可维护性差的问题:同构应用可以进行大量的代码公用,包括工具方法、常量、页面组件和 redux 的大部分逻辑等,可重用性大大提高; 首屏性能、SEO 等

处理过程:

客户端发出请求-服务端渲染出组件-返回给客户端

1、在需要同构直出的页面(比如是index.html)放上占位符

@@@

###

登录后复制

以上,当客户端发出首次请求,服务端渲染出组件的html内容放@@@这个位置,然后服务端再渲染出类似这样的js代码段把组件最终渲染到DOM上。也就是说,renderApp方法实际上就是在渲染组件。

2、而为了直接调用renderApp方法,必须让renderApp方法成为window下的方法

window.renderApp = function(){ReactDOM.render(...)}

登录后复制

3、服务端取出index.html,渲染出占位符的内容,替代占位符,并一次性响应给客户端

案例

文件结构

browser.js(在这里把渲染组件的过程赋值给window.renderApp)bundle.js(把browser.js内容bundle到这里)Component.js(组件在这里定义)express.js(服务端)index.html(同构直出的页面)package.json

登录后复制

index.html,直出页面放上占位符

nbsp;html>  Untitled Document 

@@@

  ###

登录后复制

Component.js,在这里定义组件

var React = require('react');var ReactDOM = require('react-dom');var Component = React.createClass({ clickHandler: function(){  alert(this.props.msg) }, render: function(){  return React.createElement('button', {onClick: this.clickHandler}, this.props.msg) }})module.exports = Component;

登录后复制

browser.js,把组件渲染过程赋值给window对象

var React = require('react');var ReactDOM = require('react-dom');var Component = React.createFactory(require('./Component'));window.renderApp = function(msg){ ReactDOM.render(Component({msg: msg}), document.getElementById('root')); }

登录后复制

可以通过来触发组件的渲染。稍后,在服务端会把这段代码渲染出来。

express.js,服务端

以上,需要直出的页面有了占位符,定义了组件,并把渲染组件的过程赋值给了window对象,服务端现在要做的工作就是:生成组件的html和渲染组件的js,放到直出页面index.html的占位符位置。

var express = require('express');var React = require('react');var ReactDOMServer = require('react-dom/server');var fs = require('fs');var Component = React.createFactory(require('./Component'));//原先把文件读出来var BUNDLE = fs.readFileSync('./bundle.js',{encoding:'utf8'});var TEMPLATE = fs.readFileSync('./index.html',{encoding:'utf8'});var app = express();function home(req, res){ var msg = req.params.msg || 'Hello'; var comp = Component({msg: msg}); //@@@占位符的地方放组件 var page = TEMPLATE.replace('@@@', ReactDOMServer.renderToString(comp)); //###占位符的地方放js page = page.replace('###', 'renderApp("'+msg+'")') res.send(page);}//路由app.get('', home);app.get('/bundle.js', function(req, res){ res.send(BUNDLE);})app.get('/:msg', home);app.listen(4000);

登录后复制

package.json中的配置

"scripts": {"start": "watchify ./browser.js -o ./bundle.js"},

登录后复制

启动方式
运行:npm start
运行:node express.js
浏览:localhost:4000

相关推荐:

实现react服务器渲染基础方法

react后端渲染模板引擎noox发布使用方法

React前后端同构防止重复渲染

以上就是react前后端同构渲染实例分享的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2787107.html

(0)
上一篇 2025年3月8日 18:02:43
下一篇 2025年3月8日 18:02:57

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 微信小程序template模板引用实例分享

    本文主要和大家介绍微信小程序视图template模板引用的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下,希望能帮助到大家。 微信小程序视图template模板引用的实例详解 WXML 提供两种文件引用方式import和…

    2025年3月8日
    200
  • 4种Vue组件通信方式实例分享

    本文主要和大家分享4种vue组件通信方式:父子组件的通信、非父子组件的eventbus通信、利用本地缓存实现组件通信、vuex通信。希望能帮助到大家。 第一种通信方式:父子组件通信 父组件向子组件传递数据 父组件一共需要做4件事 1.imp…

    编程技术 2025年3月8日
    200
  • VUE页面加载外部HTML实例详解

    前后端分离,后端提供了接口。但有一部分数据,比较产品说明文件,是存在其他的服务器上的。所以,在页面显示的时候,如果以页面内嵌的形式显示这个说明文件。需要搞点事情以达到想要的效果。本文主要和大家介绍了vue页面中加载外部html的示例代码,小…

    2025年3月8日
    200
  • jQuery表单元素选择器实例讲解

    本文主要和大家详细介绍了jquery选择器之表单元素选择器的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家。 nbsp;html>         input{ display: block; margi…

    2025年3月8日
    200
  • .vue文件的生成和使用实例分享

    这几天新项目用vue2.0开发,由于之前没用过vue,拿到项目框架看到都是.vue文件,本文主要和大家介绍vue2.0开发入门笔记之.vue文件的生成和使用,非常具有实用价值,需要的朋友可以参考下,希望能帮助到大家。 不知道怎么用,以下是关…

    2025年3月8日 编程技术
    200
  • vue粒子特效实例分享

    本文主要和大家介绍vue 粒子特效的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 实现效果: 没错,你看到的上图那些类似于星座图的点和线,是由vue-particles生成的,而且…

    2025年3月8日
    200
  • React 16.3之Context API详解

    react在版本16.3-alpha里引入了新的context api,社区一片期待之声。我们先通过简单的例子,看下新的context api长啥样,然后再简单探讨下新的api的意义。 需要安装16.3-alpha版本的react。构建步骤…

    2025年3月8日
    200
  • Nginx设置前后端分离实例代码

    本文主要和大家分享nginx设置前后端分离实例代码,为了帮助大家更好的掌握nginx设置前后端分离,本文分享的代码很详细,希望能帮助到大家。 #user nobody;worker_processes 1;#error_log logs/e…

    编程技术 2025年3月8日
    200
  • 在Vue中highCharts绘制3d饼图实例分享

    本文主要和大家介绍在vue中highcharts绘制3d饼图实例,highcharts是国外知名基于javascript的图表库。由于中文官网的vue中使用highcharts配置繁琐并且需要引入jquery作为依赖,所以弃用。希望本文能帮…

    2025年3月8日
    200
  • React Native自定义组件实现抽屉菜单控件效果

    一、需求分析 原生开发中,自定义View可谓是屡见不鲜的事情,往往系统的控件总不能满足现实的需求。五花八门的产品设计需要我们做出不同的View。关于自定义View的内容网上已经有很多的博文,本篇博客要和大家分享如何在React Native…

    2025年3月8日
    200

发表回复

登录后才能评论