亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

首先我們先看下傳統(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)單的例子,通過訪問http://127.0.0.1:3000 返回一個(gè)頁面。其中渲染頁面時(shí),有2個(gè)耗時(shí)5秒的操作,可以假設(shè)為IO或者數(shù)據(jù)拉取。這個(gè)時(shí)候我們觀察返回頁面的時(shí)間是10秒,也就是說用戶看到頁面需要10秒鐘。

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

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);
}


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

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

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

相關(guān)文章

  • Node.js實(shí)現(xiàn)簡(jiǎn)單的爬取的示例代碼

    Node.js實(shí)現(xiàn)簡(jiǎn)單的爬取的示例代碼

    這篇文章主要介紹了Node.js實(shí)現(xiàn)簡(jiǎn)單的爬取的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Node 搭建一個(gè)靜態(tài)資源服務(wù)器的實(shí)現(xiàn)

    Node 搭建一個(gè)靜態(tài)資源服務(wù)器的實(shí)現(xiàn)

    這篇文章主要介紹了Node 搭建一個(gè)靜態(tài)資源服務(wù)器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • NodeJS實(shí)現(xiàn)單點(diǎn)登錄原理解析

    NodeJS實(shí)現(xiàn)單點(diǎn)登錄原理解析

    隨著公司業(yè)務(wù)的增多,必然會(huì)產(chǎn)生各個(gè)不同的系統(tǒng),如果每個(gè)系統(tǒng)都需要單獨(dú)登錄的話就會(huì)很不方便,所以這個(gè)時(shí)候單點(diǎn)登錄會(huì)很方便,今天通過本文給大家講解NodeJS實(shí)現(xiàn)單點(diǎn)登錄原理解析,感興趣的朋友一起看看吧
    2022-05-05
  • node 利用進(jìn)程通信實(shí)現(xiàn)Cluster共享內(nèi)存

    node 利用進(jìn)程通信實(shí)現(xiàn)Cluster共享內(nèi)存

    本篇文章主要介紹了node 利用進(jìn)程通信實(shí)現(xiàn)Cluster共享內(nèi)存,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • node.js對(duì)于數(shù)據(jù)庫MySQL基本操作實(shí)例總結(jié)【增刪改查】

    node.js對(duì)于數(shù)據(jù)庫MySQL基本操作實(shí)例總結(jié)【增刪改查】

    這篇文章主要介紹了node.js對(duì)于數(shù)據(jù)庫MySQL基本操作,結(jié)合實(shí)例形式總結(jié)分析了node.js針對(duì)mysql數(shù)據(jù)庫基本配置、連接與增刪改查相關(guān)操作技巧,需要的朋友可以參考下
    2023-04-04
  • NodeJS學(xué)習(xí)筆記之(Url,QueryString,Path)模塊

    NodeJS學(xué)習(xí)筆記之(Url,QueryString,Path)模塊

    今天我們來看一下在nodejs中路徑的相關(guān)操作方法。在我們開發(fā)過程中路徑主要有:URL路徑,在瀏覽器中進(jìn)行使用,當(dāng)然這個(gè)也包含查詢字符串QueryString的相關(guān)操作;而另一種是磁盤路徑,主要用于文件等等進(jìn)行操作,我們稱為Path,所以我將它們放在一起進(jìn)行總結(jié)學(xué)習(xí)。
    2015-01-01
  • Nodejs中的this詳解

    Nodejs中的this詳解

    本文給大家匯總介紹了下nodejs中的this,nodejs中的this和在瀏覽器中javascript中的this還是有很大的差異的,小伙伴們可以研究下
    2016-03-03
  • Nodejs + sequelize 實(shí)現(xiàn)增刪改查操作

    Nodejs + sequelize 實(shí)現(xiàn)增刪改查操作

    這篇文章主要介紹了Nodejs + sequelize 實(shí)現(xiàn)增刪改查操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • node.js中的fs.fchown方法使用說明

    node.js中的fs.fchown方法使用說明

    這篇文章主要介紹了node.js中的fs.fchown方法使用說明,本文介紹了fs.fchown方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Node.js中使用mongoskin操作mongoDB實(shí)例

    Node.js中使用mongoskin操作mongoDB實(shí)例

    這篇文章主要介紹了Node.js中使用mongoskin操作mongoDB實(shí)例,Mongous是一個(gè)輕量級(jí)的nodejs mongodb驅(qū)動(dòng),需要的朋友可以參考下
    2014-09-09

最新評(píng)論