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 相关文章推荐
innerHTML与jquery里的html()区别介绍
Oct 12 Javascript
将字符串转换成gb2312或者utf-8编码的参数(js版)
Apr 10 Javascript
javascript生成随机数的方法
May 16 Javascript
JQuery删除DOM节点的方法
Jun 11 Javascript
JavaScript中的数据类型转换方法小结
Oct 26 Javascript
JavaScript中字符串与Unicode编码互相转换的实现方法
Dec 18 Javascript
js实现(全选)多选按钮的方法【附实例】
Mar 30 Javascript
jQuery如何获取动态添加的元素
Jun 24 Javascript
微信小程序 参数传递详解
Oct 24 Javascript
javascript 定时器工作原理分析
Dec 03 Javascript
基于js实现抽红包并分配代码实例
Sep 19 Javascript
JavaScript缓动动画函数的封装方法
Nov 25 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
PHP学习 运算符与运算符优先级
2008/06/15 PHP
php上传图片到指定位置路径保存到数据库的具体实现
2013/12/30 PHP
PHP源码分析之变量的存储过程分解
2014/07/03 PHP
PHP实现AES256加密算法实例
2014/09/22 PHP
thinkphp文件处理类Dir.class.php的用法分析
2014/12/08 PHP
PHP截取发动短信内容的方法
2017/07/04 PHP
php实现的PDO异常处理操作分析
2018/12/27 PHP
静态的动态续篇之来点XML
2006/12/23 Javascript
单独使用CKFinder选择图片的方法
2010/08/21 Javascript
javascript 设为首页与加入收藏兼容多浏览器代码
2011/01/11 Javascript
jquery刷新页面的实现代码(局部及全页面刷新)
2011/07/11 Javascript
基于jquery的点击链接插入链接内容的代码
2012/07/31 Javascript
JavaScript的事件机制详解
2017/01/17 Javascript
jQuery插件echarts实现的单折线图效果示例【附demo源码下载】
2017/03/04 Javascript
使用AngularJS2中的指令实现按钮的切换效果
2017/03/27 Javascript
详解用node编写自己的cli工具
2017/05/23 Javascript
在vue中v-bind使用三目运算符绑定class的实例
2018/09/29 Javascript
[14:19]2018年度COSER大赛-完美盛典
2018/12/16 DOTA
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
2017/11/29 Python
Python批量生成特定尺寸图片及图画任意文字的实例
2019/01/30 Python
在win64上使用bypy进行百度网盘文件上传功能
2020/01/02 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
2020/02/26 Python
Melijoe美国官网:法国奢侈童装购物网站
2017/04/19 全球购物
美国羊皮公司:Overland
2018/01/15 全球购物
中国跨境在线时尚零售商:Bellelily
2018/04/06 全球购物
javascript实现用户必须勾选协议实例讲解
2021/03/24 Javascript
高三政治教学反思
2014/02/06 职场文书
企业节能减排实施方案
2014/03/19 职场文书
经贸日语专业个人求职信范文
2014/04/29 职场文书
城管大队整治方案
2014/05/06 职场文书
英语求职信范文
2014/05/23 职场文书
大专应届毕业生求职信
2014/07/15 职场文书
乒乓球比赛通知
2015/04/27 职场文书
普希金的诗歌赏析(3首)
2019/08/20 职场文书
实现一个简单得数据响应系统
2021/11/11 Javascript