在第1章中,我們曾簡單介紹過異步I/O。“異步”這個名詞其實早就誕生了,但它的大規模流行卻是在Web 2.0浪潮中,它伴隨這AJAX的第一個A(Asynchronous)席卷了Web。Node在出現之前,最習慣異步編程的程序員莫過于前端工程師了。前端編程算GUI編程的一種,其中充斥了各種Ajax和事件,這些都是典型的異步應用場景。
但事實上,異步早就存在于操作系統的底層。在底層系統中,異步通過信號量、消息等方式有了廣泛的應用。意外的是,在絕大多數高級編程語言中,異步并不多件,疑似被屏蔽了一般。造成這個現象的主要原因也許令人驚訝:程序員不太適合通過異步來進行程序設計。
PHP這門語言的設計最能體現這個觀點。它對調用層不僅屏蔽了異步,甚至連多線程都不提供。PHP語言從頭到腳都是以同步阻塞的方式來執行的。它的優點十分明顯,利于程序員順序編寫業務邏輯;它的缺點在小規模站點中基本不存在,但是在復雜的網絡應用中,阻塞導致它無法更好的并發。
而在其它語言中,盡管可能存在異步的API,但是程序員還是習慣采用同步的方式來編寫應用。在眾多高級編程語言或運行平臺中,將異步作為主要編程方式和設計理念的,Node是首個。
伴隨著異步I/O的還有事件驅動和單線程,它們構成Node的基調。Ryan Dahl 正是基于這幾個因素設計了Node。Ryan Dahl最初期望設計出一個高性能的Web服務器,后來則演變成了一個可以基于它構建各種高速、可伸縮網絡應用的平臺,因為一個Web服務器已經完全無法涵蓋和代表它的能力了。盡管它不再是一個服務器,但是可以基于它搭建更多更豐富、更強大的網絡應用。
與Node的事件驅動、異步I/O設計理念比較相近的一個知名產品為Nginx。Nginx采用純C編寫,性能表現非常優異。它們的區別在于,Nginx具備面向客戶端管理連接的強大能力,但是它的背后依然受限于各種同步方式的編程語言。但Node卻是全方位的,既可以作為服務器端去處理客戶端帶來的大量并發請求,也能作為客戶端向網絡中的各個應用進行并發請求。
Web的含義是網,Node的表現就如它的名字一樣,是網絡中靈活的一個節點。
- 目錄
- 第1章 Node 簡介
- 1.1 Node 的誕生歷程
- 1.2 Node 的命名與起源
- 1.2.1 為什么是 JavaScript
- 1.2.2 為什么叫 Node
- 1.3 Node給JavaScript帶來的意義
- 1.4 Node 的特點
- 1.4.1 異步 I/O
- 1.4.2 事件與回調函數
- 1.4.3 單線程
- 1.4.4 跨平臺
- 1.5 Node 的應用場景
- 1.5.1 I/O 密集型
- 1.5.2 是否不擅長CPU密集型業務
- 1.5.3 與遺留系統和平共處
- 1.5.4 分布式應用
- 1.6 Node 的使用者
- 1.7 參考資源
- 第2章 模塊機制
- 2.1 CommonJS 規范
- 2.1.1 CommonJS 的出發點
- 2.1.2 CommonJS 的模塊規范
- 2.2 Node 的模塊實現
- 2.2.1 優先從緩存加載
- 2.2.2 路徑分析和文件定位
- 2.2.3 模塊編譯
- 2.3 核心模塊
- 2.3.1 JavaScript核心模塊的編譯過程
- 2.3.2 C/C++核心模塊的編譯過程
- 2.3.3 核心模塊的引入流程
- 2.3.4 編寫核心模塊
- 2.4 C/C++擴展模塊
- 2.4.1 前提條件
- 2.4.2 C/C++擴展模塊的編寫
- 2.4.3 C/C++擴展模塊的編譯
- 2.4.2 C/C++擴展模塊的加載
- 2.5 模塊調用棧
- 2.6 包與NPM
- 2.6.1 包結構
- 2.6.2 包描述文件與NPM
- 2.6.3 NPM常用功能
- 2.6.4 局域NPM
- 2.6.5 NPM潛在問題
- 2.7 前后端共用模塊
- 2.7.1 模塊的側重點
- 2.7.2 AMD規范
- 2.7.3 CMD規范
- 2.7.4 兼容多種模塊規范
- 2.8 總結
- 2.9 參考資源
- 第3章 異步I/O
- 3.1 為什么要異步I/O
- 3.1.1 用戶體驗
- 3.1.2 資源分配
- 3.2 異步I/O實現現狀
- 3.2.1 異步I/O與非阻塞I/O
- 3.2.2 理想的非阻塞異步I/O
- 3.2.3 現實的異步I/O
- 3.3 Node的異步I/O
- 3.3.1 事件循環
- 3.3.2 觀察者
- 3.3.3 請求對象
- 3.3.4 執行回調
- 3.3.5 小結
- 3.4 非I/O的異步API
- 3.4.1 定時器
- 3.5 事件驅動與高性能服務器