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 相关文章推荐
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
May 28 Javascript
基于jquery实现的定时显示与隐藏div广告的实现代码
Aug 22 Javascript
js浏览器本地存储store.js介绍及应用
May 13 Javascript
用js传递value默认值的示例代码
Sep 11 Javascript
浅谈JS的基础类型与引用类型
Sep 13 Javascript
学习vue.js计算属性
Dec 03 Javascript
vue 2.0封装model组件的方法
Aug 03 Javascript
微信小程序实现折叠面板
Jan 31 Javascript
node Buffer缓存区常见操作示例
May 04 Javascript
layui使用数据表格实现购物车功能
Jul 26 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
Sep 24 Javascript
js实现小时钟效果
Mar 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
第十一节 重载 [11]
2006/10/09 PHP
Smarty+QUICKFORM小小演示
2007/02/25 PHP
PHP Ajax中文乱码问题解决方法
2009/02/27 PHP
PHP获取http请求的头信息实现步骤
2012/12/16 PHP
解析CodeIgniter自定义配置文件
2013/06/18 PHP
php生成shtml类用法实例
2014/12/09 PHP
PHP获取数组最后一个值的2种方法
2015/01/21 PHP
jquery关于页面焦点的定位(文本框获取焦点时改变样式 )
2010/09/10 Javascript
js创建对象的几种常用方式小结(推荐)
2010/10/24 Javascript
详解JavaScript对象序列化
2016/01/19 Javascript
Javascript 实现微信分享(QQ、朋友圈、分享给朋友)
2016/10/21 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
深入理解javascript的getTime()方法
2017/02/16 Javascript
简单实现js鼠标跟随效果
2020/08/02 Javascript
详解JavaScript按概率随机生成事件
2017/08/02 Javascript
JavaScript运行原理分析
2018/02/09 Javascript
Bootstrap Table列宽拖动的方法
2018/08/15 Javascript
微信小程序实现登录遮罩效果
2018/11/01 Javascript
微信小程序左右滚动公告栏效果代码实例
2019/09/16 Javascript
微信小程序防止多次点击跳转(函数节流)
2019/09/19 Javascript
python批量下载图片的三种方法
2013/04/22 Python
关于pip的安装,更新,卸载模块以及使用方法(详解)
2017/05/19 Python
python用pickle模块实现“增删改查”的简易功能
2017/06/07 Python
Python中实例化class的执行顺序示例详解
2018/10/14 Python
python分块读取大数据,避免内存不足的方法
2018/12/10 Python
python3.6使用tkinter实现弹跳小球游戏
2019/05/09 Python
python3使用腾讯企业邮箱发送邮件的实例
2019/06/28 Python
解析Python3中的Import
2019/10/13 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
2020/01/02 Python
python request 模块详细介绍
2020/11/10 Python
简单介绍HTML5中的文件导入
2015/05/08 HTML / CSS
买卖正宗运动鞋:GOAT
2019/12/06 全球购物
本科生求职信
2014/06/17 职场文书
2015年安全生产责任书
2015/01/30 职场文书
校长新学期致辞
2015/07/30 职场文书
SpringBoot 集成短信和邮件 以阿里云短信服务为例
2022/04/22 Java/Android