04、Node.js NPM 使用介绍

NPM是 Node.js 的包管理工具,就像 Python 语言中的 pip 和 easy_install 工具一样

NPM随同 Node.js一起安装,绝大多数情况下不需要额外去安装就能使用

NPM既然是包管理工具,自然就具有以下功能:

1、 允许用户从NPM服务器下载别人编写的第三方包或命令行工具到本地使用;
2、 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用;

检查NPM 是否和安装的版本可以使用以下的命令

$ npm -v
5.4、2

使用 npm 命令安装模块

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

$ npm install <Module Name>

比如安装 Express WEB 框架,就可以使用下面的命令

$ npm install express

安装好之后,express 包就放在了 Node.js 目录下的 node_modules 目录中

然后在应用程序的代码中只需通过 require(‘express’) 就能引入 express 框架

var express = require('express');

全局安装与本地安装

npm的包安装分为本地安装(local)、全局安装(global)两种:

1、 全局安装是将第三方模块安装到Node.js根目录下的node_modules目录中,全局安装需要减伤-g参数;

npm install express -g

全局安装的包可以直接在 REPL 里使用

2、 本地安装是将第三方包安装在当前目录下的node_modules目录中;

npm install express

如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。

可以通过 require() 来引入本地安装的包

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

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

$ npm install express -g

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

$ npm install express -g
+ express@4.16.2
added 39 packages, removed 18 packages and updated 9 packages in 7.399s

安装时如果出现以下错误

npm err! Error: connect ECONNREFUSED 127.0.0.1:8087

则只需要运行以下命令即可解决

$ npm config set proxy null

查看已经安装的包信息

可以使用以下命令来查看当前项目已经安装的包的信息

$ npm list

如果要查看全局安装的包的信息,可以使用

$ npm list -g

比如我们想看一下全局安装了哪些包

$ npm list -g
/usr/local/lib
├─┬ bower@1.7.2
│ ├── abbrev@1.0.7
│ ├── archy@1.0.0
│ ├─┬ bower-config@1.3.0
│ │ ├── graceful-fs@4.1.2
│ │ ├── mout@0.11.1 deduped
│ │ ├─┬ optimist@0.6.1
│ │ │ ├── minimist@0.0.10
│ │ │ └── wordwrap@0.0.3
│ │ ├─┬ osenv@0.1.3
│ │ │ ├── os-homedir@1.0.1
│ │ │ └── os-tmpdir@1.0.1
│ │ └─┬ untildify@2.1.0
│ │   └── os-homedir@1.0.1
│ ├── bower-endpoint-parser@0.2.2
│ ├─┬ bower-json@0.4.0
│ │ ├── deep-extend@0.2.11
│ │ ├── graceful-fs@2.0.3
│ │ └── intersect@0.0.3

...

如果要查看某个具体包的的版本号,可以使用以下命令

$ npm list express
/Users/luojianguo/Downloads/curl_mail/node
└── express@4.16.2 

package.json 文件

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

我们来看看 express 包的 package.json 文件,位于 node_modules/express/package.json

文件有删减,不然内容太长

package.json

{
  "_from": "express",
  "_id": "express@4.16.2",
  "_inBundle": false,
  "_integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=",
  "_location": "/express",
  "_phantomChildren": {},
  "_requested": {
    "type": "tag",
    "registry": true,
    "raw": "express",
    "name": "express",
    "escapedName": "express",
    "rawSpec": "",
    "saveSpec": null,
    "fetchSpec": "latest"
  },
  "_requiredBy": [
    "#USER",
    "/"
  ],
  "_resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz",
  "_shasum": "e35c6dfe2d64b7dca0a5cd4f21781be3299e076c",
  "_spec": "express",
  "_where": "/Users/luojianguo/Downloads/curl_mail/node",
  "author": {
    "name": "TJ Holowaychuk",
    "email": "tj@vision-media.ca"
  },
  "bugs": {
    "url": "https://github.com/expressjs/express/issues"
  },
  "bundleDependencies": false,
  "contributors": [
    {
      "name": "Aaron Heckmann",
      "email": "aaron.heckmann+github@gmail.com"
    },
   # ...
  ],
  "dependencies": {
    "accepts": "~1.3.4",
    "array-flatten": "1.1.1",
    # ...
  },
  "deprecated": false,
  "description": "Fast, unopinionated, minimalist web framework",
  "devDependencies": {
    "after": "0.8.2",
    "connect-redis": "~2.4.1",
    # ...
  },
  "engines": {
    "node": ">= 0.10.0"
  },
  "files": [
    "LICENSE",
    "History.md",
    "Readme.md",
    "index.js",
    "lib/"
  ],
  "homepage": "http://expressjs.com/",
  "keywords": [
    "express",
    "framework",
    # ...
  ],
  "license": "MIT",
  "name": "express",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/expressjs/express.git"
  },
  "scripts": {
    "lint": "eslint .",
    # ...
  },
  "version": "4.16.2"
}

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 关键字

卸载模块

可以使用下面的命令来卸载 Node.js 模块

$ npm uninstall express [-g]

执行命令后,可以使用以下命令查看包是否卸载了

$ npm ls

更新模块

可以使用以下命令更新模块

$ npm update express

搜索模块

使用以下命令搜索模块:

$ npm search express

创建模块

创建模块,先要创建 package.json 文件

可以使用 npm init 生成 package.json 文件

$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See npm help json for definitive documentation on these fields
and exactly what they do.

Use npm install `<pkg>` --save afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
name: (node_modules) souyunku                   # 模块名
version: (1.0.0) 
description: Node.js 测试模块(ddkk.com)  # 描述
entry point: (index.js) 
test command: make test
git repository: https://github.com/souyunku/souyunku.git  # Github 地址
keywords: 
author: 
license: (ISC) 
About to write to ……/node_modules/package.json:      # 生成地址

{
  "name": "souyunku",
  "version": "1.0.0",
  "description": "Node.js 测试模块(ddkk.com)",
  ……
}
Is this ok? (yes) yes

上面有些信息可能需要手动输入,不过你也可以先不输入,等以后直接编辑 package.json 文件

在Is this ok ? 按下回车键,package.json 大功告成了。

接着,我们需要向 npm 仓库注册用户信息

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

最后发布我们的模块

$ npm publish

如果你以上的步骤都操作正确,我们开发的模块就可以通过 npm install 来安装了

版本号

使用npm 下载和发布代码时都会接触到版本号

npm使用语义版本号来管理代码

语义版本号分为 X.Y.Z 三位,分别代表主版本号、次版本号和补丁版本号

当代码变更时,版本号按以下原则更新

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

版本号有了这个保证后,在申明第三方包依赖时,除了可依赖于一个固定版本号外,还可依赖于某个范围的版本号

例如“argv”: “0.0.x” 表示依赖于 0.0.x 系列的最新版 argv

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

NPM 常用命令

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

可以在npmjs.org/doc/ 查看官方文档

这里再介绍一些 NPM 常用命令

  • 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> 可以撤销发布自己发布过的某个版本代码