包是在模塊的基礎上更深一步的抽象,Node.js的包相似於C/C++函數庫或者Java/.NET的類庫。它將獨立的功能封裝起來用於發佈、更新、依賴管理和版本控制。javascript
Node.js的包是一個目錄,其中包含一個JSON格式的包說明文件package.json.這裏必須在頂層目錄下。爲了提供兼容性,咱們建議嚴格按照commonJS規範。html
嚴格符合CommonJS規範的包應該具有如下特徵:java
#一、package.json必須在包的頂層目錄下。node
#二、二進制文件必須在bin目錄下。git
#三、Javascript代碼應該在lib目錄下。github
#四、文檔應該在doc目錄下。web
#五、單元測試應該在test目錄下。json
模塊與文件一一對應。文件不只能夠是Javascript代碼或二進制代碼,還能夠是一個文件夾。最簡單的包就是一個做爲文件夾的模塊。數組
#一、創建一個somepackage文件夾函數
#二、在somepackage下創建index.js文件
#三、文件中寫入
exports.hello=function(){ console.log('Hello World'); };
#四、在somepackage文件夾外創建一個getpackage.js文件
#五、寫入
var somepackage=require('./somepackage'); somepackage.hello();
#六、輸出:Hello Wolrd
咱們使用這種方法能夠把文件夾封裝爲一個模塊,即所謂的包。包一般是一些模塊的集合,在模塊的基礎上提供更高層的抽象,至關於提供了一些固定接口的函數庫。經過定製package.json,咱們能夠建立更復雜、更完善、更符合標準的包用於發佈。
在somepackage中建立package.json,寫入:
{ "main":"./lib/interface.js" }
在somepackage中創建lib子文件夾,並在其中建立interface.js文件,在文件中寫入:
exports.hello=function(){ console.log('Hello Node.js'); };
運行上面的getpackage.js,則運行結果爲:Hello Node.js
Node.js在調用某個包時,會首先檢查包中package.json中的main字段,將其做爲包的接口模塊,若是main不存在,會嘗試尋找index.js或者index.node做爲包的接口。
package.json 是 CommonJS 規定的用來描述包的文件,徹底符合規範的 package.json 文
件應該含有如下字段。
name:包的名稱,必須是惟一的,由小寫英文字母、數字和下劃線組成,不能包含空格。
description:包的簡要說明。
version:符合語義化版本識別①規範的版本字符串。
keywords:關鍵字數組,一般用於搜索。
maintainers:維護者數組,每一個元素要包含 name、email (可選)、web (可選)字段。
contributors:貢獻者數組,格式與maintainers相同。包的做者應該是貢獻者數組的第一個元素。
bugs:提交bug的地址,能夠是網址或者電子郵件地址。
licenses:許可證數組,每一個元素要包含 type (許可證的名稱)和 url (連接到許可證文本的地址)字段。
repositories:倉庫託管地址數組,每一個元素要包含 type (倉庫的類型,如 git )、url (倉庫的地址)和 path (相對於倉庫的路徑,可選)字段。
dependencies:包的依賴,一個關聯數組,由包名稱和版本號組成。
下面是一個徹底符合 CommonJS 規範的 package.json 示例:
{ "name": "mypackage", "description": "Sample package for CommonJS. This package demonstrates the required elements of a CommonJS package.", "version": "0.7.0", "keywords": [ "package", "example" ], "maintainers": [ { "name": "Bill Smith", "email": "bills@example.com", } ], "contributors": [ { "name": "BYVoid", "web": "http://www.byvoid.com/" } ], "bugs": { "mail": "dev@example.com", "web": "http://www.example.com/bugs" }, "licenses": [ { "type": "GPLv2", "url": "http://www.example.org/licenses/gpl.html" } ], "repositories": [ { "type": "git", "url": "http://github.com/BYVoid/mypackage.git" } ], "dependencies": { "webkit": "1.2", "ssl": { "gnutls": ["1.0", "2.0"], "openssl": "0.9.8" } } }