包管理工具
包管理工具(Node Package Manager
)是一个基于命令行的工具,用于帮助开发者在自己的项目中安装、升级、移除和管理依赖项。
它类似于Java
的Maven
、Python
的Pip
等等。
常见的包管理工具有以下这些:
- npm(官方)
- yarn
- pnpm(推荐)
- cnpm
CLI(command-line interface)
npm
提供了一系列的命令行接口,这些接口能够帮助我们管理依赖包。
使用
常见的npm
命令:
npm init
:初始化一个新的npm
项目,创建package.json
文件。npm install <package-name>
:安装软件包及其依赖的任何软件包。 默认情况下,任何新软件包都被安装为生产依赖项,并且会在当前目录存放一个node_modules
。-g
:全局安装依赖,默认情况下,本地安装npm
会在当前目录下安装依赖,如果加上该选项,npm
则会将依赖安装在全局目录中,需要查看全局安装的依赖路径,可以使用npm config get prefix
。全局安装的依赖,一般是依赖提供的CLI
需要被所有工程可用才采用全局安装。-save
:默认情况下,任何新依赖包都被安装为生产依赖项,会被添加到package.json
的dependencies
列表中,并在打包后也需要这些依赖包的参与。-dev
:表示将新添加的依赖包,添加到package.json
的devDependencies
列表中,该列表的依赖,只会参与开发阶段。
npm update <package-name>
:更新指定的包。npm uninstall <package-name>
:卸载指定的包。npm run <script-name>
:执行package.json
文件中定义的脚本命令。npm search <keyword>
:搜索npm
库中包含指定关键字的包。npm info <package-name>
:查看指定包的详细信息。npm list
:列出当前项目中安装的所有包。npm outdated
:列出当前项目中需要更新的包。npm audit
:检查当前项目中的依赖项是否存在安全漏洞。npm login
:登录到npm
账户。npm logout
:注销当前npm
账户。npm publish
:发布自己开发的包到npm
库中。npm link
: 将本地模块链接到全局的node_modules
目录下npm config list
用于列出所有的 npm 配置信息。执行该命令可以查看当前系统和用户级别的所有npm
配置信息,以及当前项目的配置信息(如果在项目目录下执行该命令)npm get registry
用于获取当前npm
配置中的registry
配置项的值。registry
配置项用于指定npm
包的下载地址,如果未指定,则默认使用npm
官方的包注册表地址npm set registry
npm config set registry <registry-url>
命令,将registry
配置项的值修改为指定的<registry-url>
地址
TIP
安装一个包的时候,npm
会下载该包的依赖包到node_modules
目录中,如果本地安装下载的包带有CLI
,npm
会将它的脚本文件存放在node_modules/bin
目录下,直接使用命令npx 命令
即可调用。
比如vite
、webpack
镜像源
镜像源可以分为官方源、镜像源和私有源三种,npm
在下载依赖时,会根据registry
地址进行下载依赖,而npm
的registry
服务器位于国外,可能会受网速影响导致下载缓慢,所以通过切换一个更快的或者地理位置较近的镜像源,比如淘宝提供的镜像源地址https://registry.npm.taobao.org
,该镜像包含了官方库中所有包的副本。
npm config set registry 镜像源
:设置镜像源npm config get registry
:查看当前镜像源
npm
配置文件.npmrc
能够影响镜像源的选择,系统中可能存在多个配置文件,这些配置文件被访问的优先级从高到底依次是:
- 项目级的
.npmrc
文件:只作用在当前项目,跨项目生效。 - 用户级的
.npmrc
文件:npm config get userconfig
可以看到存放的路径 - 全局级的
npmrc
文件:npm config get globalconfig
可以看到存放的路径 - 内置的
npmrc
文件:不可更改的内置npm
默认配置
工具
nrm
:镜像源管理工具nvm
:Nodejs
版本管理工具
版本号
版本号遵循语义化控制,它是由三个部分组成,通常表示为主版本号.次版本号.修订号 x.y.z
:
- 主版本号:当做了不兼容的
API
修改时,增加的主版本号,比如Vue2
升级到Vue3
- 次版本号:添加了向下兼容的功能,意味着新版本添加了新功能,但是不会破坏现有功能的使用。
- 修订号:当修改了一些向下兼容的问题,并不会影响现有功能时,增加的修订号。
总结是重大更新增加主版本号,向下兼容新增功能增加次版本号,修复bug
增加修订号
版本范围显示:
^
:表示在主版本号非0的情况下,不修改主版本号,次版本号和修订号随意,比如^2.2.1
表示2.2.1 <= 依赖版本 < 3.0.0
版依赖包。~
:表示在不改变主版本号和次版本号,>=
修订号,比如~2.2.1
可以是2.2.1,2.2.2,...,2.2.n
<
:表示必须小于某个版本,比如<2.2.1
依赖的版本号必须要小于这个版本。<=
:表示必须小于等于某个版本。>
:大于某个版本。>=
:大于等于某个版本。.x
:表示修订号的位置上出现了个x
,比如2.2.x
,依赖版本的范围表示2.2.0 <= 依赖版本 <2.3.0
*
:表示任意版本-
:表示一个范围,比如2.2.1-2.3.1
表示2.2.1 <= 依赖版本 <= 2.3.1
比较版本大小
编写一个函数,比较两个给定的版本大小,版本号始终遵循语义化控制:
// 编写一个函数,比较两个给定的版本大小,版本号始终遵循语义化控制
function compareVersions(version1, version2) {
// 将版本号拆分为主版本号、次版本号和修订号
const v1Parts = version1.split('.').map(Number);
const v2Parts = version2.split('.').map(Number);
// 确保两个版本号都有三个部分
while (v1Parts.length < 3) v1Parts.push(0);
while (v2Parts.length < 3) v2Parts.push(0);
// 依次比较主版本号、次版本号和修订号
for (let i = 0; i < 3; i++) {
if (v1Parts[i] > v2Parts[i]) return 1; // version1 大
if (v1Parts[i] < v2Parts[i]) return -1; // version2 大
}
return 0; // 版本号相等
}
// 使用示例
console.log(compareVersions('1.2.3', '1.2.4')); // 输出 -1,表示 1.2.3 < 1.2.4
console.log(compareVersions('2.0.0', '1.9.9')); // 输出 1,表示 2.0.0 > 1.9.9
console.log(compareVersions('1.2.3', '1.2.3')); // 输出 0,表示 1.2.3 = 1.2.3
console.log(compareVersions('1.2', '1.2.0')); // 输出 0,表示 1.2 = 1.2.0
npx
npx
是一个命令行工具,在安装npm
时,会随同它一起包含在内。
它用于直接执行node_modules/.bin
中的可执行文件,无需全局安装。运行规则和npm
是一致的,遵循的是冒泡查找
,会在当前目录的bin
中查找命令,如果没有会向上冒泡到全局的node_modules
查找,如果还没有,就去下载这个包,然后执行命令,执行完毕后删除该包。
常见用途:
- 测试尚未发布的包
- 执行本地包
- 运行一次性命令
# 运行一个本地安装的包的命令
npx <package-name>
# 运行特定版本的包
npx <package-name>@<version>
# 直接运行 GitHub 上的脚本
npx github:<owner>/<repo>
一般会执行创建项目的脚手架命令,比如nestjs
的npx nest new
,react
的npx create-react-app
。
如果想要编写一个可执行的包,需要在package.json
中指定bin
字段,指向可执行的脚本文件。
{
"name": "test",
"version": "1.0.0",
"bin": {
"my-cli": "./bin/index.js" // 定义全局命令与入口文件
}
}
编写可执行脚本要在文件开头指定Shebang
,指定用Nodejs
执行
#!/usr/bin/env node
// ↑ Shebang 必须,指定用 Node.js 执行
console.log("Hello test pck!");