npm
npm:Node Package Manager,NodeJS 的包管理和分发工具。
# 简介
npm 已经成了 Node.js 包的标准发布平台,用于 Node.js 包的发布、传播、依赖控制。npm 提供了命令行工具,使你可以方便地下载、安装、升级、删除包,也可以让你作为开发者发布并维护包。
npm 是随同 Node.js 一起安装的包管理工具,能解决 Node.js 代码部署上的很多问题,常见的场景有以下几种:
- 允许用户从 npm 服务器下载别人编写的第三方包到本地使用。
- 允许用户从 npm 服务器下载并安装别人编写的命令行程序到本地使用。
- 允许用户将自己编写的包或命令行程序上传到 npm 服务器供别人使用。
npm 的背后,是基于 couchdb 的一个数据库,详细记录了每个包的信息,包括作者、版本、依赖、授权信息等。它的一个很重要的作用就是:将开发者从繁琐的包管理工作(版本、依赖等)中解放出来,更加专注于功能的开发。
# 常用命令
命令 | 说明 |
---|---|
npm init | 初始化生成 package.json 文件 |
npm install | 安装包 |
npm run | 执行脚本 |
npm set | 设置环境变量 |
npm info | 查看模块的具体信息 |
npm search | 搜索 npm 仓库,支持正则表达式 |
npm list | 列出安装的所有模块以及它们的依赖模块 |
# npm init
npm init 会生成一个 package.json 文件。package.json 是用来记录下包依赖的描述文件。
# package.json 属性说明
{
"name": "demo", // 包名
"version": "1.0.0", // 版本号
"keywords": "", // 关键字,作用于 npm search
"description": "",
"main": "index.js", // 执行入口文件
"browser": "index.js", // 同 main,当包为 web 包时,browser 的优先级比 main 高。
"bin": { // 可执行文件
"myapp": "./cli.js"
},
"scripts": { // 自定义脚本 ??preinstall ?
"test": "echo \"Error: no test specified\" && exit 1"
},
"config": { // 设置配置属性,配合 scripts 属性使用
"port": "8080"
},
"files": [], // 当别人安装你的包时,所需要安装的文件。默认:"*"
"homepage": "", // 项目官网地址
"bugs": { // 提交bug的方式
"url": "",
"email": ""
},
"man": "", // 项目手册
"repository": { // 代码仓库地址 执行 npm docs 可以直接跳转到这里
"type": "git",
"url": ""
},
"engines": { // 指定代码运行环境
"node": ">=0.10.3 <0.12"
},
"os": ["!win32"], // 指定代码运行的操作系统
"cpu": [], // 指定代码运行时的 cpu 架构
"publishConfig": {}, // 发布配置
"author": "",
"contributors": "", // 贡献者
"maintainers": "", // 维护者
"license": "ISC",
"dependencies": {}, // 生产环境依赖
"devDependencies": {}, // 开发环境依赖
"peerDependencies": {}, // 声明使用该包时,宿主环境必需存在的插件
"bundledDependencies": {}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# package-lock.json
package-lock.json 是随着安装的时候一起生成的。它可以锁定安装时的包的版本号,生成后需要上传到git,以保证其他人在 npm install 时大家的依赖能保持一致。
# npm install
npm install 在默认情况下会从 http://npmjs.com 搜索或下载包,将包安装到当前目录的 node_modules 子目录下。但是也可以通过指令将包安装到全局环境下。
# 基础使用
# 本地安装
$ npm install <package name>
# 也支持直接输入 git 地址
npm install git://github.com/package/path.git
# 全局安装
$ sudo npm install -global <package name>
2
3
4
5
6
7
8
# 本地安装与全局安装
一般来说,全局安装只适用于工具模块,比如 eslint 、gulp、cli 脚手架等。
模式 | 命令 | 可通过 require 使用 | 注册 PATH |
---|---|---|---|
本地安装 | npm install [package name] | 是 | 否 |
全局安装 | npm install -g/-global [package name] | 否 | 是 |
# 指定版本
install 命令总是安装模块的最新版本,如果要安装模块的特定版本,可以在模块名后面加上 @ 和版本号。
语义化版本:(package.json 中也一样)
- ^version: 中版本和小版本( ^1.0.1 -> 1.x.x )
- ~version: 小版本 ( ~1.0.1 -> 1.0.x )
- version: 特定版本
- latest: 最新版本
- 关系表达式: 符合表达式的版本 ( >2.1.1 -> 2.1.0 )
# 安装3.x.x 最新版本
npm install jquery@^3.4.1
# 安装3.4.x 最新版本
npm install jquery@~3.4.1
# 特定版本 0.1.1
npm install sax@0.1.1
# 最新版本
npm install sax@latest
# 安装版本 大于0.1.1且小于0.2.0
npm install sax@">=0.1.0 <0.2.0"
2
3
4
5
6
7
8
9
10
11
12
13
14
如果删除了依赖,重新执行 npm install,则会根据 package.json 中的这些语义化版本号拉取新的版本
# 保存依赖
只是执行 npm install package-name
,只会将包安装到 node_modules 目录中,不会修改 package.json 。需要使用以下参数,指定模块属于哪一种性质的依赖关系,即出现在 packages.json 文件的哪一项中。
--save
:模块名将被添加到 dependencies,可以简化为参数-S
--save-dev
:模块名将被添加到 devDependencies,可以简化为参数-D
npm install sax --save
npm install node-tap --save-dev
# 或者
npm install sax -S
npm install node-tap -D
2
3
4
5
# 安装生产依赖
npm install 默认会安装 dependencies 字段和 devDependencies 字段中的所有模块,如果使用 --production
参数,可以只安装 dependencies 字段的模块。
npm install --production
# 或者
NODE_ENV=production npm install
2
3
# 安装私有包
npm 默认的源是 https://registry.npmjs.org/,如果需要从私有 npm 上下载包,需要使用 nrm 切换源之后,再安装。
# npm run
npm run 命令是用来执行脚本的。package.json 文件有一个 scripts 字段,可以用于指定脚本命令,供 npm 直接调用。
npm run 是 npm run-script 的简写
package.json
{
"name": "myproject",
"scripts": {
"test1": "mocha test/"
}
}
2
3
4
5
6
执行
npm run test1
# 创建与发布
# 搭建私有npm
参考文章: