最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

node網(wǎng)頁(yè)分段渲染詳解

 更新時(shí)間:2016年09月05日 09:09:31   作者:jaychen  
按照常理,我們渲染一張網(wǎng)頁(yè),必定是網(wǎng)頁(yè)全部拼裝完畢,然后生成HTML字符串,傳送至客戶端。這也意味著,如果一張網(wǎng)頁(yè)處理的有快有慢的話,必須串行等到所有的邏輯都處理完畢。后端才能進(jìn)行返回。

頁(yè)面渲染,通常來(lái)說(shuō)分為前端渲染以及后端渲染。前端渲染指的是服務(wù)端返回html框架以及模版,前端通過(guò)ajax異步請(qǐng)求拉取數(shù)據(jù)渲染模版,并動(dòng)態(tài)修改dom,形成最終頁(yè)面。服務(wù)端渲染則是服務(wù)端通過(guò)在后端拉取數(shù)據(jù)以及后端模版渲完整頁(yè)面,并返回到客戶端。2種方法各有好處,后端渲染帶來(lái)的則是首屏?xí)r間的提高,減少請(qǐng)求次數(shù),利于SEO等好處。但是傳統(tǒng)后端直出渲染需要等到整個(gè)網(wǎng)頁(yè)渲染完成,才能返回到客戶端。假如某個(gè)區(qū)塊拉取數(shù)據(jù)比較慢,影響了渲染的速度,那對(duì)于用戶來(lái)說(shuō),等待的時(shí)候也會(huì)跟著變長(zhǎng)對(duì)于后端渲染能否跟前端ajax渲染一樣,分塊分區(qū)域傳統(tǒng)的服務(wù)端直出渲染,下面將提供一種解決方案-網(wǎng)頁(yè)分段渲染。

首先我們先看下傳統(tǒng)的渲染方式:

const http = require("http");
const fs = require("fs");
var tpl1 = '<!DOCTYPE html><html><head><title>測(cè)試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);
 }

上面我們提供了一個(gè)簡(jiǎn)單的例子,通過(guò)訪問(wèn)http://127.0.0.1:3000 返回一個(gè)頁(yè)面。其中渲染頁(yè)面時(shí),有2個(gè)耗時(shí)5秒的操作,可以假設(shè)為IO或者數(shù)據(jù)拉取。這個(gè)時(shí)候我們觀察返回頁(yè)面的時(shí)間是10秒,也就是說(shuō)用戶看到頁(yè)面需要10秒鐘。

下面我們通過(guò)改造后端渲染方式,改為分段渲染。

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>測(cè)試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);
}


通過(guò)設(shè)置http首部: Transfer-Encoding: chunked 即開(kāi)啟了分段傳輸?shù)哪ХāT摼幋a方式存在http1.1中,一般在服務(wù)器生成HTTP回應(yīng)是無(wú)法確定信息大小的,這時(shí)用Content-Length就無(wú)法事先寫入長(zhǎng)度,而需要實(shí)時(shí)生成消息長(zhǎng)度,則服務(wù)器一般采用Chunked編碼。

在進(jìn)行Chunked編碼傳輸時(shí),在回復(fù)消息的頭部有transfer-coding并定義為Chunked,表示將用Chunked編碼傳輸內(nèi)容。 下面我們看下修改后的效果:

雖然總體的頁(yè)面?zhèn)鬏敃r(shí)間并沒(méi)有變化,但是通過(guò)該方式,我們將響應(yīng)時(shí)間縮短了一半,減少了用戶等待的時(shí)間。在具體業(yè)務(wù)中,我們可以講用戶需要先看到的部分進(jìn)行提前輸出,將后端處理耗時(shí)較久的部分延遲輸出,這就是分段傳輸渲染的優(yōu)勢(shì)。 注意如果服務(wù)器是nginx,有可能由于緩沖區(qū)的設(shè)置導(dǎo)致分段渲染無(wú)效,需要調(diào)整緩沖區(qū)大小。

相關(guān)文章

  • node.js中koa和express的差異對(duì)比

    node.js中koa和express的差異對(duì)比

    Express和koa都是服務(wù)端的開(kāi)發(fā)框架,服務(wù)端開(kāi)發(fā)的重點(diǎn)是對(duì)HTTP Request和HTTP Response兩個(gè)對(duì)象的封裝和處理,下面這篇文章主要給大家介紹了關(guān)于node.js中koa和express的差異對(duì)比,需要的朋友可以參考下
    2023-05-05
  • Nodejs?Docker鏡像體積優(yōu)化實(shí)踐詳解

    Nodejs?Docker鏡像體積優(yōu)化實(shí)踐詳解

    這篇文章主要為大家介紹了Nodejs?Docker鏡像體積優(yōu)化實(shí)踐示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • nodejs中的讀取文件fs與文件路徑path解析

    nodejs中的讀取文件fs與文件路徑path解析

    這篇文章主要介紹了nodejs中的讀取文件fs與文件路徑path解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 淺談在koa2中實(shí)現(xiàn)頁(yè)面渲染的全局?jǐn)?shù)據(jù)

    淺談在koa2中實(shí)現(xiàn)頁(yè)面渲染的全局?jǐn)?shù)據(jù)

    本篇文章主要介紹了淺談在koa2中實(shí)現(xiàn)頁(yè)面渲染的全局?jǐn)?shù)據(jù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • node中的密碼安全(加密)

    node中的密碼安全(加密)

    這篇文章主要介紹了node中的密碼安全(加密),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • NodeJS?GRPC?多個(gè)?.proto?文件的處理步驟

    NodeJS?GRPC?多個(gè)?.proto?文件的處理步驟

    本文教程詳細(xì)介紹了在NodeJS環(huán)境中如何使用gRPC框架處理多個(gè).proto文件,步驟包括安裝依賴、定義.proto文件、生成gRPC代碼、實(shí)現(xiàn)服務(wù)器和客戶端以及運(yùn)行,適用于開(kāi)發(fā)者在構(gòu)建分布式應(yīng)用時(shí)進(jìn)行接口定義和服務(wù)實(shí)現(xiàn)
    2024-10-10
  • Node.js中使用事件發(fā)射器模式實(shí)現(xiàn)事件綁定詳解

    Node.js中使用事件發(fā)射器模式實(shí)現(xiàn)事件綁定詳解

    這篇文章主要介紹了Node.js中使用事件發(fā)射器模式實(shí)現(xiàn)事件綁定詳解,本文一并講解了回調(diào)模式、發(fā)射器模式、事件類型等基礎(chǔ)知識(shí)做了補(bǔ)充,需要的朋友可以參考下
    2014-08-08
  • node.js中PC端微信小程序包解密的處理思路

    node.js中PC端微信小程序包解密的處理思路

    我們使用node.js去寫一個(gè)解碼的程序。根據(jù)上邊加密的流程,我們首先讀取加密文件,把前6個(gè)字節(jié)的固定字符串去除,這篇文章主要介紹了node.js中PC端微信小程序包解密,需要的朋友可以參考下
    2021-12-12
  • nodejs中用npm初始化來(lái)創(chuàng)建package.json的實(shí)例講解

    nodejs中用npm初始化來(lái)創(chuàng)建package.json的實(shí)例講解

    今天小編就為大家分享一篇nodejs中用npm初始化來(lái)創(chuàng)建package.json的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • NodeJs通過(guò)async/await處理異步的方法

    NodeJs通過(guò)async/await處理異步的方法

    本篇文章主要介紹了NodeJs通過(guò)async/await處理異步的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10

最新評(píng)論

桑植县| 邳州市| 永丰县| 林周县| 濮阳市| 延长县| 商南县| 垣曲县| 革吉县| 樟树市| 庆城县| 南城县| 板桥市| 栖霞市| 邹平县| 盐山县| 靖宇县| 城步| 顺平县| 巴彦淖尔市| 辉南县| 岑溪市| 北辰区| 杭锦后旗| 盘山县| 无锡市| 鄱阳县| 旌德县| 辽中县| 乳源| 大悟县| 寿光市| 天长市| 随州市| 华安县| 黄大仙区| 武鸣县| 兴安盟| 四子王旗| 洛川县| 诸城市|