高性能 JavaScript - Ajax

這幾天分享一下我看《高性能 JavaScript》的學(xué)習(xí)筆記荠医,希望能對(duì)大家有所幫助扰路。

請(qǐng)求數(shù)據(jù)

一共 5 種從服務(wù)器請(qǐng)求數(shù)據(jù)的方式:

  • XMLHttpRequest (XHR)
  • 動(dòng)態(tài)腳本注入
  • iframe
  • Comet
  • Multipart XHR

其中 iframe 和 Comet 只有在特殊情況下會(huì)被使用。

XHR

XHR 是最最常用的數(shù)據(jù)請(qǐng)求工具了谒亦。它不止有 get 方法竭宰,還有 post、put诊霹、delete 這些方法羞延。像 Axios 這類數(shù)據(jù)請(qǐng)求庫(kù)就是 XHR 的封裝。

動(dòng)態(tài)注入腳本

動(dòng)態(tài)注入腳本其實(shí)就是在 DOM 中添加指定 src 的 <script> 標(biāo)簽脾还。

var scriptElement = document.createElement('script')
scriptElement.src = 'http://whale.ke.com/getList?name="123"&id=888'
document.getElementByTagName('head')[0].appendChild(scriptElement)

Multipart XHR

這種方案其實(shí)也是基于 XHR 的:

  1. 客戶端使用 XHR 發(fā)起請(qǐng)求
  2. 服務(wù)器端響應(yīng)多條數(shù)據(jù)的合成。
  3. 客戶端收到響應(yīng)后拆分?jǐn)?shù)據(jù)入愧、解析數(shù)據(jù)鄙漏。
  4. 由于這種合成數(shù)據(jù)一般很大,我們可以使用輪詢現(xiàn)有響應(yīng)數(shù)據(jù)流來(lái)逐步獲取數(shù)據(jù)棺蛛。

發(fā)送數(shù)據(jù)

一共兩種發(fā)送數(shù)據(jù)的方式:

  • XHR
  • 信標(biāo)

XHR

上面我們提到了 XHR 能夠發(fā)送各類 http 請(qǐng)求怔蚌,所以給服務(wù)器發(fā)送數(shù)據(jù)必然沒(méi)有問(wèn)題。無(wú)論是 GET 還是 POST 都可以做到傳輸數(shù)據(jù)到服務(wù)器端旁赊。

但是 URL 是有長(zhǎng)度限制的桦踊,在處理類似表單這類大量數(shù)據(jù)的提交時(shí),最好還是用 POST 方法终畅。

信標(biāo)

信標(biāo)的創(chuàng)建方法(類似于動(dòng)態(tài)腳本注入):

  1. 創(chuàng)建 Image 對(duì)象
  2. 為 Image 對(duì)象 src 定義 URL
var url = "/status_tracker.php"
var params = [
  "step=2",
  "time=1243879"
]

(new Image()).src = url + "?" + params.join('&')

這樣就可以向服務(wù)器端發(fā)送 URL 拼接出的數(shù)據(jù)了籍胯。同樣的,由于 URL 長(zhǎng)度限制离福,無(wú)法傳輸大量數(shù)據(jù)杖狼。

優(yōu)點(diǎn):它是給服務(wù)器回傳消息最有效的方式。性能消耗很小妖爷,且服務(wù)端錯(cuò)誤不會(huì)影響客戶端運(yùn)行蝶涩。
缺點(diǎn):有 URL 長(zhǎng)度限制,返回的信息很少絮识。

那么提交數(shù)據(jù)的方式怎么選呢绿聘?

  • 如果要提交大量數(shù)據(jù),建議用 XHR
  • 如果只是要發(fā)送簡(jiǎn)單數(shù)據(jù)到服務(wù)器端次舌,用信標(biāo)熄攘。

數(shù)據(jù)格式

常用的數(shù)據(jù)格式有以下幾種:

  • XML —— 笨重而完善的數(shù)據(jù)格式,兼容性很好垃它,性能不佳鲜屏。
  • JSON —— 性能表現(xiàn)最好的數(shù)據(jù)格式
  • JSON-P —— 動(dòng)態(tài)注入的 JSON 腳本烹看,解析快、能跨域洛史、但不安全惯殊。
  • HTML —— 特定場(chǎng)景下的數(shù)據(jù)格式
  • 自定義格式 —— 自己約定的數(shù)據(jù)格式,性能好也殖,但是需要約定解析方法土思。

總的來(lái)說(shuō),對(duì)于一般情況 JSON 是表現(xiàn)最好的數(shù)據(jù)格式忆嗜。如果數(shù)據(jù)集很大并且對(duì)解析時(shí)間有要求己儒,可以使用以下兩種方案之一:

  • JSON-P:使用動(dòng)態(tài)腳本注入技術(shù)注入,通過(guò)執(zhí)行 JavaScript 而非解析字符串的方式來(lái)獲取數(shù)據(jù)捆毫。它解析速度極快闪湾、還可以跨域進(jìn)行,但是不安全绩卤。
  • 使用字符分隔的自定義格式途样,利用動(dòng)態(tài)腳本注入或者 XHR 獲取自定義格式數(shù)據(jù)后,通過(guò) split() 方法解析自定義字符串濒憋。這種方法速度快何暇、數(shù)據(jù)文件小。

Ajax 性能優(yōu)化

  • 緩存數(shù)據(jù)凛驮,最快的請(qǐng)求就是沒(méi)有請(qǐng)求裆站。
  • 設(shè)置 HTTP 頭部信息
  • 本地?cái)?shù)據(jù)存儲(chǔ)
  • 注意使用 Ajax 類庫(kù)會(huì)有一些局限,如不能訪問(wèn) readyState 所以不能實(shí)現(xiàn) MXHR黔夭。

小結(jié)

整體看下來(lái)宏胯,動(dòng)態(tài)腳本注入來(lái)加載數(shù)據(jù)也是不錯(cuò)的數(shù)據(jù)獲取方式。而 XHR + JSON 是現(xiàn)階段最流行的數(shù)據(jù)傳輸方式纠修。在性能上也表現(xiàn)不錯(cuò)胳嘲。

更多 Ajax 的優(yōu)化,還需要好好學(xué)習(xí) HTTP 相關(guān)知識(shí)扣草,如設(shè)置頭部信息了牛、設(shè)置緩存、過(guò)期時(shí)間辰妙、http2 等知識(shí)點(diǎn)鹰祸。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市密浑,隨后出現(xiàn)的幾起案子蛙婴,更是在濱河造成了極大的恐慌,老刑警劉巖尔破,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件街图,死亡現(xiàn)場(chǎng)離奇詭異浇衬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)餐济,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門耘擂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人絮姆,你說(shuō)我怎么就攤上這事醉冤。” “怎么了篙悯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蚁阳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我鸽照,道長(zhǎng)螺捐,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任矮燎,我火速辦了婚禮归粉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘漏峰。我一直安慰自己,他們只是感情好届榄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布浅乔。 她就那樣靜靜地躺著,像睡著了一般铝条。 火紅的嫁衣襯著肌膚如雪靖苇。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天班缰,我揣著相機(jī)與錄音贤壁,去河邊找鬼。 笑死埠忘,一個(gè)胖子當(dāng)著我的面吹牛脾拆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播莹妒,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼名船,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了旨怠?” 一聲冷哼從身側(cè)響起渠驼,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鉴腻,沒(méi)想到半個(gè)月后迷扇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體百揭,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年蜓席,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了器一。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓮床,死狀恐怖盹舞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情隘庄,我是刑警寧澤踢步,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站丑掺,受9級(jí)特大地震影響获印,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜街州,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一兼丰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唆缴,春花似錦鳍征、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至趟紊,卻和暖如春氮双,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背霎匈。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工戴差, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铛嘱。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓暖释,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親弄痹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子饭入,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容