自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Node.js開發(fā)指南:利用Socket.IO與doT提升性能表現(xiàn)

譯文
開發(fā) 前端
如果您的網(wǎng)站對于向客戶機(jī)發(fā)送數(shù)據(jù)較為依賴,那么使用客戶端模板以及WebSocket能夠顯著提高其性能表現(xiàn)。在今天的教程中,我們就一起來了解如何實(shí)現(xiàn)這一目標(biāo)。

教程介紹

  • 難度: 中級(jí)
  • 預(yù)計(jì)完成時(shí)間: 20分鐘

如果您的網(wǎng)站對于向客戶機(jī)發(fā)送數(shù)據(jù)較為依賴,那么使用客戶端模板以及WebSocket能夠顯著提高其性能表現(xiàn)。在今天的教程中,我們就一起來了解如何實(shí)現(xiàn)這一目標(biāo)。

簡介

我 們將以現(xiàn)有應(yīng)用程序?yàn)槠瘘c(diǎn),一步步了解如何使其在高流量環(huán)境下?lián)碛懈斓捻憫?yīng)速度與更可靠的運(yùn)行表現(xiàn)。我將向大家展示如何從應(yīng)用程序代碼中準(zhǔn)確定位對應(yīng)代 碼段,如何對其進(jìn)行修改以提升運(yùn)行性能。不過首先大家需要下載我準(zhǔn)備好的范例應(yīng)用。這款應(yīng)用的內(nèi)容非常簡單,運(yùn)行目的在于隨機(jī)顯示服務(wù)器當(dāng)中的帖子內(nèi)容 ——不過對于我們這篇指南文章來講,這已經(jīng)足夠了。

***步: 準(zhǔn)備

對我們已經(jīng)下載完成的文件進(jìn)行解壓,為其選定文件夾或者保存位置,而后加以運(yùn)行:

 

現(xiàn)在我前往http://localhost:8080/看其內(nèi)容。這時(shí)大家應(yīng)該只能看到一個(gè)按。各位需要準(zhǔn)一款安裝了各發(fā)者工具的瀏覽器,這樣就能掌握HTTP求的實(shí)際大小。打開開發(fā)者工具,而后訪問Network標(biāo)簽。接下來點(diǎn)幾下,注意/getpost請求的大?。?/span>

這條請求只有830字節(jié),對吧?好的,想象一下,當(dāng)我們的網(wǎng)站人氣爆棚時(shí),可能同時(shí)有一百多萬用戶想看到這篇帖子,這時(shí)請求的數(shù)據(jù)總量將達(dá)到約830MB。請注意,是每篇帖子830MB!這可就不是個(gè)小數(shù)目了。

第二步: 檢查

在 第二步中,我將帶領(lǐng)大家了解如何在應(yīng)用中找到能夠提升性能表現(xiàn)的對應(yīng)代碼片段。在前一步中,大家已經(jīng)找到了用于獲取帖子內(nèi)容的請求,現(xiàn)在我們需要了解代碼 是如何實(shí)現(xiàn)這一過程的。大家可以利用自己熟悉的代碼編輯器打開index.js文件,其中第16到第20行內(nèi)容如下所示:

  1. varpostTemplate = dot(fs.readFileSync('./post.dot')); 
  2.   
  3. app.get('/getpost'function(req, res) { 
  4.    res.end(postTemplate(posts[Math.floor(Math.random() * 3)])); 
  5. }); 

就是它了!首先,帖子的模板會(huì)被編譯至postTemplate變量當(dāng)中。接下來,該模板會(huì)在/getpostGET請求中實(shí)現(xiàn)提交。這是一種非常典型的解決辦法,可以說是乏善可陳。我們要對其進(jìn)行變更以改進(jìn)性能表現(xiàn)。

第三步: 設(shè)置Socket.IO

To begin the improvements, first, install Socket.IO. In your terminal type:為了實(shí)現(xiàn)性能提升,我們首先需要安裝Socket.IO。大家需要在命令行終端內(nèi)輸入:

  1. npm installsocket.io 

等待命令執(zhí)行完成。通將以下代行添加到index.js的全部require之后將socket.io引入代

 

  1. varsio = require('socket.io');

現(xiàn)在大家必須對Express設(shè)進(jìn)行修改,以使其與Socket.IO協(xié)作。首先,在app  definition之后加入下列內(nèi)容:

  1. varserver = require('http').createServer(app); 
  2. vario = require('socket.io').listen(server); 
  3.   
  4. server.listen(8080);

接下來移除該文件中的***一行:

之所以這么做,是因?yàn)镾ocket.IO的運(yùn)作與HTTP Server緊密相關(guān)——而非Express app。

現(xiàn)在,如果大家運(yùn)行該應(yīng)用,應(yīng)該會(huì)在自己的終端中看到如下所示的內(nèi)容:
 

 #p#

第四步: 客戶端模板

為了著手提升應(yīng)用性能,大家需要將 經(jīng)過編譯的模板保存在客戶端當(dāng)中。JavaScript文件會(huì)駐留在緩存當(dāng)中,因此我們只要下載一次即可。為了編譯模板,我們需要訪問 http://olado.github.io/doT/index.html并下滾到Usage部分。由于我們不必在用戶每一次訪問網(wǎng)站時(shí)都對模板進(jìn)行 編譯,因此大家完全可以直接把編譯后的函數(shù)添加到代碼當(dāng)中。打開post.dot文件,將其內(nèi)容如下所示粘貼到Template字段當(dāng)中:
 

現(xiàn)在將該字段的內(nèi)容復(fù)制并粘貼到static/main.js文件的最初始位置。變更或者移除anonymous函數(shù)名稱并將其分配至postTemplate變量,具體方式如下:

 

  1. varpostTemplate = function(it) { ... }

然后打開index.js文件并移除所有未使用的代碼行,因?yàn)閺默F(xiàn)在開始,我們已經(jīng)不必在服務(wù)器端對模板進(jìn)行編譯了:

 

  1. vardot = require('dot').template; 
  2. varfs = require('fs'); 
  3.   
  4. ... 
  5.   
  6. varpostTemplate = dot(fs.readFileSync('./post.dot')); 

post.dot 文件也可以刪掉,沒關(guān)系的。

第五步: 從AJAX到WebSocket

相 對于以往利用AJAX實(shí)現(xiàn)與服務(wù)器通信的做法,現(xiàn)在我們轉(zhuǎn)而使用WebSocket。***的辦法是使用Socket.IO,這是因?yàn)閃ebSocket API本身并不提供故障轉(zhuǎn)移功能——理由是用戶的瀏覽器不支持。服務(wù)器已經(jīng)設(shè)置完成,因此我們現(xiàn)在需要與之進(jìn)行對接。首先,將下列代碼添加到 static/index.html文件(在main.js之前)的head位置:

  1. <scriptsrcscriptsrc="/socket.io/socket.io.js"></script>

接下來,打開static/main.js文件并在模板definition之后添加以下代碼:

  1. varsocket = io.connect(); 

它 將與Socket.IO服務(wù)器相連(請注意,大家必須提前將Socket.IO的腳本添加到頁面當(dāng)中)。由于在我們的實(shí)驗(yàn)環(huán)境中,服務(wù)器與客戶端運(yùn)行在同 一臺(tái)主機(jī)當(dāng)中,因此大家不必再為該函數(shù)添加任何額外參數(shù)?,F(xiàn)在我們要做的是為該socket添加一個(gè)事件監(jiān)聽器,這樣帖子內(nèi)容獲取完畢后我們就能及時(shí)得到 提示。將下列代碼添加到之前代碼行的后面:

  1. socket.on('getpost', function(data) { 
  2.    $('button').after(postTemplate(data)); 
  3. }); 

如大家所見,回調(diào)命令的內(nèi)容與jQuery的$.ajax()方法中的success回調(diào)并無區(qū)別,但它會(huì)首先運(yùn)行數(shù)據(jù)中的模板函數(shù)?,F(xiàn)在,將$.ajax()調(diào)用替代為以下內(nèi)容:

 

  1. socket.emit('getpost'); 

這一行代碼的作用在于通知服務(wù)器,用戶希望顯示一篇新帖子。當(dāng)然,在現(xiàn)實(shí)生活的應(yīng)用程序內(nèi),服務(wù)器會(huì)在帖子發(fā)布后立刻加以發(fā)送。

第六步: 發(fā)送帖子

到這里,客戶端已經(jīng)能夠與服務(wù)器對接并請求獲取帖子內(nèi)容,但服務(wù)器還無法正確響應(yīng)隨機(jī)帖子。現(xiàn)在我們打開index.js文件并對內(nèi)容加以變更。由原本的:

  1. app.get('/getpost', function(req, res) { 
  2.    res.end(postTemplate(posts[Math.floor(Math.random() * 3)])); 
  3. }); 

變更為:

  1. io.sockets.on('connection', function(socket) { 
  2.    socket.on('getpost', function() { 
  3.       socket.emit('getpost', posts[Math.floor(Math.random() * 3)]); 
  4.    }); 
  5. }); 

這 將使服務(wù)器將getpost句柄與所有客戶端相連,并利用隨機(jī)帖子內(nèi)容作為響應(yīng)?,F(xiàn)在大家可以再次運(yùn)行應(yīng)用程序以查看實(shí)際效果。接下來我們要再次打開瀏覽 器中的開發(fā)者工具、找到Network標(biāo)簽并加以過濾,這樣大家就只會(huì)看到WebSocket。現(xiàn)在點(diǎn)擊這個(gè)惟一可見的對象,大家應(yīng)該看到瀏覽器與服務(wù)器 之間的傳輸?shù)臄?shù)據(jù)——是的,請求大小與文章開頭的初始狀態(tài)相比有了明顯縮減。這是因?yàn)閯傞_始請求當(dāng)中還包含有服務(wù)器端模板與AJAX內(nèi)容(長度單位為‘字 節(jié)’):

總結(jié)

如各位所見,利用WebSocket以及客戶端模板(幾乎一定)能夠改進(jìn)應(yīng)用程序的性能表現(xiàn)及耐用性。我敢肯定,很多網(wǎng)站都采用這種方式提升自己的響應(yīng)效果。當(dāng)然,我也希望各位朋友能夠利用這項(xiàng)技巧為自己的移動(dòng)及桌面系統(tǒng)用戶帶來更出色的使用體驗(yàn)。
 

原文鏈接:http://net.tutsplus.com/tutorials/javascript-ajax/node-js-better-performance-with-socket-io-and-dot/

 

責(zé)任編輯:陳四芳 來源: 51CTO
相關(guān)推薦

2015-03-10 10:59:18

Node.js開發(fā)指南基礎(chǔ)介紹

2014-08-01 09:57:52

Node.jsNode.js插件

2017-09-05 15:30:00

JavascriptSocket.ioNode.js

2015-07-15 12:53:05

Node.jsSocket.io遠(yuǎn)程控制

2019-07-26 14:40:58

Vue.jsSocket.IO前端

2011-11-10 08:55:00

Node.js

2011-12-06 09:55:25

移動(dòng)Web

2021-02-01 15:42:45

Node.jsSQL應(yīng)用程序

2016-11-22 13:25:28

Apache Spar大數(shù)據(jù)

2015-12-14 10:39:14

2019-03-29 16:40:02

Node.js多線程前端

2014-08-26 11:09:31

開發(fā)技術(shù)周刊

2022-10-28 15:51:24

JavaScript開發(fā)Node.js

2017-11-27 11:59:40

Node.JSChrome調(diào)試程序

2013-11-01 09:34:56

Node.js技術(shù)

2019-07-09 14:50:15

Node.js前端工具

2021-01-11 09:00:00

開發(fā)Node.js后端

2022-06-07 08:07:05

GoNode.js

2014-06-10 13:54:05

Node.jsSocket.IOWebSocket

2022-10-12 08:00:00

語音識(shí)別Node.js音頻質(zhì)量
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)