如果想要編寫高質量的C/C++擴展模塊,還需要深厚的C/C++編程功底才行。除此之外,以下這些條目都是不能避開的,在了解它們后,可以讓你在編寫過程中事半功倍。
## GYP項目生成工具
在Node 0.6中,第三方模塊通過它自身提供的node_waf工具實現編譯,但是它是`*nix`平臺下的產物,無法實現跨平臺編譯。在Node 0.8 中,Node決定摒棄掉node_waf而采用跨平臺效果更好的項目生成器,它就是GYP工具,即“Generate Your Projects”單詞的縮寫。它的好處在于,可以幫助你生成各個平臺下的項目文件,比如Windows下的Visual Studio解決方案文件(.sln)、Mac下的XCode項目配置文件以及Scons工具。在這個基礎上,再動用各個平臺下的編譯器編譯項目。這大大減少了跨平臺模塊在項目組織上的精力投入。
Node源碼中一度出現過各種項目文件,后來均統一為GYP工具。這除了可以減少編寫跨平臺項目文件的工作量外,另一個簡單的原因就是Node自身的源碼就是通過GYP編譯的。為此,Nathan Rajlich基于GYP為Node提供了一個專有的擴展構建工具node-gyp,這個工具通過 `npm install -g node-gyp` 這個命令即可安裝。
## V8引擎C++庫
V8是Node自身的動力來源之一。它自身由C++寫成,可以實現JavaScript與C++的互相調用。
## libuv庫
它是Node自身的動力來源之二。Node能夠實現跨平臺的一個訣竅就是它的libuv庫,這個庫是跨平臺的一層封裝,通過它去調用一些底層操作,比自己在各個平臺下編寫實現要高效的多。libuv封裝的功能包括事件循環、文件操作等。
## Node內部庫
寫C++模塊時,免不了要做一些面向對象編程工作,而Node自身提供了一些C++代碼,比如node::ObjectWrap類可以用來包裝你的自定義類,它可以幫助實現對象回收等工作。
## 其它庫
其它存在deps目錄下的庫在編寫擴展模塊時也許可以幫助你,比如zlib、openssl、http_parser等。
- 目錄
- 第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 事件驅動與高性能服務器