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 相关文章推荐
广告代码静态化js通用函数
May 09 Javascript
深入理解JavaScript系列(10) JavaScript核心(晋级高手必读篇)
Jan 15 Javascript
使用jquery.validate自定义方法实现&quot;手机号码或者固话至少填写一个&quot;的逻辑验证
Sep 01 Javascript
js面向对象的写法
Feb 19 Javascript
javascript特殊文本输入框网页特效
Sep 13 Javascript
深入理解选择框脚本[推荐]
Dec 13 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
Jan 13 Javascript
JS自动生成动态HTML验证码页面
Jun 14 Javascript
vue轮播图插件vue-awesome-swiper
Nov 27 Javascript
微信小程序checkbox组件使用详解
Jan 31 Javascript
three.js 如何制作魔方
Jul 31 Javascript
vue form表单post请求结合Servlet实现文件上传功能
Jan 22 Vue.js
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
一个用php3编写的简单计数器
2006/10/09 PHP
PHP父类调用子类方法的代码例子
2014/04/09 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
js程序中美元符号$是什么
2008/06/05 Javascript
js下将字符串当函数执行的方法
2011/07/13 Javascript
JS中处理与当前时间间隔的函数代码
2012/05/23 Javascript
Jquery 动态循环输出表格具体方法
2013/11/23 Javascript
jQuery Masonry瀑布流插件使用详解
2014/11/17 Javascript
JS实现兼容性较好的随屏滚动效果
2015/11/09 Javascript
JavaScript登录验证基础教程
2017/11/01 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
python获取当前计算机cpu数量的方法
2015/04/18 Python
Python遍历文件夹和读写文件的实现代码
2016/08/28 Python
Python sqlite3事务处理方法实例分析
2017/06/19 Python
python斐波那契数列的计算方法
2018/09/27 Python
python selenium firefox使用详解
2019/02/26 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
2019/06/03 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
2020/03/06 Python
FitFlop澳大利亚官网:英国符合人体工学的鞋类品牌
2017/06/05 全球购物
潘多拉珠宝英国官方网上商店:PANDORA英国
2018/06/12 全球购物
Christys’ Hats官网:英国帽子制造商
2018/11/28 全球购物
Python面试题:Python里面如何生成随机数
2015/03/12 面试题
《小蝌蚪找妈妈》教学反思
2014/02/21 职场文书
弘扬民族精神演讲稿
2014/05/07 职场文书
服装设计专业求职信
2014/06/16 职场文书
感恩教师节演讲稿
2014/09/03 职场文书
弘扬焦裕禄精神走群众路线思想汇报
2014/09/12 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
党员反对四风思想汇报范文
2014/10/25 职场文书
2014员工聘用协议书(最新版)
2014/11/24 职场文书
小学校长个人总结
2015/03/03 职场文书
专家推荐信怎么写
2015/03/25 职场文书
2015年留守儿童工作总结
2015/05/22 职场文书
我的兄弟姐妹观后感
2015/06/15 职场文书
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js