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