標籤:之間 server 簡寫 預設 應該 cos 波浪 aix 改變
前面的話
Node組織了自身的核心模組,也使得第三方檔案模組可以有序地編寫和使用。但是在第三方模組中,模組與模組之間仍然是散列在各地的,相互之間不能直接引用。而在模組之外,包和NPM則是將模組聯絡起來的一種機制。在介紹NPM之前,不得不提起CommonJS的包規範。JavaScript不似Java或者其他語言那樣,具有模組和包結構。Node對模組規範的實現,一定程度上解決了變數依賴、依賴關係等程式碼群組織性問題。包的出現,則是在模組的基礎上進一步組織JavaScript代碼。CommonJS的包規範的定義其實也十分簡單,它由包結構和包描述檔案兩個部分組成,前者用於組織包中的各種檔案,後者則用於描述包的相關資訊,以供外部讀取分析。本文將詳細介紹nodeJS中的包
包結構
包實際上是一個封存檔案,即一個目錄直接打包為.zip或tar.gz格式的檔案,安裝後解壓還原為目錄。完全符合CommonJS規範的包目錄應該包含如下這些檔案
1、package.json:包描述檔案
2、bin:用於存放可執行二進位檔案的目錄
3、lib:用於存放JavaScript代碼的目錄
4、doc:用於存放文檔的目錄
5、test:用於存放單元測試用例的代碼
以功能為使頁面即時重新整理的livereload外掛程式的包結構為例
包描述檔案
包描述檔案用於表達非代碼相關的資訊,它是一個JSON格式的檔案——package.json,位於包的根目錄下,是包的重要組成部分。而NPM的所有行為都與包描述檔案的欄位息息相關
package.json
檔案,定義了項目所需要的各種模組,以及項目的配置資訊(比如名稱、版本、許可證等中繼資料)。npm install
命令根據這個設定檔,自動下載所需的模組,也就是設定項目所需的運行和開發環境
有了package.json檔案,直接使用npm install命令,就會在目前的目錄中安裝所需要的模組
$ npm install
如果一個模組不在package.json
檔案之中,可以單獨安裝這個模組,並使用相應的參數,將其寫入package.json
檔案之中
$ npm install express --save$ npm install express --save-dev
上面代碼錶示單獨安裝express模組,--save
參數表示將該模組寫入dependencies
屬性,--save-dev
表示將該模組寫入devDependencies
屬性
同樣地,以livereload外掛程式的包描述檔案為例
基本欄位
package.json檔案可以手工編寫,也可以使用npm init
命令自動產生
$ npm init
這個命令採用互動方式,要求使用者回答一些問題,然後在目前的目錄產生一個基本的package.json檔案。所有問題之中,只有項目名稱(name)和項目版本(version)是必填的,其他都是選填的
因此,最簡單的package.json檔案,只定義兩項中繼資料:項目名稱和項目版本
{ "name" : "xxx", "version" : "0.0.0",}
1、name——包名。規範定義它需要由小寫字母和數字組成,可以包含.、_和-,但不允許出現空格。包名必須是唯一的,以免對外公布時產生重名衝突的誤解。除此之外,NPM還建議不要在包名中附帶上node或js來重複標識它是JavaScript或Node模組
"name": "livereload"
2、version——版本號碼。一個語義化的版本號碼,這在http://semver.org/上有詳細定義,通常為major.minor.revision格式。該版本號碼十分重要,常常用於一些版本控制的場合
"version": "0.6.0"
[注意]對於nodejs來說,版本號碼的小數位代表為這個版本的穩定性,偶數位為穩定版本(0.6.x、0.8.x……),奇數位為非穩定版本(0.7.x、0.9.x……)。一般地,開發時要使用最新的穩定版本
必需欄位
CommonJS為package.json檔案定義了包括name和version在內的10個必需的欄位。但由於CommonJS包規範尚處於草案階段,NPM在實踐中做了一定的取捨
1、description——包簡介。方便別人瞭解該模組作用,搜尋的時候也有用
"description": "LiveReload server"
2、keywords——關鍵詞數組,NPM中主要用來做分類搜尋。一個好的關鍵詞數組有利於使用者快速找到該包
[注意]livereload外掛程式並沒有設定keywords屬性
3、maintainers——包維護者列表。每個維護者由name、email和web這3個屬性群組成
[注意]livereload外掛程式並沒有設定maintainers中的web屬性
"maintainers": [ { "name": "bphogan", "email": "[email protected]" } ]
4、contributors——貢獻者列表。在開源社區中,為開源項目提供代碼是經常出現的事情,如果名字能出現在知名項目的contributors列表中,是一件比較有榮譽感的事。列表中的第一個貢獻應當是包的作者本人。它的格式與維護者列表相同
"contributors": [ { "name": "Brian P. Hogan", "email": "[email protected]" } ]
5、bugs——一個可以反饋bug的網頁地址或郵件地址
"bugs": { "url": "https://github.com/napcs/node-livereload/issues" }
6、licenses——當前包所使用的許可證列表,表示這個包可以在哪些許可證下使用
"licenses": [ { "type": "MIT", "url": "https://github.com/napcs/node-livereload/blob/master/LICENSE" } ]
7、repositories——託管原始碼的位置列表,表明可以通過哪些方式和地址訪問包的原始碼
"repository": { "type": "git", "url": "git+ssh://[email protected]/napcs/node-livereload.git" }
8、dependencies——使用當前包所需要依賴的包列表。這個屬性十分重要,NPM會通過這個屬性協助自動載入依賴的包
對應的版本可以加上各種限定,主要有以下幾種:
- 指定版本:比如1.2.2,遵循“大版本.次要版本.小版本”的格式規定,安裝時只安裝指定版本
- 大於小於符號(>或<)+指定版本:比如>=1.2.2,表示安裝大於等於1.2.2的最新版本
- 波浪號(tilde)+指定版本:比如~1.2.2,表示安裝1.2.x的最新版本(不低於1.2.2),但是不安裝1.3.x,也就是說安裝時不改變大版本號碼和次要版本號碼。
- 插入號(caret)+指定版本:比如?1.2.2,表示安裝1.x.x的最新版本(不低於1.2.2),但是不安裝2.x.x,也就是說安裝時不改變大版本號碼。需要注意的是,如果大版本號碼為0,則插入號的行為與波浪號相同,這是因為此時處於開發階段,即使是次要版本號碼變動,也可能帶來程式的不相容
- latest:安裝最新版本
"devDependencies": { "coffee-script": ">= 1.8.0", "mocha": ">= 1.0.3", "request": ">= 2.9.203", "should": ">= 0.6.3", "sinon": "^1.17.4" }
可選欄位
除了必選欄位外,規範還定義了一部分可選欄位,具體如下所示
1、homepage——當前包的網站地址
"homepage": "https://github.com/napcs/node-livereload#readme",
2、os——作業系統支援列表。這些作業系統的取值包括aix、freebsd、linux、macos、solaris、vxworks、windows。如果設定了列表為空白,則不對作業系統做任何假設
[注意]livereload外掛程式並沒有設定os屬性
3、cpu——CPU架構的支援列表,有效架構名稱有arm、mips、ppc、sparc、x86和x86_64。同os一樣,如果列表為空白,則不對CPU架構做任何假設
[注意]livereload外掛程式並沒有設定cpu屬性
4、engine——支援的JavaScript引擎列表,有效引擎取值包括ejs、flusspferd、gpsee、jsc、spidermonkey、narwhal、node和v8
"engines": { "node": ">=0.4.0" }
5、builtin——標誌當前包是否是內建在底層系統的標準組件
[注意]livereload外掛程式並沒有設定builein屬性
6、directories——包目錄說明
"directories": {}
7、implements——實現規範的列表。標誌當前包實現了CommonJS的哪些規範
[注意]livereload外掛程式並沒有設定implements屬性
8、scripts——指令碼說明對象。它主要被包管理器用來安裝、編譯、測試和卸載包。scripts
指定了運行指令碼命令的npm命令列縮寫,比如start指定了運行npm run start
時,所要執行的命令
"scripts": { "test": "mocha" },
其他欄位
在包描述檔案的規範中,NPM實際需要的欄位主要有name、version、description、keywords、repositories、author、bin、main、scripts、engines、dependencies、devDependencies。與包規範的區別在於多了author、bin、main和devDependencies這4個欄位
1、author——包作者
[注意]livereload外掛程式並沒有設定author屬性
2、bin——指定各個內部命令對應的可執行檔的位置。一些包作者希望包可以作為命令列工具使用。配置好bin欄位後,通過npm install package_name -g命令可以將指令碼添加到執行路徑中,之後可以在命令列中直接執行。通過-g命令安裝的模組包稱為全域模式
下面代碼指定,livereaload命令對應的可執行檔為 bin 子目錄下的 livereload.js。Npm會尋找這個檔案,在node_modules/.bin/
目錄下建立符號連結。在上面的例子中,livereaload會建立符號連結npm_modules/.bin/someTool
。由於node_modules/.bin/
目錄會在運行時加入系統的PATH變數,因此在運行npm時,就可以不帶路徑,直接通過命令來調用這些指令碼
"bin": { "livereload": "./bin/livereload.js" }
因此,像下面這樣的寫法可以採用簡寫
scripts: { start: ‘./node_modules/livereload.js build‘}// 簡寫為scripts: { start: ‘livereload build‘}
所有node_modules/.bin/
目錄下的命令,都可以用npm run [命令]
的格式運行。在命令列下,鍵入npm run
,然後按tab鍵,就會顯示所有可以使用的命令
3、main——載入的入口檔案。模組引入方法require()在引入包時,會優先檢查這個欄位,並將其作為包中其餘模組的入口。如果不存在這個欄位,require()方法會尋找包目錄下的index.js、index.node、index.json檔案作為預設入口
"main": "./lib/livereload.js"
4、devDependencies——項目開發所需要的模組。一些模組只在開發時需要依賴。配置這個屬性,可以提示包的後續開發人員安裝依賴包。類比於dependencies欄位
"devDependencies": { "coffee-script": ">= 1.8.0", "mocha": ">= 1.0.3", "request": ">= 2.9.203", "should": ">= 0.6.3", "sinon": "^1.17.4" }
nodeJS中的包