Skip to content

包管理工具

包管理工具(Node Package Manager)是一个基于命令行的工具,用于帮助开发者在自己的项目中安装、升级、移除和管理依赖项。

它类似于JavaMavenPythonPip等等。

常见的包管理工具有以下这些:

  • 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.jsondependencies列表中,并在打包后也需要这些依赖包的参与。

    • -dev:表示将新添加的依赖包,添加到package.jsondevDependencies列表中,该列表的依赖,只会参与开发阶段。

  • 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目录中,如果本地安装下载的包带有CLInpm会将它的脚本文件存放在node_modules/bin目录下,直接使用命令npx 命令即可调用。

比如vitewebpack

镜像源

镜像源可以分为官方源、镜像源和私有源三种,npm在下载依赖时,会根据registry地址进行下载依赖,而npmregistry服务器位于国外,可能会受网速影响导致下载缓慢,所以通过切换一个更快的或者地理位置较近的镜像源,比如淘宝提供的镜像源地址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:镜像源管理工具
  • nvmNodejs版本管理工具

版本号

版本号遵循语义化控制,它是由三个部分组成,通常表示为主版本号.次版本号.修订号 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

比较版本大小

编写一个函数,比较两个给定的版本大小,版本号始终遵循语义化控制:

js
// 编写一个函数,比较两个给定的版本大小,版本号始终遵循语义化控制
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查找,如果还没有,就去下载这个包,然后执行命令,执行完毕后删除该包。

常见用途:

  • 测试尚未发布的包
  • 执行本地包
  • 运行一次性命令
shell
# 运行一个本地安装的包的命令
npx <package-name>

# 运行特定版本的包
npx <package-name>@<version>

# 直接运行 GitHub 上的脚本
npx github:<owner>/<repo>

一般会执行创建项目的脚手架命令,比如nestjsnpx nest newreactnpx create-react-app

如果想要编写一个可执行的包,需要在package.json中指定bin字段,指向可执行的脚本文件。

json
{
  "name": "test",
  "version": "1.0.0",
  "bin": {
    "my-cli": "./bin/index.js"  // 定义全局命令与入口文件
  }
}

编写可执行脚本要在文件开头指定Shebang,指定用Nodejs执行

js
#!/usr/bin/env node
// ↑ Shebang 必须,指定用 Node.js 执行

console.log("Hello test pck!");

如有转载或 CV 的请标注本站原文地址