国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

改善程序性能和代碼質量:通過代理模式組合HTTP請求

網絡 通信技術
在前端項目中,我們的網頁通常需要向服務器發送多個HTTP請求。假設我們的產品具有一項功能,即每當用戶單擊 li 標記時,客戶端都會向服務器發送一個HTTP請求。

[[387350]]

原文:https://levelup.gitconnected.com/improve-both-app-performance-and-code-quality-combining-http-requests-by-proxy-pattern-2cce132d60

作者:bitfish

在前端項目中,我們的網頁通常需要向服務器發送多個HTTP請求。

假設我們的產品具有一項功能,即每當用戶單擊 li 標記時,客戶端都會向服務器發送一個HTTP請求。

這是一個簡單的Demo:

  1. <html> 
  2.  
  3. <body> 
  4.     <ul> 
  5.         <li>1</li> 
  6.         <li>2</li> 
  7.         <li>3</li> 
  8.         <li>4</li> 
  9.         <li>5</li> 
  10.         <li>6</li> 
  11.         <li>7</li> 
  12.         <li>8</li> 
  13.         <li>9</li> 
  14.     </ul> 
  15.  
  16.     <script> 
  17.         // Suppose this function is used to make HTTP requests to the server 
  18.         var sendHTTPRequest = function(message) { 
  19.             console.log('Start sending HTTP message to the server: ', message) 
  20.             console.log('1000ms passed'
  21.             console.log('HTTP Request is completed'
  22.         } 
  23.  
  24.         var ul = document.getElementsByTagName('ul')[0]; 
  25.  
  26.         ul.onclick = function(event) { 
  27.             if (event.target.nodeName === "LI") { 
  28.  
  29.                 // Executes this function every time the <li> tag is clicked. 
  30.                 sendHTTPRequest(event.target.innerText) 
  31.             } 
  32.         } 
  33.     </script> 
  34. </body> 
  35.  
  36. </html> 

 

 

 

 

在上面的代碼中,我們直接使用簡單的 sendHTTPRequest 函數來模擬發送HTTP請求。這樣做是為了更好地專注于核心目標,因此我簡化了一些代碼。

在上面的代碼中,我們直接使用簡單的 sendHTTPRequest 函數來模擬發送HTTP請求。這樣做是為了更好地專注于核心目標,因此我簡化了一些代碼。

 

 

上面的程序是這樣的:

為了使你們更容易嘗試,我制作了一個Codepen演示:https://codepen.io/bitfishxyz/pen/PobOZMm

當然,在真實的項目中,我們可能會向服務器發送一個文件,推送通知,或者發送一些日志。但為了演示的慣例,我們將跳過這些細節。

好了,這是一個很簡單的演示,那么上面的代碼有沒有什么缺點呢?

如果您的項目非常簡單,那么編寫這樣的代碼應該沒有問題。但是,如果您的項目很復雜,并且客戶端需要頻繁向服務器發送HTTP請求,則此代碼效率很低。

在上面的示例中,如果任何用戶反復快速單擊 li 元素會發生什么?這時,我們的客戶端需要向服務器發出頻繁的HTTP請求,并且每個請求都會消耗大量時間和服務器資源。

客戶端每次與服務器建立新的HTTP連接時,都會消耗一些時間和服務器資源。因此,在HTTP傳輸機制中,一次傳輸所有文件比多次傳輸少量文件更為有效。

例如,您可能需要發送五個HTTP請求,每個HTTP請求的HTTP數據包大小為1MB。現在,您一次發送一個HTTP請求,數據包大小為5MB。通常預期后者的性能要比前一個更好。

網頁上的大量HTTP請求可能會減慢網頁的加載時間,最終損害用戶體驗。如果加載速度不夠快,這可能會導致訪問者更快地離開該頁面。

因此,在這種情況下,我們可以考慮合并HTTP請求。

在我們目前的項目中,我的思路是這樣的:我們可以在本地設置一個緩存,然后在一定范圍內收集所有需要發送給服務器的消息,然后一起發送。

你可以暫停一下,自己試著想辦法。

提示:您需要創建一個本地緩存對象來收集需要發送的消息。然后,您需要使用定時器定時發送收集到的消息。

這是一個實現。

  1. var messages = []; 
  2. var timer; 
  3. var sendHTTPRequest = function (message) { 
  4.   messages.push(message); 
  5.   if (timer) { 
  6.     return
  7.   } 
  8.   timer = setTimeout(function () { 
  9.     console.log("Start sending messages: ", messages.join(",")); 
  10.     console.log("1000ms passed"); 
  11.     console.log("HTTP Request is completed."); 
  12.  
  13.     clearTimeout(timer); 
  14.     timer = null
  15.     messages = []; 
  16.   }, 2000); 
  17. }; 

每當客戶端需要發送消息,也就是觸發一個 onclick 事件的時候,sendHTTPRequest 并不會立即向服務器發送消息,而是先將消息緩存在消息中。然后,我們有一個計時器,該計時器在2秒鐘后執行,并且在2秒鐘后,該計時器會將所有先前緩存的消息發送到服務器。此更改達到了組合HTTP請求的目的。

測試結果如下:

如你所見,盡管我們多次觸發點擊事件,但在兩秒鐘內,我們只發送了一個HTTP請求。

當然,為了方便演示,我將等待時間設置為2秒。如果你覺得這個等待時間太長,你可以縮短這個等待時間。

對于不需要太多實時交互的項目,2秒的延遲并不是一個巨大的副作用,但它可以減輕服務器的很多壓力。在適當的情況下,這是非常值得的。

上面的代碼確實為項目提供了一些性能改進。但是就代碼設計而言,上面的代碼并不好。

第一,違反了單一責任原則。sendHTTPRequest 函數不僅向服務器發送HTTP請求,而且還組合HTTP請求。該函數執行過多操作,使代碼看起來非常復雜。

如果某個功能(或對象)承擔了過多的責任,那么當我們的需求發生變化時,該功能通常將不得不發生重大變化。這樣的設計不能有效地應對可能的更改,這是一個糟糕的設計。

我們理想的代碼如下所示:

我們沒有對 sendHTTPRequest 進行任何更改,而是選擇為其提供代理。這個代理函數執行合并HTTP請求的任務,并將合并后的消息傳遞給 sendHTTPRequest 發送。然后我們以后就可以直接使用 proxySendHTTPRequest 方法了。

您可以暫停片刻,然后嘗試自己解決。

這是一個實現:

  1. var proxySendHTTPRequest = (function() { 
  2.   var messages = [], 
  3.       timer; 
  4.   return function(message) { 
  5.     messages.push(message); 
  6.     if (timer) { 
  7.       return
  8.     } 
  9.     timer = setTimeout(function() { 
  10.       sendHTTPRequest(messages.join(",")); 
  11.       clearTimeout(timer); 
  12.       timer = null
  13.       messages = []; 
  14.     }, 2000); 
  15.   }; 
  16. })(); 

其基本思想與前面的代碼類似,該代碼使用 messages 變量在一定時間內緩存所有消息,然后通過計時器統一地發送它們。此外,這段代碼使用了閉包技巧,將 messages 和 timer 變量放在局部作用域中,以避免污染全局名稱空間。

這段代碼與前面的代碼最大的區別是它沒有更改 sendHTTPRequest 函數,而是將其隱藏在 proxySendHTTPRequest 后面。我們不再需要直接訪問 sendHTTPRequest,而是使用代理 proxySendHTTPRequest 來訪問它。proxySendHTTPRequest 與sendHTTPRequest 具有相同的參數列表和相同的返回值。

這樣的設計有什么好處?

  • 發送HTTP請求和合并HTTP請求的任務交給了兩個不同的函數,每個函數專注于一個職責。它遵從單一責任原則,并使代碼更容易理解。
  • 由于兩個函數的參數是相同的,我們可以簡單地用 proxySendHTTPRequest 替換 sendHTTPRequest 的位置,而不需要做任何重大更改。

想象一下,如果將來網絡性能有所提高,或者由于某些其他原因,我們不再需要合并HTTP請求。在這一點上,如果我們使用以前的設計,我們將不得不再次大規模地更改代碼。在當前的代碼設計中,我們可以簡單地替換函數名。

事實上,這個編碼技巧通常被稱為設計模式中的代理模式。

所謂的代理模式,其實在現實生活中很好理解。

  • 比方說,你想訪問一個網站,但你不想泄露你的IP地址。那么你可以使用,先訪問你的代理服務器,然后通過代理服務器訪問目標網站。這樣目標網站就無法知道你的IP地址了。
  • 有時候,你會把你的真實服務器隱藏在Nginx服務器后面,讓Nginx服務器為你的真實服務器處理一些瑣碎的操作。

這些都是現實生活中代理模式的例子。

我們不需要為代理模式(或任何其他設計模式)的正式定義而煩惱,我們只需要知道,當客戶端沒有直接訪問它的便利(或能力)時,我們可以提供代理功能(或對象)來控制對目標功能(或對象)的訪問即可。客戶機實際上訪問代理函數(或對象),代理函數對請求進行一些處理,然后將請求傳遞給目標。

本文轉載自微信公眾號「前端全棧開發者」,可以通過以下二維碼關注。轉載本文請聯系前端全棧開發者公眾號。

 

責任編輯:武曉燕 來源: 前端全棧開發者
相關推薦

2012-11-28 11:09:28

IBMdW

2020-12-29 15:00:46

PerfVTune工具

2010-08-10 13:58:00

Flex性能測試

2020-12-08 06:24:08

Java 代碼工具

2010-02-04 09:41:03

Android應用程序

2010-07-28 09:25:41

jQueryJavaScript性

2019-03-01 09:55:28

HTTPMock架構

2025-07-23 08:23:53

2009-07-01 18:24:59

JSP應用程序JMeter

2010-06-11 10:19:22

systemd

2013-12-17 17:05:20

iOS性能優化

2018-11-20 10:50:00

Java性能優化編程技巧

2021-08-18 09:37:51

數據庫移動應用程序

2019-10-17 10:10:23

優化Web前端

2019-02-01 09:50:00

提升Python程序性能

2010-05-20 18:40:33

IIS服務器

2018-11-06 09:53:27

2012-05-19 22:24:34

MVVM

2024-11-04 11:02:56

2023-12-13 13:41:00

代碼Java程序員
點贊
收藏

51CTO技術棧公眾號

欧美国产精品专区| julia一区二区中文久久94| 欧美性xxxxx极品娇小| 亚洲第一福利网| 精品偷拍一区二区三区在线看| 正义之心1992免费观看全集完整版| 日韩一区二区欧美| 四虎4hu永久免费入口| 97av视频在线观看| 日韩欧美亚洲在线| 91视频九色网站| 日韩免费av电影| 国产a久久麻豆| 欧美日韩精品高清| 亚洲欧洲精品一区二区| 欧美日一区二区| xvideos成人免费中文版| yellow在线观看网址| 97人人爽人人喊人人模波多| 热re99久久精品国99热蜜月| gogogogo高清视频在线| 福利精品一区| 成人综合在线网站| 吴梦梦av在线| rebdb初裸写真在线观看| 亚洲女人天堂av| 日本a在线免费观看| 国产不卡一区二区视频| 欧美日韩国产一区二区三区地区| 看女生喷水的网站在线观看| 韩国v欧美v亚洲v日本v| 欧美日韩福利电影| 2020国产精品久久精品不卡| 免费高清在线| 亚洲涩涩av| 99re这里只有精品视频首页| 久久九九有精品国产23| 欧美黑人巨大xxx极品| av在线观看地址| 牛牛精品成人免费视频| 樱桃国产成人精品视频| 国产一区在线播放| 欧美日韩mv| 亚洲深夜福利在线| 不卡视频一区二区| 亚洲色图第一区| 欧美在线播放一区二区| 成人永久看片免费视频天堂| 免费看日本毛片| 免费精品国产的网站免费观看| 亚洲天堂av综合网| 亚洲人成精品久久久| 手机在线看福利| 成人看的视频| 97操在线视频| 国产人久久人人人人爽| 秋霞久久久久久一区二区| 午夜久久黄色| 在线观看不卡一区| 日本中文字幕电影在线免费观看| 亚洲一区激情| 亚洲一区二区三区四区视频| 欧美日韩mv| 欧美综合在线第二页| 激情综合在线| 日韩午夜在线影院| 最新国产精品拍自在线播放| 色琪琪丁香婷婷综合久久| 日韩av网站在线观看| 国产mv免费观看入口亚洲| 日本不良网站在线观看| 亚洲国产另类av| av女优在线播放| 亚洲国产欧美日韩另类综合| 成人在线app| 欧美日韩第一页| 日韩视频一区| 97伦理在线四区| 成人一区二区在线观看| 360天大佬第二季在线观看| 国产清纯在线一区二区www| 黄网在线观看| 午夜电影一区二区三区| 中文字幕成人在线视频| 99re热视频精品| 欧美巨乳在线| 欧美三级欧美成人高清www| 玛雅亚洲电影| 国产午夜精品麻豆| 国产精品久久久久久影院8一贰佰| 国内自拍欧美激情| 国产精品美女久久久久人| 一区二区三区高清国产| av资源中文在线天堂| 欧美丰满高潮xxxx喷水动漫| 91官网在线| 欧美精品精品一区| 香蕉精品久久| 国产成人精品视频| 国产成人精品免费在线| av一区在线观看| 国产99在线|中文| 成人短片线上看| 日韩a级在线观看| 日韩午夜av电影| 99精品综合| 成人免费淫片| 亚洲超碰精品一区二区| 日韩欧乱色一区二区三区在线| xvideos亚洲人网站| 在线日韩中文| 免费99视频| 麻豆高清免费国产一区| 日本美女爱爱视频| 欧美性大战久久久久久久蜜臀| 欧美亚洲天堂| 亚洲天堂一区二区三区| 四虎国产精品免费久久| 亚洲欧洲一区二区福利| 国产99久久久国产精品潘金网站| 在线播放毛片| 国产精品亚洲综合| 国产精品77777| 成人免费在线观看视频网站| 亚洲午夜一区二区| 1区2区3区在线观看| 欧美亚洲成人免费| 欧美日韩在线大尺度| 日日噜噜噜夜夜爽爽狠狠| 91禁外国网站| 一本色道久久| 风间由美一区| 中文字幕成人在线| 综合伊思人在钱三区| 久久99爱视频| 68精品久久久久久欧美| 亚洲欧美在线aaa| 国产在线观看a视频| 福利视频久久| 国产在线看一区| 香蕉521av成人网| 欧美日韩精品系列| 99国产精品久久久久久久成人热| 69久久精品| 欧美在线播放一区二区| 亚洲福利视频网| 国产成人亚洲精品青草天美| 嫩草伊人久久精品少妇av杨幂| 国产精品久久久久久久久久久不卡| 在线电影一区| 91se在线| 一区不卡字幕| 少妇av一区二区三区| 国产视频一区在线观看| 欧美日韩在线资源| 日韩中文字幕在线精品| 久久夜色精品国产欧美乱极品| 在线免费91| 一区二区三区在线播放欧美| 成人国产精品免费观看| www.亚洲资源| www.日韩视频| 亚洲视频精选在线| 99热国内精品永久免费观看| aaa日本高清在线播放免费观看| 久久亚洲一区二区| 亚洲网站在线播放| 亚洲精品一二三| 日韩电影大全网站| 国产乱肥老妇国产一区二 | 黑人精品视频| 午夜精品三级视频福利| 五月天亚洲婷婷| 免费一级欧美在线观看视频| 亚洲综合在线小说| 亚洲精品一区二区三区影院 | 天天干天天综合| 99在线视频播放| 亚洲九九九在线观看| 亚洲欧美一区二区在线观看| 很黄很黄激情成人| 日本a级黄色| 日韩资源在线观看| 亚洲国产日韩av| 国产呦萝稀缺另类资源| 成人久久综合| 中文字幕av一区二区三区佐山爱| 午夜男人视频在线观看| 91精品国产色综合久久不卡98口 | 国产一区二区激情| 亚洲人成网站色在线观看| 久久久久久夜| 91xxx在线观看| 男女视频网站在线观看| 91久久国产婷婷一区二区| 国产亚洲欧美视频| 色噜噜久久综合| 成人羞羞动漫| 桃子视频成人app| 在线视频一区观看|