npm 使用方法及常用命令
工程目录
以编写一个命令行程序为例,一般我们会同时提供命令行模式和 API 模式两种使用方式,并且我们会借助第第三方包来编写代码。除了代码外,一个完整的程序也应该有自己的文档和测试用例。因此,一个标准的工程目录都看起来像下边这样。
- /home/user/workspace/node-echo/ # 工程目录
- bin/ # 存放命令行相关代码
node-echo
+ doc/ # 存放文档
- lib/ # 存放API相关代码
echo.js
- node_modules/ # 存放第三方包
+ argv/
+ tests/ # 存放测试用例
package.json # 元数据文件
README.md # 说明文件
其中部分文件内容如下:
/* bin/node-echo */
var argv = require('argv'),
echo = require('../lib/echo');
console.log(echo(argv.join(' ')));
/* lib/echo.js */
module.exports = function (message) {
return message;
};
/* package.json */
{
"name": "node-echo",
"main": "./lib/echo.js"
}
以上例子中分类存放了不同类型的文件,并通过 node_moudles 目录直接使用第三方包名加载模块。此外,定义了package.json 之后,node-echo 目录也可被当作一个包来使用。
NPM (NPM 中文文档:https://www.npmjs.cn/)
NPM 是随同 Node 一起安装的包管理工具,能解决 node.js 代码部署上的很多问题,常见的使用场景有以下几种:
-
允许用户从 NPM 服务器下载别人编写的第三方包到本地使用。
-
允许用户从 NPM 服务器下载并安装别人编写的命令行程序到本地使用。
-
允许用户将自己编写的包或命令行程序上传到 NPM 服务器供别人使用。
可以看到,NPM 建立了一个 NodeJS 生态圈,NodeJS 开发者和用户可以在里边互通有无。以下分别介绍这三种场景下怎样使用 NPM。
下载第三方包
需要使用第三方包时,首先得知道有哪些包可用。虽然 npmjs.org 提供了个搜索框可以根据包名来搜索,但如果连想使用的第三方包的名字都不确定的话,就请百度一下吧。知道了包名后,比如上边例子中的 argv,就可以在工程目录下打开终端,使用npm install argv
命令来下载argv。
版本号:argv@0.0.2
存放目录:node_modules\argv
下载好之后,argv 包就放在了工程目录下的 node_modules 目录中,因此在代码中只需要通过 require('argv')
的方式就可以导入包,无需指定第三方包路径。
以上命令默认下载最新版第三方包,如果想要下载指定版本的话,可以在包名后边加上@
符号,例如通过npm install argv@0.0.1
命令可下载 0.0.1 版的 argv。
版本号:argv@0.0.1
存放目录:node_modules\argv
如果使用到的第三方包比较多,在工程目录下一个包一条命令地安装未免太过繁琐。因此 NPM 对 package.json 的字段做了扩展,允许在其中申明第三方包依赖。因此,上边例子中的 package.json 可以改写如下:
{
"name": "node-echo",
"main": "./lib/echo.js",
"dependencies": {
"argv": "0.0.2"
}
}
这样处理后,在工程目录下就可以使用 npm install
命令批量安装第三方包了。更重要的是,当以后 node-echo 也上传到了 NPM 服务器,别人下载这个包时,NPM 会根据包中申明的第三方包依赖自动下载进一步依赖的第三方包。例如,使用 npm install node-echo
命令时,NPM 会自动创建以下目录结构。
- project/
- node_modules/
- node-echo/
- node_modules/
+ argv/
...
...
如此一来,用户只需关心自己直接使用的第三方包,不需要自己去解决所有包的依赖关系。
安装命令行程序
从 NPM 服务上下载安装一个命令行程序的方法与第三方包类似。例如上例中的 node-echo 提供了命令行使用方式,只要 node-echo 自己配置好了相关的 package.json 字段,对于用户而言,只需要使用 npm install node-echo -g
命令安装程序。
参数中的 -g 表示全局安装,一般命令行程序都使用全局安装
如果使用全局安装, node-echo 会默认安装到以下位置,并且 NPM 会自动创建好 Linux 系统下需要的软链文件或 Windows 系统下需要的.cmd文件。
- /usr/local/ # Linux系统下
- lib/node_modules/
+ node-echo/
...
- bin/
node-echo
...
...
- %APPDATA%\npm\ # Windows系统下
- node_modules\
+ node-echo\
...
node-echo.cmd
...
发布代码
第一次使用 NPM 发布代码前需要注册一个账号。终端下运行 npm adduser
,注册之后按照提示做即可,或者在NPM 官网进行。账号搞定后,接着我们需要编辑 package.json 文件,加入 NPM 必需的字段。接着上边 node-echo 的例子,package.json 里必要的字段如下。
{
"name": "node-echo", # 包名,在NPM服务器上须要保持唯一
"version": "1.0.0", # 当前版本号
"dependencies": { # 第三方包依赖,需要指定包名和版本号
"argv": "0.0.2"
},
"main": "./lib/echo.js", # 入口模块位置
"bin" : {
"node-echo": "./bin/node-echo" # 命令行程序名和主模块位置
}
}
之后,我们就可以在 package.json 所在目录下运行 npm publish
发布代码了。
注意:
-
项目名称以 package.json 中的 name 为准,与项目根目录文件夹名称无关
-
登录之前要将 npm origin 切换到 npm 官方服务器
https://registry.npmjs.org/
-
然后使用
npm login
命令登录 npm 账号,按步骤填写用户名、密码、邮箱即可 -
最后在项目根目录下执行发布命令
npm publish
,执行完成即可在npm 官网上查找到相应包-
要注意项目名不能和 NPM 官网以有项目重名
-
尽量不要发布没有意义的包,练习时发布的包最好再删除掉
-
-
使用
npm unpublish 包名 --force
删除已上传的包- npm unpublish 命令只能删除 72 小时以内发布的包
npm 常用命令
除了本章介绍的部分外,NPM 还提供了很多功能,package.json 里也有很多其它有用的字段。除了可以在 https://docs.npmjs.com/cli/v6/commands 查看官方文档外,这里再介绍一些 NPM 常用命令。
-
npm -v
: 查看npm版本 -
npm init [-y]
: 初始化后会出现一个package.json 配置文件。可以在后面加上-y ,快速跳过问答式界面。 -
npm install
:会根据项目中的package.json 文件自动下载项目所需的全部依赖。 -
npm install 包名 --save-dev (npm install 包名 -D)
:安装的包只用于开发环境,不用于生产环境,会出现在package.json文件中的devDependencies属性中。 -
npm install 包名 --save(npm install 包名 -S)
:安装的包需要发布到生产环境的,会出现在package.json文件中的dependencies属性中。上面出现的
npm install
都可以用npm i
这种简写方式代替 -
npm list
:查看当前目录下已安装的node包。 -
npm list -g
:查看全局已经安装过的node包。 -
npm help [命令]
:查看npm所有命令,也可以查看指定命令用法。 -
npm update [包名]
:可以把当前目录下 node_modules 子目录里边的对应模块更新至最新版本,加上包名表示只更新这个包。 -
npm update [包名] -g
:可以把所有全局安装的对应命令行程序更新至最新版,加上包名表示只更新这个包。 -
npm uninstall 包名
:卸载指定包。 -
npm config list
:查看配置信息。 -
npm 指定命令 --help
:查看指定命令的帮助。 -
npm info 指定包名
:查看远程npm上指定包的所有版本信息。 -
npm config set registry https://registry.npm.taobao.org
: 修改包下载源,此例修改为了淘宝镜像。 -
npm install -g nrm
: 可以通过nrm管理镜像地址nrm ls
: 查看nrm有哪些可用镜像nrm use taobo
: 切换到淘宝镜像
-
npm root
:查看当前包的安装路径。 -
npm root -g
:查看全局的包的安装路径。 -
npm ls [包名]
:查看本地安装的指定包及版本信息,没有显示empty。 -
npm ls [包名] -g
:查看全局安装的指定包及版本信息,没有显示empty。 -
npm cache clear
:清理本地npm 包缓存。注意:一个模块安装以后,本地其实保存了两份。一份是 ~/.npm 目录下的压缩包,另一份是 node_modules 目录下解压后的代码。但是,运行 npm install 的时候,只会检查 node_modules 目录,而不会检查 ~/.npm 目录。如果一个模块在 ~./npm 下有压缩包,但是没有安装在 node_modules 目录中,npm 依然会从远程仓库下载一次新的压缩包。
-
npm install . -g
:在 package.json 所在目录下使用,可先在本地安装当前命令行程序,可用于发布前的本地测试。 -
npm cache clear
:清空 NPM 本地缓存,用于对付使用相同版本号发布新版本代码的人。 -
npm unpublish @
:撤销发布自己发布过的某个版本代码。
npm 使用淘宝镜像
国内直接使用 npm 的官方镜像是非常慢的(官方服务器在国外),这里推荐使用淘宝NPM镜像(淘宝npm地址)。
-
临时使用
npm --registry https://registry.npm.taobao.org install express
-
持久使用
npm config set registry https://registry.npm.taobao.org
-
配置后可通过下面方式来验证是否成功
npm config get registry 或 npm info express
-
通过cnpm使用
npm install -g cnpm --registry=https://registry.npm.taobao.org
-
使用方法:
cnpm install express
-
-
使用 nrm 管理 registry 地址
-
下载 nrm 命令行工具
npm install -g nrm
-
使用方法:
nrm ls
:查看 nrm 有哪些可用镜像(星号表示当前使用的镜像)* npm -------- https://registry.npmjs.org/ yarn ------- https://registry.yarnpkg.com/ cnpm ------- http://r.cnpmjs.org/ taobao ----- https://registry.npm.taobao.org/ nj --------- https://registry.nodejitsu.com/ npmMirror -- https://skimdb.npmjs.com/registry/ edunpm ----- http://registry.enpmjs.org/
nrm use taobo
:切换到淘宝镜像Registry has been set to: https://registry.npm.taobao.org/
nrm test taobao
:测试镜像速度* taobao - 247ms
-