Skip to main content

包管理工具

npm 包管理工具

npm 即 Node Package Manager (Node 包管理器),对于 Node 而言,NPM 帮助其完成了第三方模块的安装、依赖、发布等。借助 npm,Node 与第三方模块之间形成了很好的一个生态系统。

包的版本管理

我们会发现安装 npm 包时,会出现 ^2.0.3~2.0.3 这样类似的版本号格式。

这样的版本号格式实际上就是 npm 所遵循的 semver 版本规范

一个 X.Y.Z 的版本号:

  • X 表示主版本号,为 0 时,表示正处于开发阶段,不稳定,主版本号升级时,表示做了大量更新,并且包含不兼容旧版本的 API
  • Y 表示次版本号,一些向下兼容的功能性新增就可以升级次版本号
  • Z 表示修订号,修复了一些 BUG,或者向下兼容(没有功能新增)就可以升级修订号

版本号前缀:

  • ^ 前缀表示 X 不变,YZ 保持最新版本安装
  • ~ 前缀表示 XY 不变,Z 保持最新版本安装
  • * 前缀表示始终保持最新版本安装
  • 无前缀,则表示安装固定的版本

npm 常用命令

命令说明
npm install <Module Name> [-g]在本地或全局 安装 模块
npm uninstall <Module Name> [-g]卸载 本地或全局的模块
npm update <Module Name> [-g]更新 本地或全局安装的模块
npm root [-g]查看本地或全局中模块 安装路径
npm init [-y]在本地初始化 package.json
npm run <command>执行本地 package.json 中的脚本

npm install

全局安装

$ npm install <Module Name> -g

表示全局安装,一般来说全局安装的模块都是一些工具模块,比如 gulp、webpack、yarn 这些。全局安装的模块会将一些可执行文件配置到环境变量中,这样我们在终端可以全局执行相应的命令了。

  1. 会将安装包放在 /usr/local 下或者 NodeJS 的安装目录
  2. 可以在任何路径下直接在命令行中使用包中自带的命令

局部安装

$ npm install <Module Name> [-S] [-D]

表示局部安装,会安装到当前项目的 node_modules 下,加上 -S 参数,会将安装的模块记录到 package.json 中的 dependencies 字段下,加上 -D 参数,会记录到 devDependencies 字段下。

$ npm install <Module Name> -f

默认情况下,安装之前,npm install会先检查,node_modules目录之中是否已经存在指定模块。如果存在,就不再重新安装了,即使远程仓库已经有了一个新版本,也是如此。

如果你希望,一个模块不管是否安装过,npm 都要强制重新安装,可以使用-f--force参数。

另外在安装模块时,通过 @ 后接版本号,可以指定模块的版本:

$ npm install react@~16.0.1
$ npm install redux@^3.7.2
$ npm install lodash@*
  1. 会将安装包放在运行 npm 命令时所在的目录下的 ./node_modules 文件夹中 (没有会自动生成)。
  2. 可以通过 importrequire() 引入本地安装的包。
  3. 无法直接在命令行中使用包自带的命令。

对于局部安装的模块

npm update

$ npm update <Module Name>

用于更新一个模块,这和包的版本管理有关,它会先到远程仓库查询最新版本,然后查询本地版本。如果本地版本不存在,或者远程版本较新,就会安装。

package.json 属性详解

字段说明
name项目名称
version项目版本号
main别人导入我们的模块时的加载入口
scripts定运行脚本命令的 npm 命令行缩写
dependencies项目生产环境需要的依赖
devDependencies项目开发环境需要的依赖
description一个字符串,用于编写描述信息。有助于人们在npm库中搜索的时候发现你的模块
keywords一个字符串组成的数组,有助于人们在npm库中搜索的时候发现你的模块
homepage项目的主页地址(介绍项目的主页,不是仓库)
bugs用于项目问题的反馈issue地址或者一个邮箱
license项目的开源协议
author项目的作者信息
private取值为布尔类型,表示项目是否私有,如果私有则不会被 publish
browserlist指定该模块供浏览器使用的版本
engines可以指定该模块正常运行至少要达到的 NPM 和 Node 版本

name 与 version

package.json文件中最重要的就是nameversion字段,这两项是必填的。名称和版本一起构成一个标识符,该标识符被认为是完全唯一的。每次发布时version不能与已存在的一致。

name 会作为参数传递给require,因此它应该是简短的,但也需要具有合理的描述性。

main

指定了加载的入口文件,require导入的时候就会加载这个文件。这个字段的默认值是模块根目录下面的index.js

scripts

指定运行脚本命令的 npm 命令行缩写,比如 start 指定了运行 npm run start 时,所要执行的命令。

"scripts": {
"start": "node ./start.js"
}

当我们在命令行输入 npm run start 时,就会执行 node ./start.js

如下字段可以省略 run

"scripts": {
"start": "xxx",
"test": "xxx",
"stop": "xxx",
"restart": "xxx"
}

bugs

用于项目问题的反馈issue地址或者一个邮箱。

"bugs": { 
"url" : "https://github.com/owner/project/issues",
"email" : "project@hostname.com"
}

author

项目的作者信息。

"author": {
"name" : "yindong",
"email" : "yindong@xx.com",
"url" : "https://zhiqianduan.com/"
}

npx 命令

该命令是 npm 5.2 版本之后自带的一个命令

cnpm

$ npm install cnpm -g

cnpmregistry 现在为 https://registry.npmmirror.com

yarn

$ npm install yarn -g

yarn 是在 2016 年发布的,那时 npm 还处于 V3 时期,那时候还没有 package-lock.json 文件,就像上面我们提到的:不稳定性、安装速度慢等缺点经常会受到广大开发者吐槽,此时,yarn 诞生。

Reference