包描述文件用于表達非代碼相關的信息,它是一個JSON格式的文件-package.json,位于包的根目錄下,是包的重要組成部分。而NPM的所有都與包描述文件的字段信息相關。由于CommonJS包規范尚處于草案階段,NPM在實踐中做了一定的取舍,具體細節在后面會介紹到。
CommonJS為package.json文件定義了如下一些必需的字段:
* **name**。包名,規范定義它需要由小寫的字母和數字組成,包含.、_和-,但不允許出現空格。包名必須是唯一的,以免對外公布時產生重名沖突的誤解。除此之外,NPM還建議不要在包名中附帶上node或js來重復標識它是JavaScript或者Node模塊。
* **description**。包簡介。
* **version**。版本號。一個語義化的版本號,這在http://semver.org 上有詳細定義,通常為major.minor.revision格式。該版本號十分重要,常常用于一些版本控制的場合。
* **keywords**。關鍵詞數組,NPM中主要用來做分類搜索。一個好的關鍵詞數組有利于用戶快速找到你編寫的包。
* **maintainers**。包維護者列表。每個維護者由name、email、和web這3個屬性組成。示例如下:"maintainers":[{"name":"Jackson Tian","email":"shyvo1987@gmail.com","web":"http://html5ify.com"}] 。NPM通過該屬性進行權限認證。
* **contributors**。貢獻者列表。在開源社區中,為開源項目提供代碼是經常出現的事情,如果名字能出現在知名項目的contributors列表中,是件比較有榮譽感的事情。列表中的第一個貢獻者應當是包的作者本人。它的格式與維護者列表相同。
* **bugs**。一個可以反饋bug的網頁地址或郵件地址。
* **licenses**。當前包所使用的許可證列表,表示這個包可以在哪些許可證下使用。它的格式如下:"licenses":[{"type":"GPLv2","url":"http://www.example.com/licenses/gpl.html"}] 。
* **repositories**。托管源代碼的位置列表,表明可以通過哪些方式和地址訪問包的源代碼。
* **dependencies**。使用當前包所需要依賴的包列表。這個屬性十分重要,NPM會通過這個屬性幫助自動加載依賴的包。
除了必選字段外,規范還定義了一部分可選字段,具體如下所示:
* homepage。當前包的網站地址。
* os。操作系統支持列表。這些操作系統的取值包括aix、freebsd、linux、macos、solaris、vxworks、windows。如果設置了列表為空,則不對操作系統做任何假設。
* cpu。CPU架構的支持列表,有效的架構名稱有arm、mips、ppc、sparc、x86和x86_64。同os一樣,如果列表為空,則不對CPU架構做任何假設。
* engine。支持的JavaScript引擎列表,有效的引擎取值包括ejs、flusspferd、gpsee、jsc、spidermonkey、narwhal、node和v8。
* builtin。標志當前包是否是內建在底層系統的標準組件。
* directories。包目錄說明。
* implements。實現規范的列表。標志當前包實現了CommonJS的哪些規范。
* scripts。腳本對象,它主要被包管理器用來安裝、編譯、測試和卸載包。示例如下:
~~~
"scripts":{
"install":"install.js",
"uninstall":"uninstall.js",
"build":"build.js",
"doc":"make-doc.js",
"test":"test.js"
}
~~~
包規范的定義可以幫助Node解決依賴包安裝的問題,而NPM正是基于該規范進行了實現。最初,NPM工具是由Isaac Z. Schlueter單獨創建,提供給Node服務的Node包管理器,需要單獨安裝。后來,在v0.6.3版本時集成進Node中作為默認包管理器,作為軟件包的一部分一起安裝。之后Isaac Z. Schlueter 也成為Node的掌門人。
在包描述文件的規范中,NPM實際需要的字段主要有name、version、description、keywords、repositories、author、bin、main、scripts、engine、dependencies、devDependencies。
與包規范的區別在于多了author、bin、main和devDependencies這4個字段。下面補充說明一下:
* author。包作者。
* bin。一些包作者希望包可以作為命令行工具使用。配置好bin字段后,通過 npm install package_name -g 命令可以將腳本添加到執行路徑中,之后可以在命令行中直接執行。前面的node-gyp即是這樣安裝的。通過-g命令安裝的模塊包稱為全局模式。
* main。模塊引入方法require()在引入包時,會優先檢查這個字段,并將其作為包中其余模塊的入口。如果不存在這個字段,require()方法會查找包目錄下的index.js、index.node、index.json文件作為默認入口。
* devDependencies。一些模塊只在開發時需要依賴。配置這個屬性,可以提示包的后續開發者安裝依賴包。
下面是知名框架express項目的package.json文件,具有一定的參考意義:
~~~
{
"name":"express",
"description":"Sinatra inspired web development framework",
"version":"3.3.4",
"author":"TJ Holowaychuk <tj@vision-media.ca>",
"contributors":[
{
"name":"TJ Holowaychuk",
"email":"tj@vision-media.ca"
},
{
"name":"Aaron Heckmann",
"email":"aaron.heckmann+github@gmail.com"
},
{
"name":"Ciaran Jessup",
"email":"ciaranj@gmail.com"
},
{
"name":"Guillermo Rauch",
"email":"rauchg@gmail.com"
}
],
"dependencies":{
"connect":"2.8.4",
"commander":"1.2.0",
"range-parser":"0.0.4",
"mkdirp":"0.3.5",
"cookie":"0.1.0",
"buffer-crc32":"0.2.1",
"fresh":"0.1.0",
"methods":"0.0.1",
"send":"0.1.3",
"cookie-signature":"1.0.1",
"debug":"*"
},
"devDependencies":{
"ejs":"*",
"mocha":"*",
"jade":"0.30.0",
"hjs":"*",
"stylus":"*",
"should":"*",
"connect-redis":"*",
"marked":"*",
"supertest":"0.6.0"
},
"keywords":[
"express",
"framework",
"sinatra",
"web",
"rest",
"restful",
"router",
"app",
"api"
],
"repository":"git://github.com/visionmedia/express",
"main":"index",
"bin":{
"express":"./bin/express"
},
"scripts":{
"prepublish":"npm prune",
"test":"make test"
},
"engines":{
"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 事件驅動與高性能服務器