作為模塊和包服務的工具,NPM十分便捷。它實質上已經是一個包共享平臺,所有人都可以貢獻模塊并將其打包分享到這個平臺上,也可以在許可證(大多是MIT許可證)的允許下免費使用它們。NPM提供的這些便捷,將模塊鏈接到一個共享平臺上,縮短了貢獻者與使用者之間的距離,這十分有利于模塊的傳播,進而十分利于Node的推廣。幾乎沒有一種語言或平臺有Node這樣才出現3年就擁有成千上萬第三方模塊的情景。這個功勞一部分是因為Node選擇了JavaScript,這門語言擁有極大的開發人員基數,具有強大的生產力;另一部分是因為CommonJS規范和NPM,它們使得產品能夠更好的組織、傳播和使用。
潛在的問題在于,在NPM平臺上,每個人都可以分享包到平臺上,鑒于開發人員水平不一,上面包的質量也良莠不齊。另一個問題是,Node代碼可以運行在服務器端,需要考慮安全問題。
對于包的使用者而言,包質量和安全問題需要作為是否采納模塊的一個判斷條件。
盡管NPM沒有硬性的方式去評判一個包的質量和安全,好在開源社區也有它內在的健康發展機制,那就是口碑效應,其中NPM模塊首頁([https://npmjs.org](https://npmjs.org))上的依賴榜可以說明模塊的質量和可靠性。第二個可以考察質量的地方是GitHub,NPM中大多數包都是通過GitHub托管的,模塊項目的觀察者數量和分支數量也能從側面反映這個模塊的可靠性和流行度。第三個可以考量包質量的地方在于包中的測試用例和文檔的狀況,一個沒有單元測試的包基本上是無法被信任的,沒有文檔的包,使用者使用時內心也是不踏實的。
在安全問題上,在經過模塊質量的考察之后,應該可以去掉一大半候選包。基于使用者大多是JavaScript程序員,難點其實在于第三方C/C++擴展模塊,這類模塊建議在企業的安全部門檢查之后方可允許使用。
事實上,為了解決上述問題,Isaac Z. Schlueter 計劃引入CPAN社區中的Kwalitee風格來讓模塊進行自然排序。Kwalitee是一個擬聲詞,發音與quality相同。CPAN社區對它的原始定義如下:
"Kwalitee" is something that looks like quality,sounds like quality,but not quite quality.
大致意思就是確認一個模塊的質量是否優秀并不是那么容易,只能從一些表象來進行考察,但即使考察都通過,也并不能確定它就是高質量的模塊。這個方法能夠排除大部分不合格的模塊,雖然不夠精確但是有效。總體而言,符合Kwalitee的模塊要滿足的條件與上述提及的考察點大致相同:
* 具備良好的測試
* 具備良好的文檔(README、API)
* 具備良好的測試覆蓋率
* 具備良好的編碼規范
* 更多條件
CPAN社區制定了相當多的規范來考察模塊。未來,NPM社區也會有更多的規范來考察模塊。讀者可以根據這些條款區分出那些優秀模塊跟糟粕模塊。
- 目錄
- 第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 事件驅動與高性能服務器