Node包管理器(npm)是一個有Node.js官方提供的第三方包管理工具。npm是一個完全由JavaScript實現的命令行工具,通過Node.js執行,因此嚴格來說它不屬于Node.js的一部分。在Node0.6以前安裝完Node需要手動安裝npm,后來包含在發行包中。
在介紹NPM之前先介紹CommonJS的包規范。
CommonJS的包規范?
包結構 ?+ ?包描述文件
包結構:用于組織包中各種文件。
包描述文件:用于描述包的相關信息,以供外部讀取分析
包結構
包實際上是一個存檔文件,即一個目錄直接打包為zip或tar.gz格式文件,安裝后解壓還原為目錄。完全符合CommonJS規范的包目錄應該包含如下
package.json:包描述文件。
bin:用于存放可執行二進制文件的目錄
lib:用于存放JavaScript代碼的目錄。
doc:用于存放文檔的目錄
test:用于存放單元測試用例的代碼。
包描述文件
包描述文件用于表達非代碼相關的信息,它是一個JSON格式的文件----package.json,位于報的根目錄下,是包的重要組成部分。而NPM的所有行為都與包描述文件的字段息息相關。由于CommonJS規范尚處于草案階段,NPM在實踐中做了一定得取舍。
CommonJS為package.json文件定義了如下一些必要的字段。
name:包的名稱,必須是唯一的,由小寫英文字母、數字和下劃線組成,不能包含空格。
description:包的簡要說明。
version:符合語義化八本識別規范的版本字符串。
keywords:關鍵字數組,通常用于搜索。
maintainers:維護者數組,每個元素要包含name、email(可選)、web(可選)字段。
contributors:貢獻者數組,格式與maintainers相同。包的作者應該是貢獻者數組的第一個元素。
bugs:提交bug的地址,可以是網址或者電子郵件地址。
licenses:許可證數組,每個元素要包含type(許可證的名稱)和url(鏈接到許可證文本的地址)字段。
repositories:倉庫托管地址數組。每個元素要包含type(許可證的名稱)和url(鏈接到許可證文本的地址)字段。
dependencies:包的依賴,一個關聯數組,由包名稱和版本組成。
除了必選字段外,規范還定義了一部分可選字段。home、os、cpu、engine、builtin、directories、implements、scripts(腳本說明對象。它主要被包管理器用來安裝、編譯、測試和卸載包)
"scripts":{
"install":"install.js",
"uninstall":"uninstall.js",
"build":"build.js",
"doc":"make-doc.js",
"test":"text.js"
}
包規范的定義可以幫助Node解決依賴包安裝的問題,而NPM正是基于該規范進行了實現,與包描述文件的規范匯中,NPM實際上比包規范多了author、bin、main和 devDependencies這4個字段。
author : 包作者。
bin :一些包作者希望包作為命令行工具使用,配置好bin字段后,通過npm install packageName -g命令可以將腳本添加到執行路徑中,之后可以在命令行中直接執行。
main:模塊引入方法require()在引入包時,會優先檢查這個字段,并將其作為包中其余模塊的入口,如果不存在這個字段,require()方法會查找包目錄下的index.js、index.node、index.json文件作為默認入口
devDependencies:一些模塊只在開發時需要依賴,配置這個屬性,可以提示包的后續開發者安裝依賴包。
NPM 常用功能
CommonJS包規范是理論,NPM是其中的一種實現,借助NPM,用戶可以快速安裝和管理依賴包
1.查看幫助
npm -v 查看版本?
npm 查看到幫助引導說明
npm help <command>可以查看具體的命令說明
2.安裝依賴包
npm install packageName
執行該命令后,npm會在當前目錄下創建node_modules目錄,然后在node_modules目錄下創建安裝的包目錄,接著將包解壓到這個目錄下。
安裝好依賴包后,直接在代碼中調用require("包名")即可引入改包。require()方法在做路徑分析的時候會通過模塊路徑查找到安裝包所在的位置。
全局模式安裝? npm install packageName -g (包中含有命令行工具)
創建package.json文件 ?npm init
3.分析包
在使用的過程中,不能確認當前目錄下能否通過require()順利引入想要的包,可以采用npm ls來分析包
這個命令可以分析當前路徑下能夠通過模塊路徑找到的所有包,并生成依賴樹