首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >node网页分段渲染与bigpipe(一)

node网页分段渲染与bigpipe(一)

作者头像
IMWeb前端团队
发布于 2017-12-29 10:34:35
发布于 2017-12-29 10:34:35
90300
代码可运行
举报
文章被收录于专栏:IMWeb前端团队IMWeb前端团队
运行总次数:0
代码可运行

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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秒钟。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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编码传输内容。 下面我们看下修改后的效果:

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
17.编程式导航(js驱动跳转)和路由的hash模式与History模式
编程式导航 与router-link导航相比,router-link类似于a标签,编程式导航相当于ajax,导航用页面跳转 Home.vue <template> <div> <h2>{{msg}}</h2> <br> <button @click="goNew()">通过js跳转到新闻页面</button> <br> </div> </template> <script> export default { name: '
玩蛇的胖纸
2019/10/21
6840
18.路由的嵌套
1.在components目录下新建目录User,目录下新建两个组件AddUser.vue和UserList.vue AddUser.vue <template> <div> <h2>{{msg}}</h2> </div> </template> <script> export default { name: 'home', data () { return { msg:'增加用户' } }, methods:{
玩蛇的胖纸
2019/10/21
8080
vue常用手册
1.在src/components目录下新建User.vue文件,同时再新建User目录,在User目录下新建UserAdd.vue和UserList.vue两个文件
玩蛇的胖纸
2018/12/25
9110
15.vue中的路由vue-router
npm install vue-router --save / cnpm install vue-router --save
玩蛇的胖纸
2019/10/21
5930
15.vue中的路由vue-router
浅入深出Vue:第一个页面
首先我们是要做一个博客网站,UI 框架采用江湖传闻中的 ElementUI,今天我们就来利用它确定我们博客网站的基本布局吧。
熙世
2019/07/12
1.5K0
浅入深出Vue:第一个页面
qiankun 实战(一)
前两天用了一下微前端框架 icestark, 在实际架构搭建过程中发现中发现在 Vue 主应用子应用之间切换 tag (tag 分别主应用和子应用的页面)页签时会有子应用数据状态无法保存的情况,搜索了一波解决方案后发现,icestark 中 React 应用实现了对数据状态的缓存,Vue 里面没有这个实现。
草帽lufei
2022/07/29
8190
qiankun 实战(一)
【云+社区年度征文】vue自动化路由开篇
年初的时候发布了第一版的ea-router自动化路由库,欢迎大家安装使用。[Github地址] [npm地址]
熙世
2020/12/22
7130
【云+社区年度征文】vue自动化路由开篇
今天,学会这5个Vue高级实战技巧就够了!
我们平时可能这样引入注册组件。每次都得需要在头部引入,然后注册,最后在模板上使用。
网罗开发
2021/07/21
6470
Vue + ElementUI 集成 Vue Router
最新写 Vue 项目使用 ElementUI 做前端, 然后需要集成一个 vue Router, 主要功能是侧边栏不刷新而内容刷新, 看了几个 starter 都和需求不太一样, 因此干脆自己搞一个
szhshp
2022/09/21
4700
cssjshtml vue.js router resource
路由router跳转免刷新,resouce请求网络资源 main.js // The Vue build version to load with the `import` command // (runtime-only or standalone) has been set in webpack.base.conf with an alias. import Vue from 'vue' import VueRouter from 'vue-router' import VueResource fro
葫芦
2019/04/17
6940
Vue Element入门教程
其中node_modules是你安装的依赖,也就是你执行完npm install命令安装的东西;assets可以存放一些公共的样式、图标等;components里放的是你写的组件;router放的是页面的路由;views里可以放你自己写的一些页面;App.vue是页面的入口;main.js是js文件的入口,你需要在这里面把你写的js引进去;static可以放一些图片、图标等。
全栈程序员站长
2022/08/26
4590
Vue Element入门教程
vue.js客服系统实时聊天项目开发(一)路由与子路由-全局变量-elementui搭建基本框架
Vue应用程序设置一些基本配置,包括使用依赖项,设置路由,挂载组件等。这样就可以使用Vue框架开发应用程序了
唯一Chat
2023/01/14
6250
前端成神之路-vue前端项目01
客户使用的业务服务:PC端,小程序,移动web,移动app 管理员使用的业务服务:PC后台管理端。 PC后台管理端的功能:管理用户账号(登录,退出,用户管理,权限管理),商品管理(商品分类,分类参数,商品信息,订单),数据统计 电商后台管理系统采用前后端分离的开发模式 前端项目是基于Vue的SPA(单页应用程序)项目
海仔
2021/03/20
7720
16.动态路由传值和get传值
1.动态路由传值  1.在components目录下新建vContent.vue组件 <template> <div> <h2>{{msg}}</h2> </div> </template> <script> export default { data () { return { msg:'详情组件', } }, methods:{ }, mounted(){ console.log(this
玩蛇的胖纸
2019/10/21
1.8K0
Vue在webpack中使用vue-router
Vue在webpack中使用vue-router 先安装Vue-router npm i vue-router vue-router官网 导入路由模块: import VueRouter from 'vue-router' 安装路由模块: Vue.use(VueRouter); 导入需要展示的组件: import login from './components/account/login.vue' import register from './components/account/register.v
Dream城堡
2018/12/12
5390
Vue 路由模块化配置
企业运营后台页面很多,路由如若不区分模块化配置,所有路由挤在同一个文件将不好维护,所以路由的配置也要模块化
Krry
2019/08/13
1.4K0
.NET 程序员如何学习Vue
之所以取这个标题,是因为本文来自内部培训的整理,培训的对象是公司的 .NET 程序员,.NET 程序员学习 Vue 是为了在项目中做二次开发时能够更好地跟产品对接。
oec2003
2019/09/03
1.2K0
.NET 程序员如何学习Vue
vue.js路由配置和设置技术
1.路由基础 1.1概念 硬件有路由的概念,在硬件上,从一组设备到另外一些访问路径的时候,需要通过一个工具的转发。后端项目也有路由的概念 页面1: http://192.168.0.1:8080/index.html 页面2: http://192.168.0.1:8080/about.html 页面3: http://192.168.0.1:8080/news.html 在地址栏通过url来查看页面解析,可以通过a到服务器之后,由服务器来判断,去哪里。 前端路由: HTML5 history API,之前是哈希散列的方式,这个算法可以兼容低版本的浏览器。 http://192.168.0.1:8080/#/index.html http://192.168.0.1:8080/#/about.html http://192.168.0.1:8080/#/bews.html WEB服务器不会解析#后面的内容,有js来获取#后面的内容,通过windows.location.hash来读取,然后匹配到不同的功能上。优点:哈希值改变后,不会导致浏览器的刷新。 1.2使用路由 npm run vue-router import Vue from ‘vue’ //相当于加载vue.js // VueRouter类拿过来,从刚才下载的npm包 import VueRouter from ‘vue-router’ //加载一个组件HomeView import HomeView from ‘…/views/HomeView.vue’ //要使用这个路由,必须通过Vue.use()明确安装路由功能 Vue.use(VueRouter) 因为我们使用了脚手架,配置放在/src/router/index.js文件中。在脚手架里面创建完毕路由对象之后,将路由配置文件引入到main.js,并注册到Vue实例上。注册完毕之后才可以使用路由的内置组件router-link和router-view,这两个组件可以进行页面跳转。 1.3index.js研究 //常量,es复数,可以定义一个多个路由子项;对应的是一个数组; //[],里面的格式:{ // path:‘路径的地址’,name:‘名字小写’,component:对应的组件;
张哥编程
2024/12/13
2260
vue.js路由配置和设置技术
Vue2.0 新手完全填坑攻略——从环境搭建到发布
Homebrew 1.0.6(Mac)、Node.js 6.7.0、npm 3.10.3、webpack 1.13.2、vue-cli 2.4.0、Atom 1.10.2
onety码生
2018/11/21
1.9K0
Vue-router 学习笔记
在以前,前后端是不分离的,这个阶段通常是由服务端渲染好页面(SSR),再发送页面给前端去展示;接着到了前后端分离的阶段,前端向静态资源服务器拿资源,再通过 js 渲染页面,此时仍然是一个 url 对应一份 html+css+js。再后来出现了 SPA 单页面应用的概念,实际上它只有一个页面,但给我们的体验是多页面之间的切换。
Chor
2019/11/18
6970
相关推荐
17.编程式导航(js驱动跳转)和路由的hash模式与History模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验