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动态调整TextArea高度的代码
Dec 28 Javascript
PHP PDO操作总结
Nov 17 Javascript
javascript判断移动端访问设备并解析对应CSS的方法
Feb 05 Javascript
谈谈JavaScript自定义回调函数
Oct 18 Javascript
AngularJS 单元测试(二)详解
Sep 21 Javascript
微信小程序  modal详解及实例代码
Nov 09 Javascript
BootStrap轮播HTML代码(推荐)
Dec 10 Javascript
jQuery实现滚动条滚动到子元素位置(方便定位)
Jan 08 Javascript
如何为你的JavaScript代码日志着色详解
Apr 08 Javascript
node express使用HTML模板的方法示例
Aug 22 Javascript
vue实现输入一位数字转汉字功能
Dec 13 Javascript
vue+elementui实现点击table中的单元格触发事件--弹框
Jul 18 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 adodb连接mssql解决乱码问题
2009/06/12 PHP
PHP防CC攻击实现代码
2011/12/29 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
2013/06/26 PHP
php常用hash加密函数
2014/11/22 PHP
PHP中FTP相关函数小结
2016/07/15 PHP
基于php双引号中访问数组元素报错的解决方法
2018/02/01 PHP
PHP大文件切割上传并带进度条功能示例
2019/07/01 PHP
PHP autoload使用方法及步骤详解
2020/09/05 PHP
深入浅析安装PhpStorm并激活的步骤详解
2020/09/17 PHP
ListBox实现上移,下移,左移,右移的简单实例
2014/02/13 Javascript
JavaScript声明变量时为什么要加var关键字
2014/09/29 Javascript
jQuery Validation Plugin验证插件手动验证
2016/01/26 Javascript
Seajs 简易文档 提供简单、极致的模块化开发体验
2016/04/13 Javascript
新手学习前端之js模仿淘宝主页网站
2016/10/31 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
bootstrap手风琴制作方法详解
2017/01/11 Javascript
vue.js中父组件调用子组件的内部方法示例
2017/10/22 Javascript
微信小程序:数据存储、传值、取值详解
2019/05/07 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
2019/10/15 Javascript
[02:04]2014DOTA2国际邀请赛 DK一个时代的落幕
2014/07/21 DOTA
[56:41]iG vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/17 DOTA
Python实现高效求解素数代码实例
2015/06/30 Python
python实现定时提取实时日志程序
2018/06/22 Python
Django objects的查询结果转化为json的三种方式的方法
2018/11/07 Python
浅谈Django中view对数据库的调用方法
2019/07/18 Python
新手入门学习python Numpy基础操作
2020/03/02 Python
PyTorch中clone()、detach()及相关扩展详解
2020/12/09 Python
canvas三角函数模拟水波效果的示例代码
2018/07/03 HTML / CSS
高清安全摄像头系统:Lorex Technology
2018/07/20 全球购物
中青班党性分析材料
2014/02/16 职场文书
电工工作职责范本
2014/02/22 职场文书
贷款承诺书范文
2014/05/19 职场文书
体育课外活动总结
2014/07/08 职场文书
会议接待欢迎词范文
2015/01/26 职场文书
亮剑精神观后感
2015/06/05 职场文书
CSS控制继承中的height能变为可继承吗
2022/06/10 HTML / CSS