2021-0529 原文链接
#Mac #Windows #Linux
整理自 npm 官方文档(下文称文档) docs.npmjs.com,命令部分为 Version 7.x。
文档结构大致如下:
- npm 用户账户介绍
- 软件包、模块介绍与使用
- 外部服务集成 npm
- 团队与组织
- 企业级 npm
- npm 命令
本笔记分为三个部分:npm 命令、npm 实践、相关生态。省略了概念性的知识,重在信息汇总,最终需要回归文档与实践。
npm 命令
以下为所有命令的汇总以及本人对命令的分类,遍历所有命令,可以知道命令能够做到哪些事。实际上不同命令使用频率不同,重要性也不同。感性的来说,拥有别名的命令需要更加重视。
文档中列出了 62 个命令:
access adduser audit bin bugs cache ci completion config dedupe deprecate diff dist-tag docs doctor edit exec explain explore find-dupes fund help help-search hook init install install-ci-test install-test link logout ls org outdated owner pack ping prefix profile prune publish rebuild repo restart root run-script search set-script shrinkwrap star stars start stop team test token uninstall unpublish unstar update version view whoami
其中 npx = npm exec,因此未计数。使用 npm help 可以在命令行中列出所有命令,会发现比文档中的略多,比如 ll get set,其中 ll 是 ls 命令的别名,get、set 等价于 config 的 get、set 子命令。
将所有的命令进行分类:
账号相关 7
当需要对 npm 进行身份验证时,有两种选择:用户名/密码、token。只有完成了身份验证,才能做发包(publish)、删除包(unpublish)等操作。
除了个人身份验证,team、org 命令还可以管理组织与团队。
profile 命令可以修改账户的个人信息。
npm adduser=npm [login | add-user]npm logoutnpm whoaminpm tokennpm teamnpm orgnpm profile
管理自己的包 6
完成身份验证后可以发包(publish)、删除包(unpublish)。其它命令还包括:
access:修改已发布包的访问级别。
deprecate:弃用包的某个版本。
dist-tag:添加/删除/列举包的标签。在安装包时,标签等同于版本号。
owner:管理包的所有者。
npm publishnpm unpublishnpm accessnpm deprecatenpm dist-tag=npm dist-tagsnpm owner=npm author
查看 npm 信息 6
以下命令可以检查 npm 版本、帮助命令、相关目录位置。
npm version类似于npm [-v | --version]npm help=npm -hnpm help-searchnpm binnpm rootnpm prefix
npm 环境 5
一些对 npm 环境进行操作的命令:
ping:ping 一下 npm 的源。
doctor:执行包括 ping 在内的一些列命令,用于检查 npm 环境。
cache:管理包缓存。
config:管理 npm 的配置。
completion: npm 命令自动补全。
npm pingnpm doctornpm cachenpm config=npm cnpm completion
脚本命令 7
推荐阅读阮一峰老师的 npm scripts 使用指南1
npm startnpm restartnpm stopnpm test=npm [t | tst]npm rebuild=npm rbnpm run-script=npm [run | rum | urn]npm set-script
项目中使用包 17
init 命令可以交互式的创建 package.json 文件,一般在全新的项目中使用。
install、uninstall、update 是常用的安装/卸载/更新包命令。
install-test、ci、install-ci-test 则是稍微特别一点的安装命令。
link 命令用于在 node_modules 目录下建立一个符号连接,指向指定的包或者包所在目录。
prune 命令删除无关(存在于 node_modules 目录中但是没有包依赖它)的包。
outdated 命令检查过时的包。
dedupe 命令减少包树中的重复。
find-dupes 命令查找包树中的重复。
explain 命令打印包在项目中的依赖链。
explore 命令进入指定包中执行一些命令。
audit 命令进行安全审计,使用 fix 参数可以直接安装更安全的依赖版本。
exec 命令允许从已安装的包中运行命令。等价于 npm@5.2 中新增的 npx 命令。推荐阅读阮一峰老师的 npx 使用教程2
shrinkwrap 命令锁定项目中包的依赖版本。
npm initnpm install=npm [i | add]npm uninstall=npm [remove | rm | r | un | unlink]npm update=npm [up | upgrade]npm install-test=npm itnpm cinpm install-ci-test=npm citnpm link=npm lnnpm prunenpm outdatednpm dedupe=npm ddpnpm find-dupesnpm explain=npm whynpm explorenpm auditnpm exec=npm x=npxnpm shrinkwrap
获取/编辑包信息 10
search 命令可以检索所有已发布包,作用与在 npm 官网检索相同。
ls 命令列出项目中或全局安装的包。
view 命令查看包注册表信息。
diff 命令查看不同版本包的差异。
docs 命令在浏览器中打开包的文档。
bugs 命令在浏览器中打开反馈 bug 的地址。
repo 命令在浏览器打开包存储库界面。
fund 命令在浏览器打开给项目提供资金的界面。
pack 命令给包创建一个 tarball。
edit 命令使用默认编辑器打开包目录供用户编辑包信息。
npm search=npm [s | se | find]npm ls=npm [list | la | ll]npm view=npm [info | show | v]npm diffnpm docs=npm homenpm bugs=npm issuesnpm reponpm fundnpm packnpm edit
用于自动化的钩子 1
首先什么是钩子?钩子是 npm 注册表事件的通知。hook 命令可以做到订阅指定包的注册表事件,当包发生变化(publish、dist-tag……)时,会向 hook 命令配置的 URL 发送 HTTP POST。
npm hook
操作喜欢的包 3
npm starnpm unstarnpm stars
npm 实践
npm 配置
npm 获取配置的优先级依次为:命令行参数、环境变量、.npmrc 文件、默认配置。
一般使用 config 命令管理配置:
npm config list -l # 获取所有配置
npm config get <key> # 获取指定配置
npm config delete <key> # 删除指定配置
npm config set <key>=<value> # 设置配置值,配置会出现在 .npmrc 文件中
# npm config set <key> <value> # 同上
# npm c set <key> <value> # 同上
# npm set <key> <value> # 同上
一次性修改配置可以使用命令行参数:
npm <command> --<key> # key = true
npm <command> --<key>=<value> # key = value
由于 npm 官方源访问速度问题,开发中经常会配置源地址,甚至出现了专门的包 nrm 用于管理 npm 源。
源配置对应 registry 字段。常见源地址及配置如下:
# 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/
# skimdb -- https://skimdb.npmjs.com/registry
npm config get registry # 查看当前源地址
npm config set registry <url> # 设置源地址
安装包
install 命令用于安装包。几乎是最重要的命令,其概览如下:
npm install (with no args, in package dir)
npm install [<@scope>/]<name>
npm install [<@scope>/]<name>@<tag>
npm install [<@scope>/]<name>@<version>
npm install [<@scope>/]<name>@<version range>
npm install <alias>@npm:<name>
npm install <git-host>:<git-user>/<repo-name>
npm install <git repo url>
npm install <tarball file>
npm install <tarball url>
npm install <folder>
首先解释一下命令行格式中符号含义(未找到官方定义):
[]可选项<>可变选项(多选一,且必须选一)x|y|z多选一-abc多选
npm install:当命令后不接包相关信息时,package.json 文件中 dependencies 和(或) devDependencies 字段定义的包将安装到本地 node_modules 目录。具体规则受配置字段 production 控制。
production = true仅安装 dependencies 中的包production = falsedependencies 和 devDependencies 中的包都安装
命令具体使用如下:
# 命令行中修改配置并安装
npm install --production # production = true
npm install --production=false # production = false
# 修改配置文件(长期有效)并安装
npm set production=true
npm set production=false
npm install
npm install <pkg>:命令后接包名,此时从源地址拉取安装包的最新版。包名后接 tag 或版本号(可带范围)可以安装指定版本的包。对照上面的指令概览,包也可以为 git 仓库地址、包 tarball 文件、包 tarball 文件的地址、包目录等。
此外,命令后可添加参数:
--save-prod=-P默认情况。包出现在 dependencies--save-dev=-D包出现在 devDependencies--save-optional=-O包出现在 optionalDependencies--save-bundle=-B包出现在 bundleDependencies--no-save包不出现在 package.json 文件中--save-exact=-E安装包的精确版本
--save-exact 参数控制安装包的精确版本(no ~ or ^),其它参数控制包出现在 package.json 文件中的位置。重点讲一下 dependencies 与 devDependencies 的区别。
语义上 devDependencies 是指在开发过程中使用的包,项目正式运行时不需要。效果上项目 project_a 安装一个包 pkg_a,pkg_a devDependencies 中的包都不会在 project_a 中安装。pkg_a dependencies 中的包则会在 project_a 中安装并遵循依赖加载算法。
文档中关于该算法的举例:
存在重复包。
# 项目中依赖包的拓扑结构
project
├── A
│ ├── B
│ ├── C
├── B
│ ├── C
├── C
│ ├── D
# 实际 node_modules 目录结构
project
├── node_modules
│ ├── A
│ │ ├── node_modules
│ │ │ ├── B
│ │ │ ├── C
│ │ │ ├── D
存在同名但不同版本的包
# 项目中依赖包的拓扑结构
project
├── A
│ ├── B
│ ├── C
├── B
│ ├── C
│ ├── D@1
├── C
│ ├── D@2
# 实际 node_modules 目录结构
project
├── node_modules
│ ├── A
│ │ ├── node_modules
│ │ │ ├── B
│ │ │ ├── C
│ │ │ │ ├── node_modules
│ │ │ │ │ ├── D@2
│ │ │ ├── D@1
开发包的小技巧 link
link 命令可以通过符号链接(symlink)指向指定包。当指向自己开发的包时,可以随时重构开发包的内容,提高开发效率。
install 命令后接包目录时,可以实现同样效果。
假设开发包为 pkg_dev,目录为 {path}/pkg_dev。
在项目 pkg_pro 中通过 link 命令使用开发包,最终项目结构如下:
pkg_pro
├── node_modules
│ ├── pkg_dev -> {path}/pkg_dev
命令具体使用如下:
# 用法 ①
# 在全局 node_modules 目录创建指向当前包的符号链接
npm link (in package dir)
# 当前项目 node_modules 目录创建指向包的符号链接
# 如果包不存在则先全局安装
npm link <pkg>
# 用法 ②
# 当前项目 node_modules 目录创建指向指定目录的符号链接
npm link <pkg_directory>
# 等效用法 ③
# 当前项目 node_modules 目录创建指向指定目录的符号链接
# 同时 package.json 文件 devDependencies 中出现包名、包所在目录
npm install <pkg_directory>
发布包
当编写了一个含有 package.json 的包后,只要完成用户身份验证即可发包,记得包不得与已有包重名。一个完整的流程如下:
# 交互式:输入用户名、密码、电子邮件地址(前提是已在网站注册 npm 账号)
npm login # login 是 adduser 的别名
# npm whoami # 登陆成功会显示用户名
# npm profile get # 从 CLI 查看用户信息
# npm version <update_type> # 修改 package.json 中的版本号
npm publish # 发布包
# npm publish --tag <tag> # 发布包并为包添加 tag
npm unpublish <pkg> --force # 取消发布整个包
# npm unpublish <pkg>@<version> # 删除包的指定版本
相关生态
node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine.(基于 Chrome 的 V8 引擎构建的 js 运行时。)
npm (node.js package manager) nodejs 的包管理器。
cnpm 是淘宝 npm 镜像,它的仓库是 npm 仓库的一个拷贝;支持 npm 除了 publish 之外的所有命令。
nrm 是一个 npm 源管理器,允许快速地在 npm 源间切换。
nvm (node.js version management) Mac 的 nodejs 版本管理工具。
nvm-windows Windows 的 nodejs 版本管理工具。
Footnotes
-
npm scripts 使用指南 www.ruanyifeng.com/blog/2016/1… ↩
-
npx 使用教程 www.ruanyifeng.com/blog/2019/0… ↩