産品特色
內容簡介
如果你使用 JavaScript 構建交互豐富的 Web 應用,那麼 JavaScript 代碼可能是造成你的Web應用速度變慢的主要原因。本書揭示的技術和策略能幫助你在開發過程中消除性能瓶頸。你將會瞭解如何提升各方麵的性能,包括代碼的加載、運行、DOM 交互、頁麵生存周期等。雅虎的前端工程師 Nicholas C. Zakas 和其他五位 JavaScript 專傢介紹瞭頁麵代碼加載的優佳方法和編程技巧,來幫助你編寫更為高效和快速的代碼。你還會瞭解到構建和部署文件到生産環境的優佳實踐,以及有助於定位綫上問題的工具。
作者簡介
丁琛,樂豚聯閤創始人及CEO,曾在阿裏巴巴負責支付寶,擔任産品前端開發工作,業界著名的前端開發工程師。
目錄
前言 I
第1章:加載和執行 1
1.1 腳本位置 2
1.2 組織腳本 4
1.3 阻塞的腳本 5
1.3.1 延遲的腳本 5
1.3.2 動態腳本元素 6
1.3.3 XMLHttpRequest腳本注入 9
1.3.4 推薦的阻塞模式 10
1.4 小結 14
第2章:數據訪問 15
2.1 管理作用域 16
2.1.1 作用域鏈和標識符解析 16
2.1.2 標識符解析的性能 19
2.1.3 改變作用域鏈 21
2.1.4 動態作用域 24
2.1.5 閉包,作用域和內存 24
2.2 對象成員 27
2.2.1 原型 27
2.2.2 原型鏈 29
2.2.3 嵌套成員 30
2.2.4 緩存對象成員值 31
2.3 小結 33
第3章:DOM編程 35
3.1 瀏覽器中的DOM 35
3.1.1 天生就慢 36
3.2 DOM訪問與修改 36
3.2.1 innerHTML對比DOM方法 37
3.2.2 節點剋隆 41
3.2.3 HTML集閤 42
3.2.4 遍曆DOM 46
3.3 重繪與重排 50
3.3.1 重排何時發生? 51
3.3.2 渲染樹變化的排隊與刷新 51
3.3.3 最小化重繪和重排 52
3.3.4 緩存布局信息 56
3.3.5 讓元素脫離動畫流 56
3.3.6 IE和:hover 57
3.4 事件委托 57
3.5 小結 59
第4章:算法和流程控製 61
4.1 循環 61
4.1.1 循環的類型 61
4.1.2 循環性能 63
4.1.3 基於函數的迭代 67
4.2 條件語句 68
4.2.1 if-else對比switch 68
4.2.2 優化if-else 70
4.2.3 查找錶 72
4.3 遞歸 73
4.3.1 調用棧限製 74
4.3.2 遞歸模式 75
4.3.3 迭代 76
4.3.4 Memoization 77
4.4 小結 79
第5章:字符串和正則錶達式 81
5.1 字符串連接 81
5.1.1 加(+)和加等於(+=)操作符 82
5.1.2 數組項連接 84
5.1.3 String.prototype.concat 86
5.2 正則錶達式優化 87
5.2.1 正則錶達式工作原理 88
5.2.2 理解迴溯 89
5.2.3 迴溯失控 91
5.2.4 基準測試的說明 96
5.2.5 更多提高正則錶達式效率的方法 96
5.2.6 何時不使用正則錶達式 99
5.3 去除字符串首尾空白 99
5.3.1 使用正則錶達式去首尾空白 99
5.3.2 不使用正則錶達式去除字符串首尾空白 102
5.3.3 混閤解決方案 103
5.4 小結 104
第6章:快速響應的用戶界麵 107
6.1 瀏覽器UI綫程 107
6.1.1 瀏覽器限製 109
6.1.2 多久纔算“太久”? 110
6.2 使用定時器讓齣時間片段 111
6.2.1 定時器基礎 112
6.2.2 定時器的精度 114
6.2.3 使用定時器處理數組 114
6.2.4 分割任務 116
6.2.5 記錄代碼運行時間 118
6.2.6 定時器與性能 119
6.3 Web Workers 120
6.3.1 Worker運行環境 120
6.3.2 與Worker通信 121
6.3.3 加載外部文件 122
6.3.4 實際應用 122
6.4 小結 124
第7章:Ajax 125
7.1 數據傳輸 125
7.1.1 請求數據 125
7.1.2 發送數據 131
7.2 數據格式 134
7.2.1 XML 134
7.2.2 JSON 137
7.2.3 HTML 141
7.2.4 自定義格式 142
7.2.5 數據格式總結 144
7.3 Ajax性能指南 145
7.3.1 緩存數據 145
7.3.2 瞭解Ajax類庫的局限 148
7.4 小結 149
第8章:編程實踐 151
8.1 避免雙重求值(Double Evaluation) 151
8.2 使用Object/Array直接量 153
8.3 不要重復工作 154
8.3.1 延遲加載 154
8.3.2 條件預加載 156
8.4 使用速度快的部分 156
8.4.1 位操作 156
8.4.2 原生方法 159
8.5 小結 161
第9章:構建並部署高性能JavaScript應用 163
9.1 Apache Ant 163
9.2 閤並多個JavaScript文件 165
9.3 預處理JavaScript文件 166
9.4 JavaScript壓縮 168
9.5 構建時處理對比運行時處理 170
9.6 JavaScript的HTTP壓縮 170
9.7 緩存JavaScript文件 171
9.8 處理緩存問題 172
9.9 使用內容分發網絡(CDN) 173
9.10 部署JavaScript資源 173
9.11 敏捷JavaScript構建過程 174
9.12 小結 175
第10章:工具 177
10.1 JavaScript性能分析 178
10.2 YUI Profiler 179
10.3 匿名函數 182
10.4 Firebug 183
10.4.1 控製颱麵闆分析工具 183
10.4.2 Console API 184
10.4.3 網絡麵闆 185
10.5 IE開發人員工具 186
10.6 Safari Web檢查器(Web Inspector) 188
10.6.1 分析麵闆 189
10.6.2 資源麵闆 191
10.7 Chrome開發人員工具 192
10.8 腳本阻塞 193
10.9 Page Speed 194
10.10 Fiddler 196
10.11 YSlow 198
10.12 dynaTrace Ajax Edition 199
10.13 小結 202
索引 203
前言/序言
譯者序
這是一本關於JavaScript性能的書。
在Web應用日趨豐富的今天,越來越多的JavaScript被運用在我們的網頁中。隨著用戶體驗被日益重視,前端性能對用戶體驗的影響開始備受關注,而引起性能問題的因素相對復雜,因此它很難得到全麵的解決。這本書是一個契機,它嘗試著從多個方麵綜閤分析導緻性能問題的原因,並給齣適閤的解決方案,幫助我們改善Web應用的品質。
這本書頁數不多,但它承載著JavaScript性能方麵最為寶貴的經驗。不僅從語言特性、數據結構、瀏覽器機理、網絡傳輸等層麵分析導緻性能問題的原因,還介紹瞭多種工具來幫助我們提升開發過程和部署環節的工作效率。
本書作者Nicholas C. Zakas是一位經驗豐富的前端專傢,他的許多研究(www.nczonline. net)對前端業界的貢獻讓我們受益匪淺。本書的另外五位特約作者均為各自領域的專傢,他們的專業技能和知識的融入使得本書內容更為充實,更具實用價值。
特彆感謝趙澤欣(小馬),他為審閱譯文花瞭大量的時間和精力,他的耐心和細緻讓我十分敬佩。感謝硃寜(白鴉)和周筠老師的引薦讓我得以參與本書的翻譯。還要感謝博文視點的編輯們在本書翻譯過程中給予的極大理解和幫助。
我們在本書翻譯過程中力求保持行文流暢,但紕漏在所難免,懇請廣大讀者批評指正。關於本書的任何意見或想法,歡迎發送郵件至hpj.feedback@gmail.com。
最後,希望本書能幫助業界同仁打造齣性能更為卓越的Web産品。
丁琛
《JavaScript 藝術:精通 Web 交互的秘密》 開啓前沿 Web 互動體驗的鑰匙 在這個數字時代,Web 應用早已超越瞭簡單的信息展示,它們是動態的、響應式的、高度交互的數字空間,用戶體驗至關重要。而 JavaScript,作為 Web 開發領域不可或缺的語言,是這一切的驅動力。本書《JavaScript 藝術:精通 Web 交互的秘密》並非一本枯燥的技術手冊,而是一次深入探索 JavaScript 核心機製、揭示其精妙之處的旅程。它將帶領你超越基礎語法,觸及那些能夠將普通 Web 應用轉化為令人驚嘆的互動體驗的深層原理與高級技巧。 本書旨在為那些已經掌握 JavaScript 基礎,但渴望在 Web 互動方麵達到更高境界的開發者提供一個清晰的路綫圖。我們不提供“開箱即用”的解決方案,而是聚焦於“為什麼”和“如何”,讓你理解代碼背後的邏輯,從而能夠自主解決復雜問題,創造齣真正富有錶現力的 Web 應用。 內容深度剖析: 第一部分:JavaScript 引擎的脈搏——深入理解運行時 要精通一門語言,首先要理解它的“心髒”是如何跳動的。本部分將帶你走進 JavaScript 引擎的內部世界。 V8 引擎的秘密: 我們將深入剖析 V8 引擎(或其他主流 JavaScript 引擎,如 SpiderMonkey)的工作原理。你將瞭解其編譯器(Ignition 和 TurboFan/Liftoff)如何將 JavaScript 代碼轉化為機器碼,以及 JIT(Just-In-Time)編譯如何實現代碼的即時優化。理解內存管理(垃圾迴收機製 Scavenger、Mark-Sweep 等)的工作方式,以及如何避免內存泄漏,是提升應用性能的關鍵。 事件循環(Event Loop)的舞蹈: 理解事件循環是掌握異步編程的基石。我們將詳細解析宏任務(macrotasks)和微任務(microtasks)的區彆,以及它們在事件循環中的執行順序。通過對 `setTimeout`、`setInterval`、Promise、`process.nextTick`(Node.js 環境)等異步 API 的深入分析,你將能夠編寫齣更高效、更可控的異步代碼,避免迴調地獄,並深入理解 `async/await` 的真正威力。 執行上下文與作用域鏈: 變量的查找、函數的調用,這一切都離不開執行上下文(Execution Context)和作用域(Scope)。我們將係統地講解全局執行上下文、函數執行上下文以及詞法作用域(Lexical Scope)的形成。理解作用域鏈的工作原理,將幫助你清晰地把握變量的可訪問性,避免意外的全局變量汙染和作用域衝突。 第二部分:函數的高級藝術——構建靈活且強大的抽象 函數是 JavaScript 的基石,但其潛力遠不止於此。本部分將解鎖函數的許多高級特性,讓你能夠構建齣更靈活、可復用且易於維護的代碼。 閉包(Closures):封裝與狀態管理: 閉包是 JavaScript 中最強大也最容易被誤解的概念之一。我們將通過豐富的實例,展示閉包如何實現數據私有化,如何構建模塊,以及在柯裏化(Currying)和函數式編程中的應用。你將學會如何利用閉包來管理狀態,而無需依賴全局變量。 原型鏈(Prototypal Inheritance)與繼承: JavaScript 的繼承模型與基於類的語言有所不同。本書將深入剖析原型鏈的工作原理,理解 `__proto__`、`prototype` 和 `Object.create()` 的作用。你將學會如何有效地實現類式繼承的模擬,以及如何利用原型鏈來共享方法和屬性,從而優化內存使用。 `this` 的指嚮:理解動態綁定: `this` 的指嚮問題是 JavaScript 中的一個常見陷阱。我們將係統地梳理 `this` 在不同場景下的指嚮規則:全局上下文、函數調用、方法調用、構造函數調用、`call`、`apply`、`bind` 的應用,以及箭頭函數(Arrow Functions)如何改變 `this` 的綁定。掌握 `this` 的指嚮,是編寫健壯的麵嚮對象代碼的關鍵。 高階函數(Higher-Order Functions): 函數作為一等公民,可以被作為參數傳遞,也可以被作為返迴值返迴。我們將探索 map、filter、reduce 等函數式編程中的核心高階函數,並展示如何利用它們來簡化復雜的操作,提高代碼的聲明性和可讀性。 第三部分:異步編程的精妙策略——應對並發與延遲 Web 應用的響應式體驗高度依賴於高效的異步處理。本部分將為你提供應對各種異步挑戰的強大武器。 Promise 的進階應用: 除瞭基本的鏈式調用,我們將深入講解 Promise 的各種高級用法,例如 `Promise.all()`、`Promise.race()`、`Promise.any()`、`Promise.allSettled()` 的適用場景。你將學會如何優雅地處理多個並行或串行的異步操作,以及如何處理 Promise 的拒絕(Rejection)。 async/await 的真正威力: `async/await` 語法糖是 Promise 之上的抽象,極大地提升瞭異步代碼的可讀性。我們將深入探討 `async/await` 背後的機製,以及如何在錯誤處理、循環和條件語句中更有效地使用它。你將掌握如何編寫接近同步風格的異步代碼。 生成器(Generators)與迭代器(Iterators): 生成器是 JavaScript 中一種強大的控製流工具,它允許你暫停函數的執行並稍後恢復。我們將講解生成器的語法,以及如何利用它們來處理大量數據、實現自定義迭代器,並與異步操作結閤,構建更復雜的控製流。 Web Workers:釋放瀏覽器多綫程能力: 對於計算密集型任務,Web Workers 是提升 Web 應用響應能力的關鍵。我們將介紹 Web Workers 的概念,如何創建和通信,以及在何時使用它們來避免阻塞主綫程。 第四部分:性能優化與內存管理——打造流暢的用戶體驗 再好的交互,如果卡頓緩慢,也將大打摺扣。本部分將聚焦於如何讓你的 JavaScript 代碼運行得更快,占用更少的內存。 DOM 操作的效率法則: DOM 操作是 Web 開發中常見的性能瓶頸。我們將探討如何最小化 DOM 操作的次數,批量更新 DOM(Document Fragment),以及使用虛擬 DOM(Virtual DOM)的思想來提高渲染效率。 事件委托(Event Delegation)與節流/防抖(Throttling/Debouncing): 理解事件委托的原理,能夠顯著減少事件監聽器的數量。節流和防抖則是處理高頻觸發事件(如滾動、鼠標移動)的利器,我們將講解它們的實現方式及應用場景。 代碼打包與模塊化: 瞭解 Webpack、Rollup 等現代打包工具的工作原理,如何實現代碼分割(Code Splitting)、tree shaking,以及如何有效地組織和管理你的 JavaScript 模塊,是構建大型、高性能應用的必備知識。 性能分析工具的應用: 本書將指導你如何使用瀏覽器開發者工具(Performance Tab)進行性能分析,識彆代碼中的瓶頸,並根據分析結果進行針對性的優化。 第五部分:高級模式與設計原則——構建可維護的復雜係統 隨著項目規模的增長,代碼的可維護性變得尤為重要。本部分將介紹一些高級的設計模式和原則,幫助你構建更健壯、更易於擴展的 Web 應用。 設計模式在 JavaScript 中的應用: 我們將深入探討一些常用的 JavaScript 設計模式,如單例模式(Singleton)、工廠模式(Factory)、觀察者模式(Observer)、模塊模式(Module Pattern)、發布/訂閱模式(Publish/Subscribe)等,並展示它們如何在實際項目中落地。 函數式編程思想(Functional Programming): 函數式編程強調純函數、不可變性(Immutability)和聲明式編程。我們將介紹函數式編程的核心概念,以及如何將其融入你的 JavaScript 代碼中,從而編寫齣更易於測試、更少副作用的代碼。 響應式編程(Reactive Programming)簡介: 隨著 RxJS 等庫的流行,響應式編程在現代 Web 開發中越來越受到關注。我們將簡要介紹響應式編程的思想,以及它如何幫助你以一種聲明式的方式處理復雜的異步數據流。 代碼的健壯性與錯誤處理: 學習如何編寫能夠優雅處理錯誤的 JavaScript 代碼,包括使用 `try...catch` 塊、Promise 的拒絕處理,以及如何進行有效的錯誤日誌記錄,是確保應用穩定運行的關鍵。 本書特色: 深入的原理講解: 我們不滿足於“怎麼做”,更關注“為什麼這麼做”。通過對 JavaScript 引擎、運行時機製的深入剖析,讓你知其然,更知其所以然。 豐富的實例分析: 每一個概念都配以精心設計的代碼示例,幫助你直觀理解,並鼓勵你在實際項目中進行實踐。 前沿技術的探索: 關注 Web 開發的最新趨勢,將最新的技術和理念融入到講解之中。 實用的優化技巧: 聚焦於 Web 應用性能的提升,提供行之有效的優化策略和調試方法。 強調可讀性與可維護性: 幫助你寫齣清晰、易於理解、易於維護的代碼,為構建大型復雜項目奠定基礎。 《JavaScript 藝術:精通 Web 交互的秘密》將是你從一名 JavaScript 開發者蛻變為一名 Web 互動藝術傢的重要夥伴。它將為你打開一扇通往更深層次理解和更高境界創作的大門,讓你能夠自信地駕馭 JavaScript 的強大力量,創造齣令人驚嘆的 Web 體驗。準備好,與我們一同踏上這場深入JavaScript靈魂的探索之旅吧!