npm
仓库相关
列出所有当前的 npm 配置,包括仓库地址 npm config list -l
# 设置默认仓库地址
npm config set registry <repository-url>
# 查看当前仓库地址
npm config get registry
# 将仓库地址重置为 npm 的默认地址
npm config set registry https://registry.npmjs.org
npm config set registry https://registry.npm.taobao.org
依赖相关
安装开发依赖
npm install <package-name> --save-dev
npm view 查看包版本
格式:npm view 包名 versions
如下所示:
➜ npm view underscore versions
npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.
[
'1.0.3', '1.0.4', '1.1.0', '1.1.1',
......
'1.13.6', '1.13.7'
]
npm search 搜索模块
npm search命令用于在npm registry(包注册中心)中查找相关包,它后面可以跟字符串,也可以跟正则表达式。
格式:npm search <搜索词> [-g]
也可以直接去官网搜索:https://www.npmjs.com/
npm install 安装模块
本地安装
- npm 在默认情况下会从 npmjs.org 搜索或下载包,将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
- 可以通过 require() 来引入本地安装的包。3. 本地安装指的是将一个模块下载到当前项目的 node_modules 子目录,然后只有在项目目录之中,才能调用这个模块。
全局安装
- 将安装包放在 /usr/local 下或者你 node 的安装目录。
- 可以直接在命令行里使用。
如果把包安装到全局,可以提供程序的重复利用程度,避免同样的内容的多分副本,但坏处是难以处理不同的版本依赖。如果把包安装到当前目录,或者说本地,则不会有不同程序依赖不同版本的包的冲突问题,同时还减轻了包作者的 API 兼容性压力,但缺陷则是同一个包可能会被安装许多次。
# 读取package.json里面的配置并安装
npm install // 可简写成 npm i
# 本地安装
# 默认安装指定模块的最新(@latest)版本, 例如:npm install gulp
npm install <package name>
# 安装指定模块的指定版本
npm install <name>@<version>,例如:npm install gulp@3.9.1
# 安装指定指定版本范围内的模块, 例如: npm install vue@">=1.0.28 < 2.0.0"
npm install <name>@<version range>
# 安装指定模块的指定标签 默认值为(@latest), 例如:npm install sax@0.1.1
npm install <name>@<tag>
# 通过Github代码库地址安装, 例如:npm install git://github.com/package/path.git
npm install <tarball url>
# npm install安装之前会先检查node_modules目录之中是否已经存在指定模块。如果存在就不再重新安装了,即使远程仓库已
# 经有了一个新版本也是如此。如果希望一个模块不管是否安装过,都要强制重新安装,可以使用 -f 或 --force 参数。
npm install <packageName> --force
# install 命令可以使用不同参数,指定所安装的模块属于哪一种性质的依赖关系,即出现在 packages.json 文件的哪一项中。
# 模块名将被添加到 dependencies,可以简化为参数-S。
npm install sax –-save
# 模块名将被添加到 devDependencies,可以简化为参数-D。
npm install sax –-save-dev
# 全局安装
npm install -global <package name>
npm install -g <package name>
# 升级npm
npm install npm -g/npm i npm -g // install可简写为i
# 使用淘宝镜像
npm install -g cnpm --registry=https://registry.npm.taobao.org
# 查看所有全局安装的模块
npm list -g
npm info
npm info 命令可以查看每个模块的具体信息
➜ npm info underscore
npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.
underscore@1.13.7 | MIT | deps: none | versions: 54
JavaScript's functional programming helper library.
https://underscorejs.org
keywords: util, functional, server, client, browser
dist
.tarball: https://registry.npmmirror.com/underscore/-/underscore-1.13.7.tgz
.shasum: 970e33963af9a7dda228f17ebe8399e5fbe63a10
.integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==
.unpackedSize: 906.3 kB
maintainers:
- jashkenas <jashkenas@gmail.com>
- jgonggrijp <dev@juliangonggrijp.com>
dist-tags:
latest: 1.13.7 stable: 1.13.7
published 12 months ago by jgonggrijp <dev@juliangonggrijp.com>
上面命令返回一个 JavaScript 对象,包含了 underscore 模块的详细信息。这个对象的每个成员,都可以直接从 info 命令查询
npm info underscore description
npm info underscore homepage
npm info underscore version
npm 配置
常用配置说明:
1. 全局安装:-g | -global,例如: npm i -g gulp 或者 npm i gulp -g
#**(生产阶段的依赖)**
#安装并将被添加到package.json的dependencies区
-S | --save
例如:npm i gulp --save 或 npm i gulp -S
#**(开发阶段的依赖)**
#安装并将被添加到package.json的devDependencies区。
-D | --save-dev
//npm i gulp --save-dev 或 npm i gulp -D
#这是默认设置,除非-D或-O存在
#安装并将被添加到package.json的dependencies区。
-P | --save-prod
#**(可选阶段的依赖)**
#安装并将被添加到package.json的optionalDependencies区
-O | --save-optional
#安装模块的确切版,而不是使用npm的默认semver range运算符
-E | --save-exact
//npm i gulp --save-exact 或 npm i gulp -E
#安装并将被添加到`bundleDependencies`列表中
-B | --save-bundle
#模块不管是否安装过,npm 都要强制重新安装
-f|--force
//eg:npm install sax --force
//补充:所有模块都要强制重新安装,那就删除`node_modules`,重新执行`npm install`
$ rm -rf node_modules //或者手动去删除node_modules目录
$ npm install
#防止保存到`dependencies`
--no-save
#报告安装状况而不是真的安装
--dry-run
npx
npx 是 Node 的包执行器,不同与 Node 的 npm(包管理器)。 npx 是 Node 5.2+ 版本上才有的工具。
npx 会在当前目录下的 ./node_modules/.bin 里去查找是否有可执行的命令,没有找到的话再从全局里查找是否有安装对应的模块,全局也没有的话就会自动下载对应的模块,npx 会将执行的目标下载到一个临时目录,用完即删,不会占用本地资源。
下面的两种命令是基本一样的效果:
npm install -g create-react-app
create-react-app my-app
npm uninstall -g create-react-app
NPM依赖版本管理
语义化版本(SemVer)规则
语义化版本(Semantic Versioning,SemVer),就是一套给软件版本号定的通用规则。版本号包含以下几部分:主版本号.次版本号.修订号
- 主版本号(MAJOR):包括不兼容的 API 改动;大重构、架构升级、旧接口废弃;升级后可能无法兼容旧版
- 次版本号(MINOR):新增功能,但向下兼容;不破坏现有使用方式;旧代码可以无缝升级
- 修订号(PATCH):只修复 bug,不新增功能、不破坏兼容
此外还有一些其他的版本号变体,例如:先行版 1.0.0-alpha.1、1.0.0-beta.2、1.0.0-rc.1,也有一些其他的版本会带上构建时间,比如2.1.0+20260406
这个语义化版本是 npm 的一个约定,作为依赖的使用者,npm 通过语义化版本希望为你提供以下保证:
- 改第一位:小心,可能不兼容
- 改第二位:放心,加了新东西
- 改第三位:更稳,修了问题
这个规范在 npm 中具体的使用方式是:在 package.json 中,包版本号前常带有 ^ (caret) 或 ~ (tilde)。
- ^: 自动升级:次版本 + 修订版,不升级主版本,保证兼容。
例如:^1.2.3:允许安装 1.x.x 的最新版本(不包含 2.0.0)。 - ~ 波浪符号:只自动升级修订版,最保守,不新增功能,只修 bug。
例如:~1.2.3:允许安装 1.2.x 的最新版本。 - 写死版本号,这种不用说,最简单的方式。不自动升级,最稳定。
- 大于等于某个版本,例如"vue": ">=3.3.4"
语义化版本带来的问题
NPM 倾向于允许小版本更新,以获取修复和功能。语义化版本的初衷是开发者期望自动获取安全补丁或次要功能更新,而不必手动频繁修改 package.json
理想情况下,只要主版本号(Major)不改变,功能应当兼容。然而,现实很骨感,即便遵循了语义化规则也会出现换台机器执行 npm install 就熄火的情况。
- 有些包的维护者会不小心发布破坏性更改(Breaking Changes)但却只升级了次要版本(Minor)或补丁版本(Patch)
- 即使没有发布破坏性更改,比如你的项目依赖 a,而 a 依赖 b,a 修改了一个 bug 之后只升级了次要版本,此时 a 测试通过,但是后续 b 也升级了次要版本,b 也测试通过,它是被依赖方,但是 a 和 b 的这两次改动最终是不兼容的。
这些问题的主要原因包括:
- 深层依赖(子依赖)未固定
- 版本管理依赖 ^ 或 ~ 符号、具体的版本不确定
- 以及需要通过 package-lock.json 来锁定具体版本。
- 即使您固定了直接依赖的包(例如 A: 1.0.0),但如果 A 依赖 B,而 B 在其 package.json 中定义了 ^2.0.0,那么当 B 的作者发布了 2.0.1 时,您在下一次安装时可能会自动升级到 2.0.1,从而导致不可预知的破坏性更改
解决方法
- 若要严格固定版本,请使用:
精确版本号: 在 package.json 中显式去除 ^ 或 ~。
强制锁定: 确保提交 package-lock.json。 - 使用 npm ci: 在生产环境或 CI/CD 流程中,使用 npm ci 命令替代 npm install,该命令会严格基于 lock 文件安装,速度更快且绝不更新 package.json。
版本锁定 package-lock.json
锁文件的作用: 自 npm 5+ 起,package-lock.json 记录了所有直接和间接依赖的确切版本。
问题所在: 如果不将 package-lock.json 提交到 Git 代码仓库中,不同的人在不同的时间安装就会因依赖库更新而得到不同版本的包
package.json
devDependencies
开发依赖
peer
对等依赖(peer dependency)指的是一个库需要在其工作环境中预先存在一个特定的库或者工具,但并不直接包含或导入这个特定库。这种特定库被称为这个库的对等依赖。
对等依赖冲突
npm install --legacy-peer-deps
查看包的依赖路径
查看包的所有可用版本

浙公网安备 33010602011771号