node网页分段渲染详解


Posted in Javascript onSeptember 05, 2016

页面渲染,通常来说分为前端渲染以及后端渲染。前端渲染指的是服务端返回html框架以及模版,前端通过ajax异步请求拉取数据渲染模版,并动态修改dom,形成最终页面。服务端渲染则是服务端通过在后端拉取数据以及后端模版渲完整页面,并返回到客户端。2种方法各有好处,后端渲染带来的则是首屏时间的提高,减少请求次数,利于SEO等好处。但是传统后端直出渲染需要等到整个网页渲染完成,才能返回到客户端。假如某个区块拉取数据比较慢,影响了渲染的速度,那对于用户来说,等待的时候也会跟着变长对于后端渲染能否跟前端ajax渲染一样,分块分区域传统的服务端直出渲染,下面将提供一种解决方案-网页分段渲染。

首先我们先看下传统的渲染方式:

const http = require("http");
const fs = require("fs");
var tpl1 = '<!DOCTYPE html><html><head><title>测试render</title></head><body>helloword<p>$data1</p>';
var tpl2 = '<p>$data2</p></body></html>';
var html = '';

var server = http.createServer((req, res)=>{
 if(req.url!=="/favicon.ico"){
   res.writeHead(200, {
     'Content-Type' : 'text/html'
   });
   getDataOne((data1) => {
     getDataTwo((data2) => {
       res.end(tpl1.replace(/\$data1/g, data1) + tpl2.replace(/\$data2/g, data2));
     })
   });
 }
 }).listen(3000, '127.0.0.1');


function getDataOne(fn){
  setTimeout(() => {
     fn('11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111');
  }, 5000);
 }

 function getDataTwo(fn){
   setTimeout(() => {
     fn('22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222');
   }, 5000);
 }

上面我们提供了一个简单的例子,通过访问http://127.0.0.1:3000 返回一个页面。其中渲染页面时,有2个耗时5秒的操作,可以假设为IO或者数据拉取。这个时候我们观察返回页面的时间是10秒,也就是说用户看到页面需要10秒钟。

node网页分段渲染详解

下面我们通过改造后端渲染方式,改为分段渲染。

const http = require("http");
const fs = require("fs");

var server = http.createServer((req, res)=>{
  if(req.url!=="/favicon.ico"){
    res.writeHead(200, {
      'Content-Type' : 'text/html',
      'Transfer-Encoding' : 'chunked'
    });

    getDataOne((data1) => {
      res.write('<!DOCTYPE html><html><head><title>测试render</title></head><body>helloword<p>$data1</p>'.replace(/\$data1/g, data1));
      getDataTwo((data2) => {
        res.end('<p>$data2</p></body></html>'.replace(/\$data2/g, data2));
      })
    });
 }
}).listen(3000, '127.0.0.1');

function getDataOne(fn1){
  setTimeout(() => {
   fn1('1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111');
 }, 5000);
 }

function getDataTwo(fn2){
  setTimeout(() => {
    fn2('22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222');
  }, 5000);
}

通过设置http首部: Transfer-Encoding: chunked 即开启了分段传输的魔法。该编码方式存在http1.1中,一般在服务器生成HTTP回应是无法确定信息大小的,这时用Content-Length就无法事先写入长度,而需要实时生成消息长度,则服务器一般采用Chunked编码。

在进行Chunked编码传输时,在回复消息的头部有transfer-coding并定义为Chunked,表示将用Chunked编码传输内容。 下面我们看下修改后的效果:

node网页分段渲染详解

虽然总体的页面传输时间并没有变化,但是通过该方式,我们将响应时间缩短了一半,减少了用户等待的时间。在具体业务中,我们可以讲用户需要先看到的部分进行提前输出,将后端处理耗时较久的部分延迟输出,这就是分段传输渲染的优势。 注意如果服务器是nginx,有可能由于缓冲区的设置导致分段渲染无效,需要调整缓冲区大小。

Javascript 相关文章推荐
$.each遍历对象、数组的属性值并进行处理
Jul 18 Javascript
Javascript动态创建div的方法
Feb 09 Javascript
jquery带下拉菜单和焦点图代码分享
Aug 24 Javascript
JavaScript实现向右伸出的多级网页菜单效果
Aug 25 Javascript
javascript中判断json的方法总结
Aug 27 Javascript
jquery单击事件和双击事件冲突解决方案
Mar 02 Javascript
JavaScript注入漏洞的原理及防范(详解)
Dec 04 Javascript
js 监控iframe URL的变化实例代码
Jul 12 Javascript
Vue2.0 axios前后端登陆拦截器(实例讲解)
Oct 27 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
Jan 24 Javascript
react使用CSS实现react动画功能示例
May 18 Javascript
vue自定义指令和动态路由实现权限控制
Aug 28 Javascript
js对象浅拷贝和深拷贝详解
Sep 05 #Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
Sep 04 #Javascript
jQuery实现智能判断固定导航条或侧边栏的方法
Sep 04 #Javascript
angularjs实现文字上下无缝滚动特效代码
Sep 04 #Javascript
jQuery实现为LI列表前3行设置样式的方法【2种方法】
Sep 04 #Javascript
JS实现屏蔽网页右键复制及ctrl+c复制的方法【2种方法】
Sep 04 #Javascript
jQuery实现的自动加载页面功能示例
Sep 04 #Javascript
You might like
JoshChen_php新手进阶高手不可或缺的规范介绍
2013/08/16 PHP
解决file_get_contents无法请求https连接的方法
2013/12/17 PHP
php判断手机访问还是电脑访问示例分享
2014/01/20 PHP
php获取用户真实IP和防刷机制的实例代码
2018/11/28 PHP
Windows Live的@live.com域名注册漏洞 利用代码
2006/12/27 Javascript
Extjs学习笔记之一 初识Extjs之MessageBox
2010/01/07 Javascript
javascript中使用css需要注意的地方小结
2010/09/01 Javascript
通过Javascript将数据导出到外部Excel文档的函数代码
2012/06/15 Javascript
Three.js源码阅读笔记(Object3D类)
2012/12/27 Javascript
在JS数组特定索引处指定位置插入元素
2014/07/27 Javascript
使用jquery操作session方法分享
2015/01/22 Javascript
JS根据key值获取URL中的参数值及把URL的参数转换成json对象
2015/08/26 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
2015/11/02 Javascript
Bootstrap按钮组件详解
2016/04/26 Javascript
利用Javascript实现BMI计算器
2016/08/16 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
Vue波纹按钮组件制作
2018/04/30 Javascript
vue全局使用axios的操作
2020/09/08 Javascript
python妹子图简单爬虫实例
2015/07/07 Python
selenium+python 对输入框的输入处理方法
2018/10/11 Python
python后端接收前端回传的文件方法
2019/01/02 Python
python2爬取百度贴吧指定关键字和图片代码实例
2019/08/14 Python
从numpy数组中取出满足条件的元素示例
2019/11/26 Python
一款纯css3实现的tab选项卡的实列教程
2014/12/11 HTML / CSS
css3 边框、背景、文本效果的实现代码
2018/03/21 HTML / CSS
KEETSA环保床垫:更好的睡眠,更好的生活!
2016/11/24 全球购物
台湾最大网路书店:博客来
2018/03/18 全球购物
少先队学雷锋活动总结范文
2014/03/09 职场文书
中学生操行评语
2014/04/24 职场文书
购房公证委托书(2014版)
2014/09/12 职场文书
公务员考察材料
2014/12/23 职场文书
MySQL系列之十 MySQL事务隔离实现并发控制
2021/07/02 MySQL
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL
PostgreSQL自动更新时间戳实例代码
2021/11/27 PostgreSQL
JavaScript实现一键复制内容剪贴板
2022/07/23 Javascript