NPM包管理器
# NPM介绍
# NPM简介
npm(全称 Node Package Manager,即“node包管理器”)是Node.js (opens new window)默认的、用JavaScript (opens new window)编写的软件包管理系统 (opens new window)。npm会随着Node.js自动安装。npm模块仓库提供了一个名为“registry”的查询服务,用户可通过本地的npm命令下载并安装指定模块。此外用户也可以通过npm把自己设计的模块分发到registry上面
# NPM的由来
npm完全用JavaScript (opens new window)写成,最初由艾萨克·施吕特(Isaac Z. Schlueter)开发。艾萨克表示自己意识到“模块管理很糟糕”的问题,并看到了PHP (opens new window)的PEAR (opens new window)与Perl (opens new window)的CPAN (opens new window)等软件的缺点,于是编写了npm。
# NPM的命令行使用
基础命令的使用方法
$ npm <命令> [参数]
# *登录/组织登录
登录和登出...
# 组织登录
$ npm login # 登录当前用户
$ npm adduser # login的别名
$ npm login --scope=@组织名称
# 注销(登出),删除链接和身份验证令牌
$ npm logout # 注销当前用户
$ npm logout --scope=@组织名称
指定注册地址
# 可选参数 注册地址
# --registry=https://registry.mycorp.com
$ npm login --registry=https://registry.npmjs.org
# *初始化/组织初始化
初始化生成一个包,可以理解为create...
# 初始化生成包
$ npm init
# 指定组织进行初始化 --yes的别名>表示跳过问卷
$ npm init --scope=@组织名称 -y
# *发布/删除线上包
将包发布到注册表,以便可以按名称安装。
# 模板
$ npm <pub|publish> {<tar>|<文件夹dir>}
# 基本发布示例(发布到latest标签)
$ npm pub
# 指定标签发布
$ npm pub --tag tag-name
# 发布公共包
$ npm pub --access=public
# 发布私有包(需付费)
$ npm pub --access=restricted
# 删除已发布的包
npm unpublish <pkg-name>[@version] --force
# *安装/卸载依赖包
# 模板
$ npm <i|install|add> <pkg-name>
# 安装uniq示例
$ npm i uniq
# 卸载模板
$ npm <uninstall|remove|rm|r|un|unlink> <pkg-name>
# 卸载uniq 示例
$ npm uninstall uniq
# *更新依赖包
此命令会将列出的所有包更新为最新版本
# 模板
$ npm <update|up|upgrade> [<pkg>]
# 示例(全部更新)
$ npm up
# 示例(全局更新)
$ npm up -g
# 示例(指定更新)
$ npm up uniq
# *快速构建项目
该功能与Yarn Create相同,是一个速记命令,能一次性帮您完成两件事情
# 仅举例,无法使用
$ npm init pkg [<args>]
# 与下方命令一致
$ npm i -g create-pkg && create-pkg [<args>]
# 实际的命令转换其实是
$ npm exec create-pkg [<args>]
# 因为 npm exec|npm x|npx其实是相同的所以..
$ npx create-pkg [<args>]
可用例子
$ npm init vite vite-app
init命令转化为相应的npm exec
操作如下:
npm init foo
->npm exec create-foo
npm init @usr/foo
->npm exec @usr/create-foo
npm init @usr
->npm exec @usr/create
# 工作区初始化
什么是工作区?(暂无)
# 初始化一个工作区
$ npm init -w <dir>
# 通常来说都会以 packages/xxx作为工作区
$ npm init -w packages/pkg-name
快速构建工作区项目
# 先指定工作区, 后init快速初始化项目
$ npm init <workspace-option> pkg [<args>]
# 示例 init --workspace别名 workspace目录 viteCli 创建到当前目录
$ npm init -w packages/ws-vite vite .
# *查看包信息
此命令显示有关包的数据并将其打印到标准输出。
# 模板
$ npm <view|info|show|v> <pkg-name> <field>
# 查看指定包全部信息
$ npm view uniq
# 查看指定包,指定信息
$ npm view uniq versions
# *添加/清除缓存
add/添加:将指定的包添加到本地缓存。此命令主要供 npm 内部使用,但它可以提供一种将数据显式添加到本地安装缓存的方法。
感知不强
$ npm cache add <pkg-name>
clean/清除:删除缓存文件夹中的所有数据。请注意,这通常是不必要的,因为 npm 的缓存是自我修复的并且可以抵抗数据损坏问题。
目测尝试只能全部删除,不能指定
$ npm cache clean
$ npm cache clear
$ npm cache rm
ls/列表:查看npm缓存列表
$ npm cache ls
verify/验证:验证缓存文件夹的内容,垃圾收集任何不需要的数据,并验证缓存索引和所有缓存数据的完整性
$ npm cache verify
# *快速打开包doc文档
快速到包的仓库,查看包文档或代码仓库。
$ npm docs <pkg-name>
$ npm home <pkg-name>
# 示例
$ npm docs antd
# *快速打开包issues
快速查看issues,解决/提出问题
$ npm bugs <pkg-name>
# *快速打开包存储仓库
快速打开浏览器到包存储仓库
$ npm repo vue
*列出可更新包
此命令将检查注册表以查看当前是否有任何(或特定的)已安装包已过时。
# 模板
$ npm outdated [<pkg-name>]
# 示例,指定某些包(不指定查全部)
$ npm outdated vue uniq
# JSON输出
$ npm outdated -j
# *修改/设置npm配置
npm 从命令行、环境变量、npmrc
文件以及在某些情况下从package.json
文件中获取其配置设置。主要是修改npm的源地址,npm环境变量等..
# 使用配置的优先级
Project > user > global > builtin
# 配置文件npmrc
四个相关文件是:
- 每个项目的配置文件 [project]
- 每个用户的配置文件 [user]
- 全局配置文件 [global]
- npm 内置配置文件 [builtin]
# 查看所有层级配置
查看配置会显示所有的配
# bash use
$ npm <c|config> list
# 示例 -j是以 json输出
$ npm c list -j
# 查看全部配置
$ npm c list -l
# 查看使用中的一条值
能查看一条配置,当前作用域在使用的值,将其打印。
$ npm <c|config> get <config-name>
# 示例
$ npm c get registry
# <c|config>是可以省略的
$ npm get registry
# 设置/删除指定配置
<c|config>
是可以不需要的
设置一个值
# 命令
$ npm <c|config> set <config-name> <config-value>
# 示例
$ npm c set userConfig user000 --location user
$ npm c set projectConfig project000 --location project
$ npm c set globalConfig global000 --location global
# 更方便的全局设置和删除 -g 是 --global 同等 --location global
$ npm c set globalConfig global000 -g
# <c|config>是可以省略的
$ npm set globalConfig global000 -g
删除一个值
参数将set修改为delete,且不能省略
<c|config>
,其他是一样的
# 命令
$ npm <c|config> set <config-name> <config-value>
# 示例
$ npm c delete userConfig user000 --location user
...
$ npm c delete globalConfig global000 -g
# 打开/编辑npmrc配置
打开文本直接编辑 npm配置
$ npm c edit
# 指定层级(作用域)
$ npm c edit --location project
# *指定已发布包某些版本弃用
此命令将更新包的 npm 注册表项,向所有尝试安装它的人提供弃用警告。
重复弃用可覆盖旧的弃用信息
# 模板
$ npm deprecate <pkg-name>[@ <version range>] <message>
# 弃用指定版本
$ npm deprecate pkg@1.0.0 "因为弃用,所以弃用"
# 弃用指定范围版本
$ npm deprecate pack@"< 1.0.0" "1.0.0一下的版本都弃用了,望周知"
# *标签Tag管理
标签可用于提供别名而不是版本号。分流版本管理。
例如,一个项目可能会选择有发展的多个数据流,并使用不同的标签为每个数据流,如stable
,beta
,dev
, canary
。
拿Vue举个例子,Vue3已经在npm发布,但现在安装的Vue还是Vue2的,需要使用vue@next来安装Vue3的。next就是一个标签,Vue将Vue3的都发布在next这个标签内,如果不添加next会默认下载vue@latest
每个标签只有一个版本!版本库和标签是分离的。
如果发布时,不指定版本将会发布到latest,这时安装不@标签就会默认安装latest标签的版本
# 将某版本指定到某标签
需要发布者权限才能做此操作
# 模板
$ npm <dist-tag|dist-tags> add <pkg-name>@<version> <tag-name>
# 示例 将pkg@1.0.1 添加到旧版本tag
$ npm dist-tag add vuepress-plugin-typing@1.0.1 oldVersion
# 将某标签删除
需要发布者权限才能做此操作
# 模板
$ npm <dist-tag|dist-tags> rm <pkg-name> <tag-name>
# 示例 将pkg的 tag删除
$ npm dist-tag rm vuepress-plugin-typing oldVersion
# 发布到某个标签
需要发布者权限才能做此操作
如果发布时,不指定版本将会发布到latest,这时安装不@标签就会默认安装latest标签的版本
# 模板
$ npm pub --tag <tag-name>
# 示例
$ npm pub --tag beta
# 假如呢没有指定tag的情况,他默认将会是
$ npm pub --tag latest
# 查看某个包的标签
这个是不需要权限的...f
# 模板
$ npm <dist-tag|dist-tags> ls <pkg-name>
# 示例
$ npm dist-tag ls vue
# 当然你也可以..使用info的 对象/json输出
$ npm info vue dist-tags
# *包管理员设置
查看/管理已发布包的所有权
除查看以外的管理员命令,需要超级管理员权限
# 模板
$ npm <owner|author> <add|rm|ls> <pkg>
# 查看当前包管理员
$ npm owner ls
# 查看指定包管理员
$ npm owner ls vue
# 添加包管理员(需要你是超级管理员)
$ npm owner add ranxin
# 指定包(需要你是超级管理员)
$ npm owner add ranxin @starfix/canvas
# 删除包管理员(需要你是超级管理员)
$ npm owner rm ranxin
# 团队管理设置
查看/管理团队的成员,创建团队
团队分为两层,由组织到团队...一个组织可以有很多个团队
需要团队管理员权限
# 创建团队 组织:团队名
$ npm team create <组织:团队名>
$ npm team create starfix:testTeam
# 添加团队成员
$ npm team add <组织:团队名> <组织成员ID>
$ npm team add starfix:testTeam ranxin
# 查看组织团队列表
$ npm team ls <组织名>
$ npm team ls starfix
# 查看团队成员列表
$ npm team ls <组织:团队名>
$ npm team ls starfix:testTeam
# 删除团队成员
$ npm team rm <组织:团队名> <组织成员ID>
$ npm team rm starfix:testTeam ranxin
# 删除团队(无法删除默认的developers)
$ npm team destroy starfix:testTeam
# *包的命令作用域
在指定的已安装包的目录中生成一个子shell
# 模版
$ npm explore <pkg>
# 示例
先安装一个局部的npm
$ npm i npm
然后进入这个npm的目录,并自动生成一个子shell
$ npm explore npm
# 打印npm版本,这时它会优先使用局部npm的版本
$ npm -v # 这时,这个npm就是局部的npm了
# 退出局部作用域
$ exit
# 快速执行
最关键的用处其实在这里
假如依赖中有你的包,可以在当前项目中快速操作
# 发布模版
$ npm explore <my-pkg> -- npm pub
# 推送模版
$ npm explore <my-pkg> -- git pull origin master
# 基础示例
$ npm explore npm -- npm -v
# *搜索线上pkg包
# 模板
$ npm <s|se|search|find> <pkg-name>
# 示例
$ npm s vuepress-plugin
option | 说明 |
---|---|
--description=false | 不显示描述信息 |
--registry=https://registry.npmjs.org | 修改查找的来源地址 |
--long | 显示每个包更多的信息 |
-j | --json | JSON格式输出 |
# *全局包与项目双向绑定
将包推向全局(prefix目录)下,把包内容链接到不同的项目,项目的包和全局的包通过链接关系双向绑定,修改其中一个目录下的包,其他目录下的这个包也会一起修改。
# 前言
注意!!如果链接到某个项目,将node_modules删除了,那么对应的全局也会删除!!包括使用link的其他项目的此包也会删除
将包放到了npm的全局node_modules中是正常的全局的包,但使用link后会将全局的包和link到项目的包进行双向绑定关系。如果把一个全局的包link了多个项目,这些项目将共享一个包的全文件内容和状态。如果其中项目将这个包删除了,那么联动了全部项目,其他项目的这个包的内容也会被删除。
# 基础命令模版
$ npm <link|ln> <pkg-name|link-name>
# 将本地包推向全局
进入到包项目或者说依赖包目录,使用link命令时,就已经将此包与全局链接
假如当前项目是一个pkg包项目,直接进入项目即可
# 将当前目录package.json为基础的项目链接到全局
# 将以目录中package的name为link-name推送到全局
$ npm ln
将本地项目中使用 的第三方包推送到全局
这里可以使用explore,上一节提到过
# 将本地项目中使用的uniq推送到全局
# 使用包作用域快速进入并执行推送
$ npm explore uniq -- npm ln
# 如果没有安装依赖,npm的包直接从 网络获取也可以,直接链接当前项目和全局
$ mpm ln uniq
# 将全局包链接到项目
将全局的包绑定到你的项目,也可以是多个项目.
# 在全局存在的情况下,如果全局不存在那么将会创建uniq并放到全局
$ npm ln uniq
但执行link有关的命令,实际上已经将包放到全局了
# 假如我将可以用命令执行的npm包link
$ npm ln cowsay
# 这时本项目可以安装了cowsay也在全局添加了cowsay
$ cowsay -p 我可以全局使用cowsay了!
# 将链接和包安全移除
用移除包的命令即可删除,不影响链接到全局底包
$ npm rm uniq
$ npm uninstall uniq
$ npm unlink uniq
$ npm rm cowsay
....
# 例子
到A项目中,安装uniq然后将其链接到全局
# project-a 安装uniq
$ npm i uniq
# 将project-a中的uniq链接到全局
$ npm explore uniq -- npm ln
# 设置project-a中的描述文字为”我修改了描述"
$ npm explore uniq -- npm pkg set description=我修改了描述
到B项目中,链接uniq查看对应描述
# project-b 安装链接uniq; --save可以将地址自动添加到package.json
$ npm ln uniq --save
# 查看project-b的描述文字是否被双向绑定改变
$ npm explore uniq -- npm pkg get description
# 修改project-b的描述文字 再去查看project-a的描述文字
$ npm explore uniq -- npm pkg set description=我在b修改了描述
# 到project-a中查看修改
$ npm explore uniq -- npm pkg get description
# 列出已安装的包
# 模板
$ npm <ls|la|list> [<pkg-name>]
# 列出依赖的全部包
$ npm ls
# 列出指定包,并高亮标记
$ npm ls vue
option | 说明 |
---|---|
--link | 仅列出link的包>> npm link |
--depth 0 | 显示的深度,遍历的层级有多少 |
--long | 显示每个包更多的信息 |
-j | --json | JSON格式输出 |
--all | 显示包括不依赖的包 |
# *运行自定义脚本
这会从包的"scripts"
对象运行任意命令。如果没有 "command"
提供,它将列出可用的脚本
# 模板
$ npm <run|run-script|rum|urn> <pkg.json-script>
# 基础使用(执行scripts中的dev命令)
$ npm run dev
# 工作区使用(workspaces-a执行scripts中的dev命令)
$ npm run dev -w workspaces-a
# *设置自定义脚本
在 package.json 的脚本部分设置任务
npm7才有..
# 模板
$ npm set-script <script> <command>
# 示例
$ npm set-script start "echo 设置了log,并输出"
# 工作区设置(为ws-a设置)
$ npm set-script start "echo 设置了log,并输出" -w ws-a
# 启动/停止/重启项目
在package.json的script内配置有start和restart的命令,npm能快捷执行。
快捷自定义脚本
快捷启动,可以不使用run的自定义命令
$ npm start
$ npm run start # 这两个是相等的
快捷停止,可以不使用run的自定义命令
$ npm stop
$ npm run stop # 这两个也是相等的
快捷重启,可以不使用run的自定义命令
如果脚本中没有配置restart那么会停止后在进行start
restart > stop > start
$ npm restart
$ npm run restart # 这两个也是相等的
# 运行自定义测试
快捷自定义脚本
快捷测试,可以不使用run的自定义命令
$ npm test
$ npm run test # 这两个也是相等的
# 查看登录用户名
显示当前登录用户的 npm 用户名
$ npm whoami
# 收藏夹/星标
标记喜欢的包。
# 模板 星标|星标列表|取消星标
$ npm <star|stars|unstar> [<pkg-name>]
# 示例(收藏vue)
$ npm star vue
# 示例(查看当前所有收藏)
$ npm stars
# 示例(取消收藏)
$ npm unstar
# 操作package.json文件
npm7命令修改或查看package文件...
# 模板
$ npm pkg <get|set|delete> <key>{=<value>}
# 查看某些字段信息
$ npm pkg get name version
$ npm pkg get script.start # 多层级
# 修改某个字段信息
$ npm pkg set version=1.0.0
# 删除某个字段信息
$ npm pkg delete version
# NPM自检
许多问题通常归因于 npm 代码库之外的事情,因此请npm doctor
确认 npm 安装处于良好状态。
# npm自检
$ npm doctor
# ping延迟
$ npm ping https://registry.npmjs.org/
# NPM快速编辑依赖
编辑已安装的包
感觉毫无卵用....
$ npm edit <pkg-name>
# NPM查看包依赖关系
此命令将打印导致在当前项目中安装给定包的依赖关系链
# 模版
$ npm <explain|why> <folder|specifier>
$ npm explain vuepress-plugin-typing
# 使用别名和 json输出..
$ npm why vuepress-plugin-typing -j
# 删除项目无用包
此命令删除“无关的”包。如果提供了包名称,则仅删除与提供的名称之一匹配的包。
# 模板
$ npm prune <pkg-name>
# 示例,不指定包 且打印json
$ npm prune -j
# 删除项目重复包
搜索本地包树并尝试通过将依赖关系进一步向上移动树来简化整体结构,在那里它们可以被多个依赖包更有效地共享。
通过npm对比算法 (opens new window)后,删除重复的包
$ npm dedupe
# 别名
$ npm ddp
仅检查,不进行删除
$ npm find-dupes
# 从包获得一个tar包
从包创建一个 tarball
会生成一个tar压缩包,内容是pkg包的全部东西
# 模板
$ npm pack <pkg-name>
# 示例,并输出每个文件的信息
$ npm pack vue -j
# 生成NPM的锁文件(Lock)
将npm生成的package-lock.js
或现有的node_modules
生成一份package-lock.json
$ npm shrinkwrap
# 使用锁快速安装
npm ci
在以下情况下会明显更快:
- 有一个
package-lock.json
或npm-shrinkwrap.json
文件。 - 该
node_modules
文件夹丢失或为空。
$ npm ci
简而言之,使用npm install
和之间的主要区别npm ci
是:
- 该项目必须具有现有的
package-lock.json
或npm-shrinkwrap.json
. - 如果包锁中的依赖项与 中的不匹配
package.json
,npm ci
将退出并显示错误,而不是更新包锁。 npm ci
一次只能安装整个项目:无法使用此命令添加单个依赖项。- -如果 a
node_modules
已经存在,它将在npm ci
开始安装之前自动删除。 - 它永远不会写入
package.json
或任何包锁:安装基本上是冻结的。
# NPM-HOOK
钩子允许您配置 URL 端点,当任何受支持的实体类型发生更改时都会通知这些端点。钩子可以监视三种不同类型的实体:包、所有者和作用域。
要创建包挂钩,只需引用包名称。
没搞懂,有什么用..
$ npm hook ls [pkg]
$ npm hook add <entity> <url> <secret>
$ npm hook update <id> <url> [secret]
$ npm hook rm <id>
# 快捷安装测试
安装一个干净的项目并运行测试,此命令运行npm ci
后紧跟npm test
绝了,越来越多没卵用的东西...
# 模版
$ npm <install-ci-test|cit> <pkg>
# 没有示例
$ npm cit <pkg>
安装一个包并运行测试
$ npm install-test <pkg>
$ npm it <pkg>
# 身份验证令牌
管理您的身份验证令牌
# 查看已授权令牌
$ npm token
$ npm token list
# 创建token授权
$ npm token create
# 创建只读的授权
$ npm token create --read-only
# 创建白名单授权
$ npm tokken create --cidr=192.168.0.1/24,192.168.0.1/16
# 撤销授权
$ npm token revoke <id|token>
# 命令存放位置
# 打印全局存放位置
$ npm bin -g
# 打印当前项目存放位置
$ npm bin
# 输出项目位置
# 当前项目位置
$ npm prefix
# 全局npm位置
$ npm prefix -g
# 依赖根目录位置
将有效node_modules
文件夹打印到标准输出
$ npm root
# > D:\Project\RanxinBlog\node_modules
$ npm root -g
# > C:\Users\admin\AppData\Roaming\npm\node_modules
# 查看用户注册信息
# 模板
$ npm profile <get|set|enable-2fa|disable-2fa> <key>{=<value>}
# 查看示例
$ npm profile get
# 指定包进行diff对比
option | 说明 |
---|---|
--diff=pkg | 定义要在 中进行比较的参数,可多次设置 |
--diff-name-only | 使用时仅打印文件名 |
--diff-unified 3 | 要打印的上下文行数 |
--diff-ignore-all-space | 比较中的行时忽略空格 |
--diff-no-prefix | 不要在npm diff 输出中显示任何源或目标前缀 |
--diff-src-prefix | 要在npm diff 输出中使用的源前缀 |
--diff-dst-prefix | 要在npm diff 输出中使用的目标前缀 |
--diff-text | 将所有文件视为文本 |
使用案例
# 模板
$npm diff --diff=<version-a> [...<paths>]
# 示例
$ npm diff --diff=uniq@0.0.2 --diff=uniq
$ npm diff --diff=uniq@0.0.2 --diff=uniq --diff-name-only
# 二进制包重新构建
此命令npm build
在匹配的文件夹上运行该命令。这在您安装新版本的 node 时很有用,并且必须使用新的二进制文件重新编译所有 C++ 插件。使用--ignore-scripts
和安装时也很有用 --no-bin-links
,可以明确选择要构建和/或链接 bin 的包。
如果提供了一个或多个包名称(以及可选的版本范围),则只会重建名称和版本与其中一个说明符匹配的包。
$ npm rb
$ npm rebuild
$ npm rb canvas
# NPX介绍
# NPX简介
npx原本是npm团队独立出来的一个npm包,用途是操作当前项目中的命令。后来npm将npx合并了,安装node时也会预置npx。在后续的版本中 npm也拥有 exec和 x等命令可直接代替npx
# *NPX的工作方式
1.先搜索当前的项目node_modules/.bin中是否存在需要执行的命令
2.再到比本地的全局搜索是否存在需要执行的命令
3.如果项目和本地的全局都没有能够执行的命令,会缓存一个文件夹,下载命令去执行,但执行完成后将删除缓存的文件夹
# NPX的命令行使用
基础命令的使用方法