Node.js 讓 JavaScript 編寫服務器端應用程序成爲可能。它創建在 JavaScript V8(C++ 編寫的) 運行時之上,因此它很快。最初,它旨在爲應用程序提供服務器環境,可是開發人員開始利用它來建立工具,幫助他們本地的任務自動化。此後,一個全新基於 Node 工具(如 Grunt 和 Gulp)的生態系統,使得前端開發改頭換面。前端
要使用 Node.js 中的這些工具(或包),咱們須要一種有效的方式來安裝和管理它們。這就要用到node 包管理器: npm 了。它可以安裝你想要的包,並且提供一個強大接口來使用它們。在使用 npm 以前,首先得在系統上安裝 Node.js。node
安裝 Node.js linux
先去 Node.js 的下載頁面,而後選擇你須要的版本。有 Windows 和 Mac 版的安裝程序能夠用,還有預編譯的 Linux 二進制文件和源代碼。對於 Linux ,也能夠用包管理器來安裝 Node,下面將詳細介紹。 git
這篇教程中使用的是 v.5.7.0 穩定版。npm
先看看 node 被安裝到哪了,而後確認下版本。json
$ which node緩存
/usr/local/bin/node安全
$ node --versionbash
v5.7.0服務器
驗證下安裝是否成功,試試 Node REPL 。
$ node
> console.log('Node is running');
Node is running
> .help
.break Sometimes you get stuck, this gets you out
.clear Alias for .break
.exit Exit the repl
.help Show repl options
.load Load JS from a file into the REPL session
.save Save all evaluated commands in this REPL session to a file
> .exit
安裝的 Node.js 工做了,那麼把注意力集中到 npm 上吧,安裝 Node.js 過程當中也安裝了 npm 。
$ which npm
/usr/local/bin/npm
$ npm --version
3.6.0
Node 包模塊
npm 有兩種模式安裝包,local(本地) 和 global(全球) 。在 local 模式下,它會安裝 node_modules 文件夾(在工做目錄的父目錄)中的包。這個位置是屬於當前用戶的。Global 包安裝在 root 用戶下 {prefix}/lib/node_modules/ ({prefix} 一般是 /usr/ 或者 /usr/local)。這就意味須要使用 sudo 命令來安裝 global 包,不然當解析第三方包依賴時,出於安全考慮可能會出現權限錯誤。 讓咱們來修改下:
看看 npm config 輸出了些啥。
$ npm config list
; cli configs
user-agent = "npm/3.6.0 node/v5.7.0 linux x64"
; node bin location = /usr/local/bin/node
; cwd = /home/sitepoint
; HOME = /home/sitepoint
; 'npm config ls -l' to show all defaults.
輸出了一些安裝信息。如今獲取當前 global 位置是很重要的。
$ npm config get prefix
/usr/local
這是咱們想要改變的前綴,那樣就能把 global 包安裝到咱們的 home 目錄中。在你的 home 文件夾中建立一個新的目錄。
$ cd && mkdir .node_modules_global
$ npm config set prefix=$HOME/.node_modules_global
簡單的修改下配置,就把 Node global 包的安裝位置改變了。這個操做也會在咱們的 home 目錄中生成一個 .npmrc 文件。
$ npm config get prefix
/home/sitepoint/.node_modules_global
$ cat .npmrc
prefix=/home/sitepoint/.node_modules_global
npm 安裝位置仍然在 root 用戶的目錄中。但由於改變了 global 包的位置,因此能夠利用這一點。咱們須要從新安裝 npm,但此次安裝在新用戶自備的位置。此次也是安裝最新版本的 npm。
$ npm install npm --global
/home/sitepoint/.node_modules_global/bin/npm -> /home/sitepoint/.node_modules_global/lib/node_modules/npm/bin/npm-cli.js
/home/sitepoint/.node_modules_global/lib
└── npm@3.7.5
最後,須要將 .node_modules_global/bin 添加到環境變量 $PATH 中,這樣就能夠在命令行中運行 global 包命令。將下面這行命令追加到 .profile 或 .bash_profile 中,而後重啓終端。
export PATH="$HOME/.node_modules_global/bin:$PATH"
如今就會先發現 .node_modules_global/bin,而後使用正確版本的 npm。
$ which npm
/home/sitepoint/.node_modules_global/bin/npm
$ npm --version
3.7.5
Global 模式下安裝包
目前只安裝了一個 global 包,那就是 npm 自己。因此讓咱們來試試其餘的,安裝 UglifyJS(一個 JavaScript 壓縮工具 )。咱們將使用 –global 標識,能夠簡寫成 -g。
$ npm install uglify-js --global
/home/sitepoint/.node_modules_global/lib
└─┬ uglify-js@2.6.2
├── async@0.2.10
├── source-map@0.5.3
├── uglify-to-browserify@1.0.2
└─┬ yargs@3.10.0
├── camelcase@1.2.1
├─┬ cliui@2.1.0
│ ├─┬ center-align@0.1.3
│ │ ├─┬ align-text@0.1.4
│ │ │ ├─┬ kind-of@3.0.2
│ │ │ │ └── is-buffer@1.1.2
│ │ │ ├── longest@1.0.1
│ │ │ └── repeat-string@1.5.4
│ │ └── lazy-cache@1.0.3
│ ├── right-align@0.1.3
│ └── wordwrap@0.0.2
├─┬ decamelize@1.1.2
│ └── escape-string-regexp@1.0.5
└── window-size@0.1.0
正如從輸出中所看到的,額外的一些包也被安裝了,這些都是 uglify.js 所依賴的其餘包。
列出全部 global 包
能夠用 npm list 命令列出全部咱們安裝的 global 包。
$ npm list --global
├─┬ npm@3.7.5
│ ├── abbrev@1.0.7
│ ├── ansi-regex@2.0.0
│ ├── ansicolors@0.3.2
│ ├── ansistyles@0.1.3
....................
└─┬ uglify-js@2.6.2
├── async@0.2.10
├── source-map@0.5.3
├── uglify-to-browserify@1.0.2
不過輸出太冗長了。可使用 –depth=0 參數來控制輸出。
$ npm list -g --depth=0
├── npm@3.7.5
└── uglify-js@2.6.2
這就好多了,只輸出安裝的包和它們的版本號。
能夠在終端中使用 uglifyjs 解析 JavaScript 文件。例如使用下面的命令能夠將 example.js 轉換成 example.min.js :
$ uglifyjs example.js -o example.min.js
local 模式安裝包
local 模式安裝包去掉 –global 參數就好了。包將被安裝在父級工做目錄中一個 node_modules 文件夾裏。在 home 目錄中建立一個文件夾:
$ mkdir ~/project && cd ~/project
$ npm install underscore
/home/sitepoint/project
└── underscore@1.8.3
$ ls
node_modules
$ ls node_modules
underscore
列出全部 local 包
和 global 包同樣,使用 npm list 命令就能列出全部 local 包。
$ npm list
/home/sitepoint/project
└── underscore@1.8.3
正如你所見,咱們能夠把 local 包安裝在任何咱們想安裝的位置。這就意味着能夠建立另一個目錄而後安裝一個不一樣版本的 underscore。
卸載 local 包
npm 是一個包管理器,因此它確定也能夠卸載一個包。讓咱們假設當前版本的 underscore 包存在兼容問題。移除當前的包而後安裝一個老版本的,像這樣:
$ npm uninstall underscore
- underscore@1.8.3 node_modules/underscore
$ npm list
/home/sitepoint/project
└── (empty)
安裝一個指定版本的包
如今能夠安裝咱們想要的版本的 underscore 包。@ 後面追加版本號就能夠了。
$ npm install underscore@1.8.2
/home/sitepoint/project
└── underscore@1.8.2
$ npm list
/home/sitepoint/project
└── underscore@1.8.2
更新包
最新版本的 underscore 修復了一些以前的 bug ,而後咱們想要更新包到最新版本。
$ npm update underscore
underscore@1.8.3 node_modules/underscore
$ npm list
/home/sitepoint/project
└── underscore@1.8.3
注意:對於這項操做,underscore 已經在 package.json 中已經被當成依賴列出來了(看看如何管理依賴)。
搜索包
在本教程中屢次使用 mkdir 命令。是否有一個 node 包 來作這件事情呢?
$ npm search mkdir
npm WARN Building the local index for the first time, please be patient
有個 mkdirp。安裝它。
$ npm install mkdirp
/home/sitepoint/project
└─┬ mkdirp@0.5.1
└── minimist@0.0.8
如今建立一個 mkdir.js 文件。
var mkdirp = require('mkdirp');
mkdirp('foo', function (err) {
if (err) console.error(err)
else console.log('Directory created!')
});
而後在終端中運行它:
$ node. mkdir.js
Directory created!
管理緩存
當 npm 安裝一個包的時候它會維護一個副本,下次你想再次安裝那個包的時候,就不用再去訪問網絡從新下載了。那些副本會在 home 目錄 .npm 文件夾中緩存起來。
$ ls ~/.npm
_locks minimist mkdirp registry.npmjs.org underscore
隨着時間推移,這個目錄裏會有不少老的包,十分的混亂,因此時常清理下是十分有必要的。
$ npm cache clean
管理依賴
目前在咱們的項目目錄中只安裝了兩個包,不過包的數量會增加的很是快。手動安裝依賴是很是不明智的,因此能夠在項目目錄中用 package.json 文件來管理它們。經過 nmp init 命令能夠建立。
$ npm init
This utility will walk you through creating a package.json file.
Press ^C at any time to quit.
name: (project) demo
version: (1.0.0)
description: Demo of package.json
entry point: (index.js)
test command:
git repository:
keywords:
author: Sitepoint
license: (ISC)
這會在項目根目錄中建立下面的文件
{
"name": "demo",
"version": "1.0.0",
"description": "Demo package.json",
"main": "main.js",
"dependencies": {
"mkdirp": "^0.5.1",
"underscore": "^1.8.3"
},
"devDependencies": {},
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
},
"author": "Sitepoint",
"license": "ISC"
}
若是你想快速生成一個 package.json 文件的話,使用下面的命令:
$ npm init --yes
會快速建立一個 package.json 文件,你的目錄名會被做爲 name 屬性。
還能夠添加參數 private: true 防止私有庫不當心被髮布,還能消除運行 npm 安裝時的各類警告。讓咱們建立一個新的目錄,使用 package.json 文件來安裝依賴。
$ mkdir ~/demo && cd ~/demo
$ cp ~/project/package.json ~/demo
$ npm install
$ npm list
demo@1.0.0 /home/sitepoint/demo
├─┬ mkdirp@0.5.1
│ └── minimist@0.0.8
└── underscore@1.8.3
看看基於 package.json 文件在另一個目錄中安裝包是多麼的簡單。可是當安裝新包的時候如何讓它保持最新呢?咱們可使用 –save 標識。
$ npm install request --save
$ npm list --depth=0
demo@1.0.0 /home/sitepoint/demo
├── mkdirp@0.5.1
├── request@2.53.0
└── underscore@1.8.3
而後 package.json 也就被更新了。
"dependencies": {
"mkdirp": "^0.5.1",
"request": "^2.53.0",
"underscore": "^1.8.3"
}
版本管理
有些工具能夠幫你在同一臺機器上管理不一樣版本的 Node.js。有個叫 n 的工具。還有個是 nvm(Node Version Manager)。若是你對這些有興趣的話,不妨看看咱們另一篇教程: 使用 nvm 安裝多版本 Node.js。
總結
在這篇教程中,講解了使用 npm 工做的基本知識。展現瞭如何從項目下載頁面安裝 Node.js,如何修改 global 包的位置(避免使用 sudo 命令),還有如何在 local 、 global 模式下安裝包。以及刪除、更新、安裝指定版本的包,最後還有管理項目依賴。
你會在項目中使用 npm 嗎?在 npm 倉庫有數以千計的包,隨着 jQuery 插件也能快速在 npm 倉庫發佈,包的數量確定會保持增加。