npm使用

NPM 介绍

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

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

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

1
npm -v

升级npm

1
sudo npm install npm -g

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

1
npm install npm -g

使用淘宝镜像

1
npm install -g cnpm --registry=https://registry.npmmirror.com

基本命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 查看 npm 命令列表

npm help

# 查看各个命令的简单用法

npm -l

# 查看 npm 的版本

npm -v

# 查看 npm 的配置

npm config list -l

npm 的使用

npm init 命令 初始化 package.json 文件
用来初始化生成package.json文件。在这个过程中会向用户提问一系列问题,如果你觉得不用修改默认配置,一路回车就可以了。

如果使用了-f(代表force)、-y(代表yes),则跳过提问阶段,直接生成一个新的package.json文件。

npm set 设置环境变量

1
2
3
4
5
6
7
8
9

npm set init-author-name 'Your name'

npm set init-author-email 'Your email'

npm set init-author-url 'http://yourdomain.com'

npm set init-license 'MIT'

上面命令等于为npm init设置了默认值,以后执行npm init的时候,package.json的作者姓名、邮件、主页、许可证字段就会自动写入预设的值。这些信息会存放在用户主目录的~/.npmrc文件,使得用户不用每个项目都输入。如果某个项目有不同的设置,可以针对该项目运行npm config

使用 npm 命令安装模块

命令语法

1
npm install <Module Name>

实例,安装常用的 Node.js web框架模块 express:

1
npm install express

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

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

也支持直接输入Github代码库地址

1
npm install git://github.com/package/path.git

强制重新安装

1
npm install <packageName> --force

如果你希望,所有模块都要强制重新安装,那就删除node_modules目录,重新执行npm install

1
2
3
rm -rf node_modules

npm install

安装不同版本

1
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

$ npm install sax@latest

$ npm install sax@0.1.1

$ npm install sax@">=0.1.0 <0.2.0"

# 如果使用--save-exact参数,会在package.json文件指定安装模块的确切版本

$ npm install readable-stream --save --save-exact

$ npm install sax --save

$ npm install node-tap --save-dev

# 或者

$ npm install sax -S

$ npm install node-tap -D

# 如果要安装beta版本的模块,需要使用下面的命令

# 安装最新的beta版

$ npm install <module-name>@beta (latest beta)

# 安装指定的beta版

$ npm install <module-name>@1.3.1-beta.3

# npm install默认会安装dependencies字段和devDependencies字段中的所有模块,如果使用--production参数,可以只安装dependencies字段的模块

$ npm install --production

# 或者

$ NODE_ENV=production npm install

更新本地安装的模块

1
2
3
4
5
6
7
8
9

# 升级当前项目的指定模块

$ npm update [package name]

# 升级全局安装的模块

$ npm update -global [package name]

卸载已安装的模块

1
2
3
4
5
6
7

$ npm uninstall [package name]

# 卸载全局模块

$ npm uninstall [package name] -global

搜索模块

1
$ npm search express

查看安装信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
npm list -g # 查看全局安装的包
npm list # 查看当前项目安装的包

/usr/local/lib
├── @vue/cli@5.0.8
├── corepack@0.10.0
├── hexo-cli@4.3.0
├── n@8.0.2
├── npm-check-updates@12.2.1
├── npm@8.3.1
├── nrm@1.2.5
├── pnpm@6.31.0
├── to@0.2.9
├── ts-node@10.7.0
├── typescript@4.6.3
├── update@0.7.4
└── yarn@1.22.10

npm link
将当前的目录临时的放到全局下。

开发 NPM 模块的时候,有时我们会希望,边开发边试用,比如本地调试的时候,require(‘myModule’) 会自动加载本机开发中的模块。Node规定,使用一个模块时,需要将其安装到全局的或项目的 node_modules 目录之中。对于开发中的模块,解决方法就是在全局的 node_modules 目录之中,生成一个符号链接,指向模块的本地目录。

npm link 就能起到这个作用,会自动建立这个符号链接。

请设想这样一个场景,你开发了一个模块 myModule,目录为 src/myModule,你自己的项目 myProject 要用到这个模块,项目目录为 src/myProject。首先,在模块目录(src/myModule)下运行 npm link 命令。

1
src/myModule$ npm link

上面的命令会在NPM的全局模块目录内,生成一个符号链接文件,该文件的名字就是 package.json 文件中指定的模块名。

1
/path/to/global/node_modules/myModule -> src/myModule

这个时候,已经可以全局调用 myModule 模块了。但是,如果我们要让这个模块安装在项目内,还要进行下面的步骤。

切换到项目目录,再次运行 npm link 命令,并指定模块名。

1
src/myProject$ npm link myModule

上面命令等同于生成了本地模块的符号链接。

1
src/myProject/node_modules/myModule -> /path/to/global/node_modules/myModule

然后,就可以在你的项目中,加载该模块了。

1
const myModule = require('myModule');

这样一来,myModule 的任何变化,都可以直接反映在 myProject 项目之中。但是,这样也出现了风险,任何在myProject目录中对myModule的修改,都会反映到模块的源码中。

如果你的项目不再需要该模块,可以在项目目录内使用 npm unlink 命令,删除符号链接。

1
src/myProject$ npm unlink myModule

npm publish

npm publish用于将当前模块发布到npmjs.com。执行之前,需要向npmjs.com申请用户名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 需要向npmjs.com申请用户名

$ npm adduser

# 登录

$ npm login

# 发布

$ npm publish

# 如果当前模块是一个beta版,比如1.3.1-beta.3,那么发布的时候需要使用tag参数,将其发布到指定标签,默认的发布标签是latest

$ npm publish --tag beta

# 如果发布私有模块,模块初始化的时候,需要加上scope参数。只有npm的付费用户才能发布私有模块。

$ npm init --scope=<yourscope>

# 如果你的模块是用ES6写的,那么发布的时候,最好转成ES5。首先,需要安装Babel。

$ npm install --save-dev babel-cli@6 babel-preset-es2015@6

然后,在package.json里面写入build脚本。

1
2
3
4
5
"scripts": {
"build": "babel source --presets babel-preset-es2015 --out-dir distribution",
"prepublish": "npm run build"

}

运行上面的脚本,会将 source 目录里面的ES6源码文件,转为 distribution 目录里面的 ES5 源码文件。然后,在项目根目录下面创建两个文件 .npmignore 和 .gitignore,分别写入以下内容。

1
2
3
4
5
6
7
8
9
// .npmignore

source

// .gitignore

node_modules

distribution

npm deprecate
如果想废弃某个版本的模块,可以使用 npm deprecate 命令。

1
2
3

$ npm deprecate my-thing@"< 0.2.3" "critical bug fixed in v0.2.3"