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

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

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

  1. KendeMacBook-Pro:~ ken$ npm -v
  2. 6.14.4

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

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

使用淘宝镜像的命令:

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

使用 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

本地安装

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

如果你遇到了使用 npm 安 装node_modules 总是提示报错:报错: npm resource busy or locked…..
可以先删除以前安装的 node_modules :

  1. npm cache clean
  2. npm install

全局安装

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

如果你希望具备两者功能,则需要在两个地方安装它或使用 npm link
接下来我们使用全局方式安装 express

  1. npm install express -g

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

  1. express@4.17.1
  2. ├── accepts@1.3.7
  3. ├── array - flatten@1.1.1
  4. ├── body - parser@1.19.0
  5. ├── content - disposition@0.5.3
  6. ├── content - type@1.0.4
  7. ├── cookie@0.4.0
  8. ├── cookie - signature@1.0.6
  9. ├── debug@2.6.9
  10. ├── depd@1.1.2
  11. ├── encodeurl@1.0.2
  12. ├── escape - html@1.0.3
  13. ├── etag@1.8.1
  14. ├── finalhandler@1.1.2
  15. ├── fresh@0.5.2
  16. ├── merge - descriptors@1.0.1
  17. ├── methods@1.1.2
  18. ├── on - finished@2.3.0
  19. ├── parseurl@1.3.3
  20. ├── path - to - regexp@0.1.7
  21. ├── proxy - addr@2.0.7
  22. ├── qs@6.7.0
  23. ├── range - parser@1.2.1
  24. ├── safe - buffer@5.1.2
  25. ├── send@0.17.1
  26. ├── serve - static@1.14.1
  27. ├── setprototypeof@1.1.1
  28. ├── statuses@1.5.0
  29. ├── type - is@1.6.18
  30. ├── utils - merge@1.0.1
  31. └── vary@1.1.2

查看安装信息

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

  1. #npm查看全局安装过的包
  2. npm list -g --depth 0
  3. ├── cnpm@6.2.0
  4. ├── express@4.17.1
  5. ├── npm@6.14.4
  6. └── react-native-cli@2.0.1

如果要查看某个模块的版本号,可以使用命令如下:

  1. npm list -g express
  2. /Users/ken/.nvm/versions/node/v12.18.0/lib
  3. └── express@4.17.1

使用 package.json

package.json 位于模块的目录下,用于定义包的属性。
package.json 属性说明

  • name - 包名
  • version- 包的版本号
  • description - 包的描述
  • homepage - 包的官网 url
  • author - 包的作者姓名。
  • contributors - 包的其他贡献者姓名。
  • dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。
  • repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。
  • main - main 字段指定了程序的主入口文件,require(‘moduleName’) 就会加载这个文件。这个字段的默认值是模块根目录下面的 index.js。
  • keywords - 关键字

接下来让我们来看下 express 包的 package.json 文件,位于 node_modules/express/package.json 内容:

  1. {
  2. "_from": "express",
  3. "_id": "express@4.17.1",
  4. "_inBundle": false,
  5. "_integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
  6. "_location": "/express",
  7. "_phantomChildren": {},
  8. "_requested": {
  9. "type": "tag",
  10. "registry": true,
  11. "raw": "express",
  12. "name": "express",
  13. "escapedName": "express",
  14. "rawSpec": "",
  15. "saveSpec": null,
  16. "fetchSpec": "latest"
  17. },
  18. "_requiredBy": [
  19. "#USER"
  20. ],
  21. "_resolved": "https://repo.huaweicloud.com/repository/npm/express/-/express-4.17.1.tgz",
  22. "_shasum": "4491fc38605cf51f8629d39c2b5d026f98a4c134",
  23. "_spec": "express",
  24. "_where": "/Users/ken",
  25. "author": {
  26. "name": "TJ Holowaychuk",
  27. "email": "tj@vision-media.ca"
  28. },
  29. "bugs": {
  30. "url": "https://github.com/expressjs/express/issues"
  31. },
  32. "bundleDependencies": false,
  33. "contributors": [
  34. {
  35. "name": "Aaron Heckmann",
  36. "email": "aaron.heckmann+github@gmail.com"
  37. },
  38. {
  39. "name": "Ciaran Jessup",
  40. "email": "ciaranj@gmail.com"
  41. },
  42. {
  43. "name": "Douglas Christopher Wilson",
  44. "email": "doug@somethingdoug.com"
  45. },
  46. {
  47. "name": "Guillermo Rauch",
  48. "email": "rauchg@gmail.com"
  49. },
  50. {
  51. "name": "Jonathan Ong",
  52. "email": "me@jongleberry.com"
  53. },
  54. {
  55. "name": "Roman Shtylman",
  56. "email": "shtylman+expressjs@gmail.com"
  57. },
  58. {
  59. "name": "Young Jae Sim",
  60. "email": "hanul@hanul.me"
  61. }
  62. ],
  63. "dependencies": {
  64. "accepts": "~1.3.7",
  65. "array-flatten": "1.1.1",
  66. "body-parser": "1.19.0",
  67. "content-disposition": "0.5.3",
  68. "content-type": "~1.0.4",
  69. "cookie": "0.4.0",
  70. "cookie-signature": "1.0.6",
  71. "debug": "2.6.9",
  72. "depd": "~1.1.2",
  73. "encodeurl": "~1.0.2",
  74. "escape-html": "~1.0.3",
  75. "etag": "~1.8.1",
  76. "finalhandler": "~1.1.2",
  77. "fresh": "0.5.2",
  78. "merge-descriptors": "1.0.1",
  79. "methods": "~1.1.2",
  80. "on-finished": "~2.3.0",
  81. "parseurl": "~1.3.3",
  82. "path-to-regexp": "0.1.7",
  83. "proxy-addr": "~2.0.5",
  84. "qs": "6.7.0",
  85. "range-parser": "~1.2.1",
  86. "safe-buffer": "5.1.2",
  87. "send": "0.17.1",
  88. "serve-static": "1.14.1",
  89. "setprototypeof": "1.1.1",
  90. "statuses": "~1.5.0",
  91. "type-is": "~1.6.18",
  92. "utils-merge": "1.0.1",
  93. "vary": "~1.1.2"
  94. },
  95. "deprecated": false,
  96. "description": "Fast, unopinionated, minimalist web framework",
  97. "devDependencies": {
  98. "after": "0.8.2",
  99. "connect-redis": "3.4.1",
  100. "cookie-parser": "~1.4.4",
  101. "cookie-session": "1.3.3",
  102. "ejs": "2.6.1",
  103. "eslint": "2.13.1",
  104. "express-session": "1.16.1",
  105. "hbs": "4.0.4",
  106. "istanbul": "0.4.5",
  107. "marked": "0.6.2",
  108. "method-override": "3.0.0",
  109. "mocha": "5.2.0",
  110. "morgan": "1.9.1",
  111. "multiparty": "4.2.1",
  112. "pbkdf2-password": "1.2.1",
  113. "should": "13.2.3",
  114. "supertest": "3.3.0",
  115. "vhost": "~3.0.2"
  116. },
  117. "engines": {
  118. "node": ">= 0.10.0"
  119. },
  120. "files": [
  121. "LICENSE",
  122. "History.md",
  123. "Readme.md",
  124. "index.js",
  125. "lib/"
  126. ],
  127. "homepage": "http://expressjs.com/",
  128. "keywords": [
  129. "express",
  130. "framework",
  131. "sinatra",
  132. "web",
  133. "rest",
  134. "restful",
  135. "router",
  136. "app",
  137. "api"
  138. ],
  139. "license": "MIT",
  140. "name": "express",
  141. "repository": {
  142. "type": "git",
  143. "url": "git+https://github.com/expressjs/express.git"
  144. },
  145. "scripts": {
  146. "lint": "eslint .",
  147. "test": "mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/",
  148. "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/ test/acceptance/",
  149. "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/",
  150. "test-tap": "mocha --require test/support/env --reporter tap --check-leaks test/ test/acceptance/"
  151. },
  152. "version": "4.17.1"
  153. }

卸载模块

我们可以使用以下命令来卸载 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. See `npm help json` for definitive documentation on these fields
  5. and exactly what they do.
  6. Use `npm install <pkg> --save` afterwards to install a package and
  7. save it as a dependency in the package.json file.
  8. Press ^C at any time to quit.
  9. name: (node_modules) runoob # 模块名
  10. version: (1.0.0)
  11. description: Node.js 测试模块(www.runoob.com) # 描述
  12. entry point: (index.js)
  13. test command: make test
  14. git repository: https://github.com/runoob/runoob.git # Github 地址
  15. keywords:
  16. author:
  17. license: (ISC)
  18. About to write to ……/node_modules/package.json: # 生成地址
  19. {
  20. "name": "runoob",
  21. "version": "1.0.0",
  22. "description": "Node.js 测试模块(www.runoob.com)",
  23. ……
  24. }
  25. Is this ok? (yes) yes

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

版本号

使用NPM下载和发布代码时都会接触到版本号。NPM使用语义版本号来管理代码,这里简单介绍一下。
语义版本号分为X.Y.Z三位,分别代表主版本号、次版本号和补丁版本号。当代码变更时,版本号按以下原则更新。

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

版本号有了这个保证后,在申明第三方包依赖时,除了可依赖于一个固定版本号外,还可依赖于某个范围的版本号。例如”argv”: “0.0.x”表示依赖于0.0.x系列的最新版argv。
NPM支持的所有版本号范围指定方式可以查看官方文档

NPM 常用命令

除了本章介绍的部分外,NPM还提供了很多功能,package.json里也有很多其它有用的字段。
除了可以在查看官方文档,这里再介绍一些NPM常用命令。
NPM提供了很多命令,例如install和publish,使用npm help可查看所有命令。

  • NPM提供了很多命令,例如install和publish,使用npm help可查看所有命令。
  • 使用npm help 可查看某条命令的详细帮助,例如 npm help install
  • 在package.json所在目录下使用 npm install 可先在本地安装当前命令行程序,可用于发布前的本地测试。
  • npm update 可以把当前目录下node_modules子目录里边的对应模块更新至最新版本。
  • npm update -g 可以把全局安装的对应命令行程序更新至最新版。
  • npm cache clear 可以清空NPM本地缓存,用于对付使用相同版本号发布新版本代码的人。
  • npm unpublish @ 可以撤销发布自己发布过的某个版本代码。

使用淘宝 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/

本地生成一个包

  1. # 在 package.json 的代码目录里面执行下面命令
  2. npm pack
  • 执行命令后,生成 xxx.tgz 文件,
  • 进入需要安装此包的路径下,执行npm install xxx.tgz ,等待执行完即可安装成功

发布自己的npm

  • 安装nodejs
  • 注册npm帐户,https://www.npmjs.com/
  • 开发你的module,更新至github
  • 发布module 至 npm ```bash

npm init # 初始化项目 npm login # 登陆 npm publish # 发布

更新版本后发布

npm version 0.1.1 npm publish

npm adduser # 登陆

npm whomi # 查看登陆的用户

#

强制清除缓存

npm cache clean —force

npm config get registry # 检测是否按照淘宝镜像的方法 npm config set registry=http://registry.npmjs.org # 替换成原始 npm 源码 npm config set registry=http://registry.npm.taobao.org/ # 替换成淘宝源

  1. ⚠️ **注意: 如果出现的以下问题**
  2. ```bash
  3. npm: no_perms Private mode enable, only admin can publish this module

是更换过NPM源的问题引起的,所以直接换成原先的NPM源即可

  1. npm config set registry=http://registry.npmjs.org
  1. pm ERR! You do not have permission to publish "package-demo". Are you logged in as the correct user? : package-demo

提示没有权限,其实就是你的module名在npm上已经被占用啦,这时候你就去需要去npm搜索你的模块名称,如果搜索不到,就可以用,并且把package.json里的name修改成未占用的,重新 npm publish 就可以了