NPM 使用介绍

NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:

  • 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
  • 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
  • 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。

由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了。同样可以通过输入 "npm -v" 来测试是否成功安装。命令如下,出现版本提示表示安装成功:

  1. $ npm -v
  2. 2.3.0

如果你安装的是旧版本的 npm,可以很容易得通过 npm 命令来升级,命令如下:

  1. $ sudo npm install npm -g
  2. /usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js
  3. npm@2.14.2 /usr/local/lib/node_modules/npm

如果是 Window 系统使用以下命令即可:

  1. npm install npm -g

使用 npm 命令安装模块

npm 安装 Node.js 模块语法格式如下:

  1. $ npm install <Module Name>

以下实例,我们使用 npm 命令安装常用的 Node.js web框架模块 express:

  1. $ npm install express

安装好之后,express 包就放在了工程目录下的 node_modules 目录中,因此在代码中只需要通过 require('express') 的方式就好,无需指定第三方包路径。

  1. var express = require('express');

全局安装与本地安装

npm 的包安装分为本地安装(local)、全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已,比如

  1. npm install express # 本地安装
  2. npm install express -g # 全局安装

如果出现以下错误:

  1. npm err! Error: connect ECONNREFUSED 127.0.0.1:8087

解决办法为:

  1. $ npm config set proxy null

本地安装

  • 1. 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
  • 2. 可以通过 require() 来引入本地安装的包。

全局安装

  • 1. 将安装包放在 /usr/local 下或者你 node 的安装目录。
  • 2. 可以直接在命令行里使用。

如果你希望具备两者功能,则需要在两个地方安装它或使用 npm link

接下来我们使用全局方式安装 express

  1. $ npm install express -g

安装过程输出如下内容,第一行输出了模块的版本号及安装位置。

  1. express@4.13.3 node_modules/express
  2. ├── escape-html@1.0.2
  3. ├── range-parser@1.0.2
  4. ├── merge-descriptors@1.0.0
  5. ├── array-flatten@1.1.1
  6. ├── cookie@0.1.3
  7. ├── utils-merge@1.0.0
  8. ├── parseurl@1.3.0
  9. ├── cookie-signature@1.0.6
  10. ├── methods@1.1.1
  11. ├── fresh@0.3.0
  12. ├── vary@1.0.1
  13. ├── path-to-regexp@0.1.7
  14. ├── content-type@1.0.1
  15. ├── etag@1.7.0
  16. ├── serve-static@1.10.0
  17. ├── content-disposition@0.5.0
  18. ├── depd@1.0.1
  19. ├── qs@4.0.0
  20. ├── finalhandler@0.4.0 (unpipe@1.0.0)
  21. ├── on-finished@2.3.0 (ee-first@1.1.1)
  22. ├── proxy-addr@1.0.8 (forwarded@0.1.0, ipaddr.js@1.0.1)
  23. ├── debug@2.2.0 (ms@0.7.1)
  24. ├── type-is@1.6.8 (media-typer@0.3.0, mime-types@2.1.6)
  25. ├── accepts@1.2.12 (negotiator@0.5.3, mime-types@2.1.6)
  26. └── 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)

你可以使用以下命令来查看所有全局安装的模块:

  1. $ npm ls -g

使用 package.json

package.json 位于模块的目录下,用于定义包的属性。接下来让我们来看下 express 包的 package.json 文件,位于 node_modules/express/package.json 内容:

  1. {
  2. "name": "express",
  3. "description": "Fast, unopinionated, minimalist web framework",
  4. "version": "4.13.3",
  5. "author": {
  6. "name": "TJ Holowaychuk",
  7. "email": "tj@vision-media.ca"
  8. },
  9. "contributors": [
  10. {
  11. "name": "Aaron Heckmann",
  12. "email": "aaron.heckmann+github@gmail.com"
  13. },
  14. {
  15. "name": "Ciaran Jessup",
  16. "email": "ciaranj@gmail.com"
  17. },
  18. {
  19. "name": "Douglas Christopher Wilson",
  20. "email": "doug@somethingdoug.com"
  21. },
  22. {
  23. "name": "Guillermo Rauch",
  24. "email": "rauchg@gmail.com"
  25. },
  26. {
  27. "name": "Jonathan Ong",
  28. "email": "me@jongleberry.com"
  29. },
  30. {
  31. "name": "Roman Shtylman",
  32. "email": "shtylman+expressjs@gmail.com"
  33. },
  34. {
  35. "name": "Young Jae Sim",
  36. "email": "hanul@hanul.me"
  37. }
  38. ],
  39. "license": "MIT",
  40. "repository": {
  41. "type": "git",
  42. "url": "git+https://github.com/strongloop/express.git"
  43. },
  44. "homepage": "http://expressjs.com/",
  45. "keywords": [
  46. "express",
  47. "framework",
  48. "sinatra",
  49. "web",
  50. "rest",
  51. "restful",
  52. "router",
  53. "app",
  54. "api"
  55. ],
  56. "dependencies": {
  57. "accepts": "~1.2.12",
  58. "array-flatten": "1.1.1",
  59. "content-disposition": "0.5.0",
  60. "content-type": "~1.0.1",
  61. "cookie": "0.1.3",
  62. "cookie-signature": "1.0.6",
  63. "debug": "~2.2.0",
  64. "depd": "~1.0.1",
  65. "escape-html": "1.0.2",
  66. "etag": "~1.7.0",
  67. "finalhandler": "0.4.0",
  68. "fresh": "0.3.0",
  69. "merge-descriptors": "1.0.0",
  70. "methods": "~1.1.1",
  71. "on-finished": "~2.3.0",
  72. "parseurl": "~1.3.0",
  73. "path-to-regexp": "0.1.7",
  74. "proxy-addr": "~1.0.8",
  75. "qs": "4.0.0",
  76. "range-parser": "~1.0.2",
  77. "send": "0.13.0",
  78. "serve-static": "~1.10.0",
  79. "type-is": "~1.6.6",
  80. "utils-merge": "1.0.0",
  81. "vary": "~1.0.1"
  82. },
  83. "devDependencies": {
  84. "after": "0.8.1",
  85. "ejs": "2.3.3",
  86. "istanbul": "0.3.17",
  87. "marked": "0.3.5",
  88. "mocha": "2.2.5",
  89. "should": "7.0.2",
  90. "supertest": "1.0.1",
  91. "body-parser": "~1.13.3",
  92. "connect-redis": "~2.4.1",
  93. "cookie-parser": "~1.3.5",
  94. "cookie-session": "~1.2.0",
  95. "express-session": "~1.11.3",
  96. "jade": "~1.11.0",
  97. "method-override": "~2.3.5",
  98. "morgan": "~1.6.1",
  99. "multiparty": "~4.1.2",
  100. "vhost": "~3.0.1"
  101. },
  102. "engines": {
  103. "node": ">= 0.10.0"
  104. },
  105. "files": [
  106. "LICENSE",
  107. "History.md",
  108. "Readme.md",
  109. "index.js","lib/"],"scripts":{"test":"mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/","test-ci":"istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/ test/acceptance/","test-cov":"istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/","test-tap":"mocha --require test/support/env --reporter tap --check-leaks test/ test/acceptance/"},"gitHead":"ef7ad681b245fba023843ce94f6bcb8e275bbb8e","bugs":{"url":"https://github.com/strongloop/express/issues"},"_id":"express@4.13.3","_shasum":"ddb2f1fb4502bf33598d2b032b037960ca6c80a3","_from":"express@*","_npmVersion":"1.4.28","_npmUser":{"name":"dougwilson","email":"doug@somethingdoug.com"},"maintainers":[{"name":"tjholowaychuk","email":"tj@vision-media.ca"},{"name":"jongleberry","email":"jonathanrichardong@gmail.com"},{"name":"dougwilson","email":"doug@somethingdoug.com"},{"name":"rfeng","email":"enjoyjava@gmail.com"},{"name":"aredridel","email":"aredridel@dinhe.net"},{"name":"strongloop","email":"callback@strongloop.com"},{"name":"defunctzombie","email":"shtylman@gmail.com"}],"dist":{"shasum":"ddb2f1fb4502bf33598d2b032b037960ca6c80a3","tarball":"http://registry.npmjs.org/express/-/express-4.13.3.tgz"},"directories":{},"_resolved":"https://registry.npmjs.org/express/-/express-4.13.3.tgz","readme":"ERROR: No README data found!"}

Package.json 属性说明

  • name - 包名。

  • version - 包的版本号。

  • description - 包的描述。

  • homepage - 包的官网 url 。

  • author - 包的作者姓名。

  • contributors - 包的其他贡献者姓名。

  • dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。

  • repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。

  • main - main 字段是一个模块ID,它是一个指向你程序的主要项目。就是说,如果你包的名字叫 express,然后用户安装它,然后require("express")。

  • keywords - 关键字


卸载模块

我们可以使用以下命令来卸载 Node.js 模块。

  1. $ npm uninstall express

卸载后,你可以到 /node_modules/ 目录下查看包是否还存在,或者使用以下命令查看:

  1. $ npm ls

更新模块

我们可以使用以下命令更新模块:

  1. $ npm update express

搜索模块

使用以下来搜索模块:

  1. $ npm search express

创建模块

创建模块,package.json 文件是必不可少的。我们可以使用 NPM 生成 package.json 文件,生成的文件包含了基本的结果。

  1. $ npm init
  2. This utility will walk you through creating a package.json file.
  3. It only covers the most common items, and tries to guess sensible defaults.
  4.  
  5. See `npm help json` for definitive documentation on these fields
  6. and exactly what they do.
  7.  
  8. Use `npm install <pkg> --save` afterwards to install a package and
  9. save it as a dependency in the package.json file.
  10.  
  11. Press ^C at any time to quit.
  12. name: (node_modules) runoob # 模块名
  13. version: (1.0.0)
  14. description: Node.js 测试模块(www.runoob.com) # 描述
  15. entry point: (index.js)
  16. test command: make test
  17. git repository: https://github.com/runoob/runoob.git # Github 地址
  18. keywords:
  19. author:
  20. license: (ISC)
  21. About to write to ……/node_modules/package.json: # 生成地址
  22.  
  23. {
  24. "name": "runoob",
  25. "version": "1.0.0",
  26. "description": "Node.js 测试模块(www.runoob.com)",
  27. ……
  28. }
  29.  
  30. Is this ok? (yes) yes

以上的信息,你需要根据你自己的情况输入。在最后输入 "yes" 后会生成 package.json 文件。

接下来我们可以使用以下命令在 npm 资源库中注册用户(使用邮箱注册):

  1. $ npm adduser
  2. Username: mcmohd
  3. Password:
  4. Email: (this IS public) mcmohd@gmail.com

接下来我们就用以下命令来发布模块:

  1. $ npm publish

如果你以上的步骤都操作正确,你就可以跟其他模块一样使用 npm 来安装。


版本号

使用NPM下载和发布代码时都会接触到版本号。NPM使用语义版本号来管理代码,这里简单介绍一下。

语义版本号分为X.Y.Z三位,分别代表主版本号、次版本号和补丁版本号。当代码变更时,版本号按以下原则更新。

  • 如果只是修复bug,需要更新Z位。
  • 如果是新增了功能,但是向下兼容,需要更新Y位。
  • 如果有大变动,向下不兼容,需要更新X位。

版本号有了这个保证后,在申明第三方包依赖时,除了可依赖于一个固定版本号外,还可依赖于某个范围的版本号。例如"argv": "0.0.x"表示依赖于0.0.x系列的最新版argv。

NPM支持的所有版本号范围指定方式可以查看官方文档


NPM 常用命令

除了本章介绍的部分外,NPM还提供了很多功能,package.json里也有很多其它有用的字段。

除了可以在npmjs.org/doc/查看官方文档外,这里再介绍一些NPM常用命令。

NPM提供了很多命令,例如install和publish,使用npm help可查看所有命令。

  • NPM提供了很多命令,例如installpublish,使用npm help可查看所有命令。

  • 使用npm help <command>可查看某条命令的详细帮助,例如npm help install

  • package.json所在目录下使用npm install . -g可先在本地安装当前命令行程序,可用于发布前的本地测试。

  • 使用npm update <package>可以把当前目录下node_modules子目录里边的对应模块更新至最新版本。

  • 使用npm update <package> -g可以把全局安装的对应命令行程序更新至最新版。

  • 使用npm cache clear可以清空NPM本地缓存,用于对付使用相同版本号发布新版本代码的人。

  • 使用npm unpublish <package>@<version>可以撤销发布自己发布过的某个版本代码。


使用淘宝 NPM 镜像

大家都知道国内直接使用 npm 的官方镜像是非常慢的,这里推荐使用淘宝 NPM 镜像。

淘宝 NPM 镜像是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。

你可以使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:

  1. $ npm install -g cnpm --registry=https://registry.npm.taobao.org

这样就可以使用 cnpm 命令来安装模块了:

  1. $ cnpm install [name]

更多信息可以查阅:http://npm.taobao.org/

 
 
 

node.js ----NPM使用介绍的更多相关文章

  1. Node.js NPM 使用介绍

    NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器下载并 ...

  2. Node.js NPM 介绍

    章节 Node.js NPM 介绍 Node.js NPM 作用 Node.js NPM 包(Package) Node.js NPM 管理包 Node.js NPM Package.json NPM ...

  3. Node.js NPM Package.json

    章节 Node.js NPM 介绍 Node.js NPM 作用 Node.js NPM 包(Package) Node.js NPM 管理包 Node.js NPM Package.json Nod ...

  4. Node.js NPM 包(Package)

    章节 Node.js NPM 介绍 Node.js NPM 作用 Node.js NPM 包(Package) Node.js NPM 管理包 Node.js NPM Package.json 包是打 ...

  5. Node.js NPM 管理包

    章节 Node.js NPM 介绍 Node.js NPM 作用 Node.js NPM 包(Package) Node.js NPM 管理包 Node.js NPM Package.json 根据安 ...

  6. Node.js NPM 作用

    章节 Node.js NPM 介绍 Node.js NPM 作用 Node.js NPM 包(Package) Node.js NPM 管理包 Node.js NPM Package.json NPM ...

  7. Node.js NPM 教程

    NPM是Node.js的包(或模块)管理器,是Node.js应用程序开发的核心. www.npmjs.com上有海量的Node.js包,供免费下载使用. 当安装Node.js时,NPM程序会被同时安装 ...

  8. Latest node.js & npm installation on Ubuntu 12.04

    转自:https://rtcamp.com/tutorials/nodejs/node-js-npm-install-ubuntu/ Compiling is way to go for many b ...

  9. Node.js npm

    Node程序包管理器(NPM)提供了以下两个主要功能: 在线存储库的Node.js包/模块,可搜索 search.nodejs.org 命令行实用程序来安装Node.js的包,做版本管理和Node.j ...

随机推荐

  1. 自制wifi信号放大器

    自制wifi信号放大器 只要家里安装了一台无线路由器,在家里的任何地方都可以使用带上网功能的电子产品上网,但是由于距离的问题,WiFi信号有强弱之分,离无线路由器稍微远点,信号就有所降低,上网速度受影 ...

  2. Idea插件lombok的安装和使用

    C#在写一个实体类时,有属性的写法,省去了写getter和setter的麻烦. 在Java编程时,写完字段后,需要一个一个去写getter和setter方法.在使用Idea编程时,可以按住ALT+IN ...

  3. 【10】react 之 react-router

    1.1.  路由 路由:URL与处理器的映射. 浏览器当前的 URL 发生变化时,路由系统会做出一些响应,用来保证用户界面与 URL 的同步. 1.2.  Router安装 npm i react-r ...

  4. Connect(bzoj 1948)

    Description 给定一个R*C大小的迷宫,其中R,C均为奇数 迷宫中坐标为两个奇数的点不能通过,称为障碍,迷宫中其他不能通过的点统称为墙壁 坐标为两个偶数的点可以通过,称为房间,迷宫中其他可通 ...

  5. Memcache缓存用好了,性能有了很大的提高

    web服务器1 web服务器2 web服务器3如果每台web服务器都向mysql服务器表插入信息并且要做出相应最新编号反馈出现这样的高并发时候怎么减少服务器压力,同时用户体验还要好 可以使用Memca ...

  6. Manacher--雾窗寒对遥天暮,暮天遥对寒窗雾

    POJ 3974: Palindrome 题意: 最长回文子串的长度... 分析: Manacher板子题... 代码: #include<algorithm> #include<i ...

  7. java网络编程(三):一个类似QQ的聊天程序

    客户端: package QQ; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import ...

  8. 自定义及发布一个webservice服务

    自定义及发布一个webservice服务    - 声明 某个业务服务为webservice服务       通过@webservice 注解来声明    - 发布webservice服务       ...

  9. iptables之centos6版本详解

    1 Linux防火墙概述 Linux防火墙实际指的是Linux下的Netfilter/Iptables.Netfilter/Iptables是2.4.x/2.6.x版本Linux内核集成的IP信息包过 ...

  10. codevs——1220 数字三角形(棋盘DP)

     时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 如图所示的数字三角形,从顶部出发,在每一结点可以选择向左走或 ...