NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS代碼部署上的很多問題,常見的使用場景有以下幾種:
- 允許用戶從NPM服務器下載別人編寫的第三方包到本地使用。
- 允許用戶從NPM服務器下載並安裝別人編寫的命令行程序到本地使用。
- 允許用戶將自己編寫的包或命令行程序上傳到NPM服務器供別人使用。
由於新版的nodejs已經集成了npm,所以之前npm也一並安裝好了。同樣可以通過輸入 "npm -v" 來測試是否成功安裝。命令如下,出現版本提示表示安裝成功:
$ npm -v 2.3.0
如果你安裝的是舊版本的 npm,可以很容易得通過 npm 命令來升級,命令如下:
$ sudo npm install npm -g /usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js npm@2.14.2 /usr/local/lib/node_modules/npm
-------------------------------------------------------------------------
在按照以上說明安裝是出現了這類異常
[root@vm8028 ~]# npm -v 1.3.21 [root@vm8028 ~]# npm install -g npm npm http GET https://registry.npmjs.org/npm npm http 304 https://registry.npmjs.org/npm npm WARN package.json path-is-inside@1.0.2 No README data npm WARN package.json sorted-object@2.0.1 No README data /usr/local/node/0.10.24/bin/npm -> /usr/local/node/0.10.24/lib/node_modules/npm/bin/npm-cli.js /usr/local/node/0.10.24/bin/npx -> /usr/local/node/0.10.24/lib/node_modules/npm/bin/npx-cli.js npm@5.5.1 /usr/local/node/0.10.24/lib/node_modules/npm [root@vm8028 ~]# npm /usr/local/node/0.10.24/lib/node_modules/npm/lib/utils/unsupported.js:27 console.error(`a bug known to break npm. Please update to at least ${r ^ SyntaxError: Unexpected token ILLEGAL at Module._compile (module.js:439:25) at Object.Module._extensions..js (module.js:474:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Module.require (module.js:364:17) at require (module.js:380:17) at /usr/local/node/0.10.24/lib/node_modules/npm/bin/npm-cli.js:19:21 at Object.<anonymous> (/usr/local/node/0.10.24/lib/node_modules/npm/bin/npm-cli.js:92:3) at Module._compile (module.js:456:26) at Object.Module._extensions..js (module.js:474:10) [root@vm8028 ~]# npm -v /usr/local/node/0.10.24/lib/node_modules/npm/lib/utils/unsupported.js:27 console.error(`a bug known to break npm. Please update to at least ${r ^ SyntaxError: Unexpected token ILLEGAL at Module._compile (module.js:439:25) at Object.Module._extensions..js (module.js:474:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Module.require (module.js:364:17) at require (module.js:380:17) at /usr/local/node/0.10.24/lib/node_modules/npm/bin/npm-cli.js:19:21 at Object.<anonymous> (/usr/local/node/0.10.24/lib/node_modules/npm/bin/npm-cli.js:92:3) at Module._compile (module.js:456:26) at Object.Module._extensions..js (module.js:474:10)
解決版本,刪除nodejs 重新安裝
[root@vm8028 ~]# cd /usr/local/node/
[root@vm8028 ~]# cd /usr/local/node/
[root@vm8028 ~]# rm * -rf
然后重新安裝
升級是使用 進行升級
npm install npm@2.3.0 -g
其他介紹的升級方式等都會多多少少遇到些問題。
npm update -g npm
npm install npm@latest -g
-------------------------------------------------------------------------
如果是 Window 系統使用以下命令即可:
npm install npm -g
使用淘寶鏡像的命令:
cnpm install npm -g
使用 npm 命令安裝模塊
npm 安裝 Node.js 模塊語法格式如下:
$ npm install <Module Name>
以下實例,我們使用 npm 命令安裝常用的 Node.js web框架模塊 express:
$ npm install express
安裝好之后,express 包就放在了工程目錄下的 node_modules 目錄中,因此在代碼中只需要通過 require('express') 的方式就好,無需指定第三方包路徑。
var express = require('express');
全局安裝與本地安裝
npm 的包安裝分為本地安裝(local)、全局安裝(global)兩種,從敲的命令行來看,差別只是有沒有-g而已,比如
npm install express # 本地安裝 npm install express -g # 全局安裝
如果出現以下錯誤:
npm err! Error: connect ECONNREFUSED 127.0.0.1:8087
解決辦法為:
$ npm config set proxy null
本地安裝
- 1. 將安裝包放在 ./node_modules 下(運行 npm 命令時所在的目錄),如果沒有 node_modules 目錄,會在當前執行 npm 命令的目錄下生成 node_modules 目錄。
- 2. 可以通過 require() 來引入本地安裝的包。
全局安裝
- 1. 將安裝包放在 /usr/local 下或者你 node 的安裝目錄。
- 2. 可以直接在命令行里使用。
如果你希望具備兩者功能,則需要在兩個地方安裝它或使用 npm link。
接下來我們使用全局方式安裝 express
$ npm install express -g
安裝過程輸出如下內容,第一行輸出了模塊的版本號及安裝位置。
express@4.13.3 node_modules/express ├── escape-html@1.0.2 ├── range-parser@1.0.2 ├── merge-descriptors@1.0.0 ├── array-flatten@1.1.1 ├── cookie@0.1.3 ├── utils-merge@1.0.0 ├── parseurl@1.3.0 ├── cookie-signature@1.0.6 ├── methods@1.1.1 ├── fresh@0.3.0 ├── vary@1.0.1 ├── path-to-regexp@0.1.7 ├── content-type@1.0.1 ├── etag@1.7.0 ├── serve-static@1.10.0 ├── content-disposition@0.5.0 ├── depd@1.0.1 ├── qs@4.0.0 ├── finalhandler@0.4.0 (unpipe@1.0.0) ├── on-finished@2.3.0 (ee-first@1.1.1) ├── proxy-addr@1.0.8 (forwarded@0.1.0, ipaddr.js@1.0.1) ├── debug@2.2.0 (ms@0.7.1) ├── type-is@1.6.8 (media-typer@0.3.0, mime-types@2.1.6) ├── accepts@1.2.12 (negotiator@0.5.3, mime-types@2.1.6) └── send@0.13.0 (destroy@1.0.3, statuses@1.2.1, ms@0.7.1, mime@1.3.4, http-errors@1.3.1)
查看安裝信息
你可以使用以下命令來查看所有全局安裝的模塊:
$ npm list -g ├─┬ cnpm@4.3.2 │ ├── auto-correct@1.0.0 │ ├── bagpipe@0.3.5 │ ├── colors@1.1.2 │ ├─┬ commander@2.9.0 │ │ └── graceful-readlink@1.0.1 │ ├─┬ cross-spawn@0.2.9 │ │ └── lru-cache@2.7.3 ……
如果要查看某個模塊的版本號,可以使用命令如下:
$ npm list grunt
projectName@projectVersion /path/to/project/folder └── grunt@0.4.1
使用 package.json
package.json 位於模塊的目錄下,用於定義包的屬性。接下來讓我們來看下 express 包的 package.json 文件,位於 node_modules/express/package.json 內容:
{ "name": "express", "description": "Fast, unopinionated, minimalist web framework", "version": "4.13.3", "author": { "name": "TJ Holowaychuk", "email": "tj@vision-media.ca" }, "contributors": [ { "name": "Aaron Heckmann", "email": "aaron.heckmann+github@gmail.com" }, { "name": "Ciaran Jessup", "email": "ciaranj@gmail.com" }, { "name": "Douglas Christopher Wilson", "email": "doug@somethingdoug.com" }, { "name": "Guillermo Rauch", "email": "rauchg@gmail.com" }, { "name": "Jonathan Ong", "email": "me@jongleberry.com" }, { "name": "Roman Shtylman", "email": "shtylman+expressjs@gmail.com" }, { "name": "Young Jae Sim", "email": "hanul@hanul.me" } ], "license": "MIT", "repository": { "type": "git", "url": "git+https://github.com/strongloop/express.git" }, "homepage": "http://expressjs.com/", "keywords": [ "express", "framework", "sinatra", "web", "rest", "restful", "router", "app", "api" ], "dependencies": { "accepts": "~1.2.12", "array-flatten": "1.1.1", "content-disposition": "0.5.0", "content-type": "~1.0.1", "cookie": "0.1.3",