nodeJS中的包

來源:互聯網
上載者:User

標籤:之間   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中的包

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.