最近要開始學習node了,以前雖然也一直用npm但都是零零散散,如今從網上找一些關鍵點作下記錄。
html
Node包管理器(NPM: Node Package Manager)node
NPM包含三部分:一個用來存放第三方包的代碼庫,一個管理本地已經安裝包的機制,一個用來定義包依賴關係的標準。NPM提供了一個公共的註冊服 務,它包含了你們發佈的全部包,並提供了一個命令行工具,用來下載,安裝和管理這些包。你能夠按照Node的包格式標準來制定你的包或者應用須要依賴的其 他第三方包。jquery
雖然不用瞭解NPM就能夠開始使用Node,可是若是要用第三方包你就必需要學習它了,由於Node自己只提供了一些低層的API,使用第三方模塊 能夠大幅減小開發複雜度,不用什麼都得親自編碼。NPM容許你在一個沙箱裏下載和使用模塊,你能夠盡情地試驗你感興趣的東西,而不用擔憂污染全局的包環 境。git
NPM和 Node之前須要獨立安裝,從0.6.0版本之後,NPM已經包含在了Node安裝包裏。github
NPM的操做主要有兩種模式:全局和本地。這兩種模式會影響包存放的目錄結構,以及Node加載包時的順序。shell
本地模式是NPM的默認操做模式,在這個模式下,NPM只工做在工做目錄下,不會形成系統範圍的修改,這個模式讓你在某個Node程序下盡情地安裝,測試模塊,而不會影響你電腦上的其餘Node程序。express
全局模式適合那些將被不少程序使用,並且老是被全局加載的公共模塊,好比命令行工具這些公不會被應用程序直接使用的模塊。npm
若是你不知道一個模塊該用哪一個模式安裝,那就應該使用本地模式。若是一個模塊的做者須要某個模塊被全局的安裝,一般他會在安裝說明裏指出。json
若是你安裝Node時使用的默認目錄,在全局模式下面,NPM會把包安裝到/usr/local/lib/node_modules。若是你執行下 面的命令,NPM會搜索並下載名爲sax的最新版並安裝到/usr/local/lib/node_modules/sax目錄下。
app
$ npm install –g sax
注意:若是你當前shell用戶沒有足夠的權限,你須要使用root用戶登陸或者使用sudo來執行命令:
$ sudo npm install –g sax
隨後在你的Node腳本里須要sax模塊的時候,使用下面的語句來加載:
var sax = require(‘sax');
若是你沒有在應用程序目錄下用本地模式安裝過sax,Node將會在前面的安裝目錄裏查找名爲sax的模塊,不然會優先加載本地版本。
默認模式是本地模式,所以你須要在NPM命令後加上-g標記來啓用全局模式。
本地模式是Node包依賴機制的默認推薦模式,這個模式下,NPM安裝的全部東西都在當前工做目錄(根目錄也不例外),而不會影響任何全局的設置。 這種機制可讓你一個個的設置應用程序的依賴模塊以及它們的版本,而不用擔憂會污染全局的模塊空間。這意味着你能夠有依賴同一個模塊不一樣版本的兩個應用, 它們卻不會產生衝突。
在這個模式下,NPM使用當前工做目錄下的node_modules目錄來存放模塊,好比你當前工做目錄是/home/user/apps /my_app,NPM將會用/home/user/apps/my_app/node_modules來存放全部本地模塊。這意味着,若是你在代碼裏使 用模塊名來引用模塊,Node首先會到這個本地的node_modules目錄下查找,若是沒找到纔會去搜索全局的node_modules目錄,本地模 塊優先級老是高於全局模塊。
使用下面命令來安裝一個模塊的最新版本:
$ npm install <package name>
例如,下載和安裝名一個名爲sax的模塊的最新版本,你首先須要把你應用程序的根目錄設置爲當前目錄,而後輸入:
$ npm install jquery
這個操做,會在當前目錄下創建node_modules子目錄(若是不存在的話),而後在下面安裝sax模塊。
你也能夠經過下面的命令,來選擇安裝某個特定的版本:
$ npm install <package name>@<version spec>
使用指定的版本號替換命令裏的佔位符便可,好比,要下載sax模塊的0.2.5版本,你只用運行:
$ npm install sax@0.2.5
或者,安裝版本號小於0.3的最新版:
$ npm install sax@」<0.3」
甚至能夠指定一個版本範圍:
$ npm install sax@">=0.1.0 <0.3.1"
使用下面命令能夠卸載一個本地模塊:
$ npm uninstall <package name>
若是要卸載的是一個全局模塊,加上-g標記便可:
$ npm uninstall -g <package name>
$ npm update <package name>
這個命令會嘗試獲取最新版的模塊包並更新本地版本,若是本地沒有安裝,則會安裝它,若是須要更新的是全局環境,須要加上-g標記:
$ npm update –g <package name>
模塊能夠包含一個或多個可執行文件,若是你使用默認目錄設置來安裝一個全局模塊,NPM會把可執行文件安裝到/usr/local/bin目錄下, 這個目錄一般也被設置爲系統PATH環境變量的一部分。若是你局部安裝這個模塊,NPM會把全部可執行文件放到./node_modules/.bin目 錄下。
NPM不只安裝你須要的模塊包,並且會安裝這些模塊所依賴的其它模塊,好比,若是你須要安裝模塊A,而A又依賴模塊B和C,那麼在你安裝A的時候B和C同時會被安裝到./node_modules/A/node_modules目錄下。
例如,你用下面的命令本地安裝了一個叫nano的模塊:
$npm install nano
NPM的輸出會相似這樣:
這告訴你nano模塊依賴underscore和request兩個模塊,而且還指出了安裝的版本。若是你如今去查看./node_modules/nano/node_modules目錄,你會發現這兩個模塊已經被安裝了:
$ ls node_modules/nano/node_modules
request underscore
當開始編寫一個應用程序時,能夠在應用程序根目錄建立一個package.json文件來定義應用程序的元數據,好比應用的名字,做者,代碼庫地址,聯繫方式等等。程序依賴的外部模塊也在這個文件裏指定。
若是不打算把程序發佈到NPM上,就能夠不用建這個文件,不過即便你的程序是私有的,這個文件其實也有用,它能夠告訴NPM這個應用程序的依賴關 系。(譯者注:好比你把項目源碼從開發環境複製到生產環境,能夠經過調用npm install來一次性安裝全部依賴包,npm會經過package.json內指定的依賴關係來自動完成依賴模塊的下載安裝,不用本身一個個去操做,稍 候有詳細介紹)
package.json是一個JSON格式的文件,包含了一系列屬性,可是若是僅僅是爲了說明程序的依賴關係,則只用一個 dependencies屬性就行。好比,一個叫MyApp的應用程序依賴sax,nano和request模塊,只須要創建這樣一個 package.json:
複製代碼 代碼以下:
{
"name" : "MyApp",
"version" : "1.0.0",
"dependencies" : {
"sax" : "0.3.x",
"nano" : "*",
"request" : ">0.2.0"
}
}
你指定了MyApp應用,依賴0.3版本的sax,任意版本的nano,以及版本高於0.2.0的request模塊。
注意:你可能發現,若是你指定了name和version字段,NPM會不工做,這隻會發生在舊版本的NPM,由於最初NPM是針對公共模塊使用的,而不是私有程序。
而後,在應用程序的根目錄,執行:
複製代碼 代碼以下:
$ npm install
這樣,NPM就會分析依賴關係以及你本地的node_modules目錄,並自動的下載和安裝缺失的模塊。
你也能夠經過下面的命令把全部本地模塊更新到符合你定義的依賴項設置的最新版本:
複製代碼 代碼以下:
$npm update
事實上,你僅用update方法就好了,由於它會讓NPM自動獲取那些缺失的依賴模塊。
name
~ 在package.json中最重要的就是name和version字段。他們都是必須的,若是沒有就沒法install;
~ 想好名字以前先去npm registry查看一下這個名字是否已經被使用了,http://registry.npmjs.org/
version
~ version必須能被 node-semver解析,它被包在npm的依賴中;
~ name和version一塊兒組成的標識在假設中是惟一的。改變包應該同時改變version
private
~ 若是你設置"private": true,npm就不會發布它;
~ 這是一個防止意外發布私有庫的方式。若是你要肯定給定的包是隻發佈在特定registry(如內部registry)的,用publishConfighash的描述來重寫registry的publish-time配置參數
scripts
~ 「scripts」是一個由腳本命令組成的hash對象,他們在包不一樣的生命週期中被執行。key是生命週期事件,value是要運行的命令。
dependencies
~ 依賴是給一組包名指定版本範圍的一個hash。這個版本範圍是一個由一個或多個空格分隔的字符串。依賴還能夠用tarball或者git URL
以上五項僅僅是Express4 package.json使用的,其餘細節可參考文檔 傳送門https://www.npmjs.org/doc/files/package.json.html
一、npm install moduleNames:安裝Node模塊
安裝完畢後會產生一個node_modules目錄,其目錄下就是安裝的各個node模塊。
node的安裝分爲全局模式和本地模式。
通常狀況下會以本地模式運行,包會被安裝到和你的應用程序代碼的本地node_modules目錄下。
在全局模式下,Node包會被安裝到Node的安裝目錄下的node_modules下。
全局安裝命令爲$npm install -g moduleName。
獲知使用$npm set global=true來設定安裝模式,$npm get global能夠查看當前使用的安裝模式。
示例:
npm install express
默認會安裝express的最新版本,也能夠經過在後面加版本號的方式安裝指定版本,如npm install express@3.0.6
npm install <name> -g
將包安裝到全局環境中
可是代碼中,直接經過require()的方式是沒有辦法調用全局安裝的包的。全局的安裝是供命令行使用的,就好像全局安裝了vmarket後,就能夠在命令行中直接運行vm命令
npm install <name> --save
安裝的同時,將信息寫入package.json中項目路徑中若是有 package.json文件時,直接使用npm install方法就能夠根據dependencies配置安裝全部的依賴包,這樣代碼提交到github時,就不用提交node_modules這個文 件夾了。
二、npm view moduleNames:查看node模塊的package.json文件夾
注意事項:若是想要查看package.json文件夾下某個標籤的內容,可使用$npm view moduleName labelName
三、npm list:查看當前目錄下已安裝的node包
注意事項:Node模塊搜索是從代碼執行的當前目錄開始的,搜索結果取決於當前使用的目錄中的node_modules下的內容。$ npm list parseable=true能夠目錄的形式來展示當前安裝的全部node包
四、npm help:查看幫助命令
五、npm view moudleName dependencies:查看包的依賴關係
六、npm view moduleName repository.url:查看包的源文件地址
七、npm view moduleName engines:查看包所依賴的Node的版本
八、npm help folders:查看npm使用的全部文件夾
九、npm rebuild moduleName:用於更改包內容後進行重建
十、npm outdated:檢查包是否已通過時,此命令會列出全部已通過時的包,能夠及時進行包的更新
十一、npm update moduleName:更新node模塊
十二、npm uninstall moudleName:卸載node模塊
1三、一個npm包是包含了package.json的文件夾,package.json描述了這個文件夾的結構。訪問npm的json文件夾的方法以下:
$ npm help json
此命令會以默認的方式打開一個網頁,若是更改了默認打開程序則可能不會以網頁的形式打開。
1四、發佈一個npm包的時候,須要檢驗某個包名是否已存在
$ npm search packageName
1五、npm init:會引導你建立一個package.json文件,包括名稱、版本、做者這些信息等
1六、npm root:查看當前包的安裝路徑
npm root -g:查看全局的包的安裝路徑
1七、npm -v:查看npm安裝的版本
一、本博客中的文章摘自網上的衆多博客,僅做爲本身知識的補充和整理,並分享給其餘須要的coder,不會用於商用
二、由於不少博客的地址已經記不清楚了,因此不會在這裏標明出處