大型 JavaScript 應用最佳實踐指南
內容描述
本書將帶你設計和實現能從多個維度(如尋址能力、可配置性和性能)可伸縮的JavaScript的應用程序體系架構;瞭解常見的JavaScript縮放陷阱,並通過真實的解決方案和策略解決這些問題。內容包括:確定和評估應用程序的外部擴展影響力,創建構成大規模JavaScript應用程序的組件,對可擴展組件間的通信進行設計,設計一個不受限於環境的便攜的且可測試的應用程序,等等。
目錄大綱
1 擴展應用
影響擴展的因素
對可擴展的需要
不斷增長的用戶
添加新功能
僱傭更多的開發者
架構角度
瀏覽器是一個獨特的環境
組件設計
組件通信
加載時間
響應性
可尋址性
可配置性
架構性取捨
確定不可變內容
從開發的便捷性考慮性能
性能的可配置性
從可替換性考慮性能
可尋址性的開發便捷性
性能的可維護性
減少功能以提高可維護性
利用框架
框架與類庫
一致地實現模式
內建的性能
利用社區智慧
框架並非天生支持擴展
小結
2 可擴展性的影響因素
擴展用戶
許可證費用
訂閱費用
消耗費用
廣告支持
開源
與用戶溝通
支持機制
反饋機制
提示用戶
用戶維度
擴展用戶示例
擴展功能
應用價值
“殺手級”功能與“殺死”應用的功能
數據驅動的功能
與競品比較
修改已有的功能
支持用戶分組和角色
增加新服務
擴展功能示例
開發的可擴展性
尋找開發資源
開發職責
資源過多
擴展開發示例
影響因素檢查表
用戶檢查清單
功能清單
開發者清單
小結
3 組件組合
通用組件
模塊
路由器
模型/集合
控制器/視圖
模板
應用特定的組件
擴展通用組件
識別公用數據、功能
擴展路由器組件
擴展模型/集合
擴展控制器/視圖
將功能映射到組件
通用功能
特定功能
解構組件
維護和調試組件
重構複雜組件
可插拔的業務邏輯
擴展與配置
無狀態的業務邏輯
組織組件代碼
小結
4 組件的通信與職責
通信模型
消息傳遞模型
事件模型
通信數據結構
命名約定
數據格式
公共數據
可追踪的組件通信
訂閱事件
全局事件日誌
事件的生命週期
通信的開銷
事件的頻率
回調函數執行時間
事件複雜度
通信責任區
後端API
Web Socket 用於更新狀態
DOM 更新
松耦合的通信
替換組件
應對意外事件
組件分層
事件流向
開發者的職責
構建代碼思維導圖
小結
5 尋址和導航
實現路由的方法
Hash URI
傳統URI
路由是如何工作的
路由的職責
路由事件
URI 的結構和模式
編碼信息
設計URI
將資源映射到URI
手動創建URI
自動生成資源
觸發路由
用戶行為
重定向用戶
路由配置
靜態路由聲明
註冊事件
禁用路由
故障排查
路由器衝突
記錄初始配置
記錄路由事件
處理非法資源的狀態
小結
6 用戶偏好和默認設置
偏好類型
地區
行為
外觀
支持地區
決定支持哪些地區
維護地區
設置地區
選擇地區
存儲地區偏好
URI中的地區
通用組件配置
選擇配置的值
存儲和硬編碼默認值
對後端的影響
加載配置值
配置行為
啟用和禁用組件
改變數量
改變順序
配置通知
行內選項
改變外觀
主題工具
選擇一個主題
單獨的樣式偏好
性能影響
可配置地區的性能
可配置行為的性能
可配置主題的性能
小結
7 加載時間和響應速度
組件構件
組件依賴
構建組件
加載組件
加載模塊
懶惰的模塊加載
模塊加載的延遲
通信瓶頸
減少間接引用
分析代碼
組件優化
維護狀態的組件
處理副作用
DOM渲染技術
API數據
加載延遲
處理大數據集
優化運行時組件
小結
8 可移植性和測試
與後端解耦
模擬後端API
前端入口
模擬工具
生成模擬數據集
執行操作
功能設計過程
設計API
實現模擬數據
實現功能
協調模擬數據與真實數據
單元測試工具
框架自帶的工具
獨立的單元測試工具
工具鍊和自動化
測試模擬場景
模擬API和測試固件
場景生成工具
端到端測試和持續集成
小結
9 縮小規模
擴展限制
文件體積
網絡帶寬
內存消耗
CPU 消耗
後端能力
互相矛盾的功能
重疊的功能
冗餘的功能
用戶需求
設計失效
多餘的組件
低效的數據處理
過度創建標記
應用組合
功能的啟動
新功能的影響
重要的庫
小結
10 處理錯誤
快速失效
使用質量約束
提供有意義的反饋
當無法快速失效時
容錯
區分關鍵行為
探測和控制錯誤行為
禁用出錯組件
優雅地降級功能
故障恢復
重試失敗操作
重啟組件
用戶手動干涉
當我們無法從故障中恢復
性能和復雜度
異常處理
狀態檢查
通知其他組件
記錄日誌和調試
有意義的錯誤日誌
為潛在故障發出警告
通知和指導用戶
改進架構
記錄錯誤場景
改進組件分類
複雜導致出錯
小結
作者介紹
Adam Boduch在開發大型JavaScript應用方面有近10年的工作經驗。在轉型為前端工程師之前,他曾使用Python與Linux參與了許多大型雲計算產品的構建。
Adam擁有非常豐富的開發經驗,擅長處理複雜的場景,提高軟件的可擴展性。他編寫了很多JavaScript方面的書籍,其中包括Lo-Dash Essentials,並且,他還熱衷於優化用戶體驗和性能。
Adam現居住於多倫多,是Virtustream的一名高級軟件工程師。
關於審校者
August N. Marcello III是一位充滿激情的軟件工程師,在客戶端的Web應用架構相關的設計、實現、部署方面,有著近20年的工作經驗。
他專注於基於SaaS創造良好的用戶體驗,並將其傳播到Web生態系統,這無論從個人還是從專業角度來說都極具價值。
對新興通用技術的熱愛以及對先進的JavaScript平台的專注,驅動著他在技術上精益求精。在工作之餘,他會參加越野跑、山地自行車騎行,或者陪伴家人和朋友。
Yogesh Singh畢業於印度JSS技術教育學院。他是一位全棧Web開發者,在服務端Web開發棧方面( ASP.NET以及Node.js)很有經驗,而且熟練掌握HTML、CSS以及JavaScript。
Yogesh熱愛JavaScript以及相關的庫和框架( Backbone、 AngularJS、jQuery和Underscore)。
他最開始從事的是數據挖掘和數據倉庫方面的工作,在數據庫開發方面十分專業。他是MSSQL的微軟認證解決方案成員(MCSA)。
Yogesh自學能力很強,喜歡學習算法和數據結構,並在斯坦福大學Coursera上獲得了算法課的結業證明。
他曾就職於OLX India和MAQ Software,目前為Gainsight公司的全棧開發者。
業餘時間,他喜歡寫博客。
Nikolay Sokolov是一名軟件工程師,他在雲計算、自動化部署和企業軟件開發方面有著豐富的經驗。現在就職於Tonomi,負責基於彈性組件模型分發雲應用的自動管理包。
Serkan Yersen是一名洛杉磯的軟件開發者。他是一些開源庫的作者,例如: ifvisible.js、underscore.py以及kwargs.js。Serkan專門從事構建大型JavaScript應用,以及為用戶廣泛的應用創建UI。
2006年至2012年,就職於網站期間,他開發了一個複雜的表單生成器,供上百萬用戶使用。現在,他就職於Home Depot和Redbeacon,負責Web應用開發。
關於譯者
本書翻譯工作由月影領銜的奇舞團翻譯小組承擔,由王韋華、黃小璐、黃薇負責翻譯。王韋華網名Aztack,前端技術專家。曾就職百度、奇虎360等國內知名互聯網公司。
擁有豐富的Web前端開發經驗,擅長JavaScript、Ruby、Java、C++等語言。
黃小璐
畢業於華中科技大學計算機學院。現為奇虎360軟件開發工程師。曾參與開源項目[stcjs](高性能前端工作流系統)。參與翻譯了《高性能HTML5》等書。
黃薇
畢業於中山大學,於2013年加入奇舞團,近期參與了Nova.js(Web Component框架)、聲享(在線製作PPT)等項目,對大型JavaScript應用有濃厚的興趣和豐富的開發經驗。
以上三位譯者曾共同參與《移動Web手冊》一書的翻譯工作。