臭名昭著aTrust隔离计划1.臭名昭著aTrust隔离计划2.VPN原理与aTrust隔离网络实践3.docker-easyconnect到底做了什么4.TUN(tunnel-隧道-虚拟网卡)模式
个人项目
personal(个人展示)GitHub Actions 自动部署个人展示项目
基于Quartz搭建的个人博客1.Quartz个人博客使用教程2.使用 rsync 增量部署 Quartz 博客3.使用 GitHub Actions 自动部署 Quartz 博客5.域名绑定6.CDN加速7.Google 搜索收录排查:为什么关键词搜得到别人,却搜不到我的网站?Obsidian、双向链接与知识图谱
架构设计
分布式分布式事务RPC原理
旅行
行程攻略青岛三日游行程攻略
前端
NginxNginx配置与反向代理入门
Nodenpm与npx的区别
数据库
mysql01.MySQL基础语法与约束02.MySQL数据库类型03.MySQL多表查询04.MySQL 索引05.MySQL 事务06.MySQL 隔离级别07.MySQL MVCC08.MySQL 锁09.EXPLAIN10.慢查询与 SQL 优化
mysql面试题01.索引问题02.事务与隔离级别03.锁机制04.存储引擎与性能优化05.用户权限、字符集与备份恢复
mysql实战01.EXPLAIN实战02.测试环境菜单误删排查与恢复03.MySQL IN 详解
网络
网络安全1.无线监听网卡苹果M系列虚拟机安装Kali Linux教程3.kali怎么使用RTL8812AU4.kali基础命令
网络基础进程之间怎样通过网络传递数据
网址常用网址
中间键
esElasticsearch 入门
mq
RabbitMQRabbitMQ高级RabbitMQ基础
1. MQ 基础2. MQ 核心角色与代码对应3. MQ Consumer Group 与消费模式4. SOFAMQ 账户变更代码实践5. MQ 可靠性问题6. 消息幂等
redis缓存击穿、穿透与雪崩Redis 分布式锁Redis 缓存问题Redis 数据结构
AI
使用说明
第三方插件&技能简介Archify使用与安装指南geekgeekRun使用OfferFlow使用指南Ponytail使用指南Skills Manager使用指南
CodexCodex CLI与IDE区别及使用指南Codex Hook单独配置与提交通知Codex MCP安装与使用指南Codex第三方插件安装与使用指南
Agent开发0-学习路线1.LLM、Token、上下文窗口与模型参数2.大模型 API、请求参数与响应结构3.Spring AI ChatClient4.Prompt、System Prompt、Prompt 模板6.结构化输出、JSON Schema7.SSE 流式响应8.会话 ID、聊天记录、Redis9.超时、重试、限流、降级10.*完成可运行聊天接口11.Function Calling、Tool Calling 原理12.用 Java 方法定义 Tool13.工具参数设计和校验14.实现订单查询工具15.实现物流查询工具16.实现库存查询工具17.多个工具自动选择18.工具异常、超时、重试
diy主机
主机零件学习1.CPU2.主板3.内存4.显卡5.硬盘6.散热7.风扇8.机箱热门型号价格表
捡垃圾diy-13600kf+5060diy-14600kf+5070
English高频词汇英文基础语法简单句子音标
GitGit常用命令Sublime Merge 使用指南
Java
工具库Caffeine本地缓存Reactor教程
工作实践如何使用@Async线程池使用与排查线上服务 CPU 使用率过高排查压测下RPC接口大量失败排查记录
基础1.HashMap2.ConcurrentHashMap3.HashSet4.final5.static6.volatile7.AtomicInteger8.String动态代理反射锁与线程同步线程注解
面试题1.HashMap 存储在方法内是线程安全的吗2.ArrayList参数传递与引用重新赋值3.== 和 equals 的区别、hashcode4.重载和重写的区别5.String、StringBuffer、StringBuilder区别及使用场景6.接口和抽象类7.ArrayList 与 LinkedList 的区别和扩容机制8.HashMap 和 Hashtable 的区别及底层实现9.Object 和 Objects 的区别10.ThreadLocal的原理和使用场景11.字节码是什么及作用12.Java类加载器有哪些13.双亲委派模型14.Java异常体系15.GC是什么16.GC如何判断对象可以被回收
面试总结0.HR面试模板1.面试一2.面试二3.面试三笔试
网络与 IO(黑马程序员-纯理论)01-网络编程基础02-IO模型与零拷贝03-BIO04-NIO基础与缓冲区05-NIO通道与选择器06-AIO
juc00-目录01-进程与线程02-线程同步与通信03-并发设计模式04-Java内存模型05-CAS与原子类06-ThreadLocal07-阻塞队列08-线程池使用与原理09-任务调度10-ForkJoin与享元模式11-AQS12-ReentrantLock13-读写锁14-并发协作工具15-ConcurrentHashMap16-CopyOnWrite与同步容器17-SkipListMap18-非阻塞队列
juc(工作常见)Java并发编程三个重点拆解
jvm1. JVM运行时数据区
Spring1.Spring IoC、DI与构造方法注入CGLIB、Byte Buddy 与 Spring AOPSpring 常用注解详解Spring Bean 生命周期
Spring MVC异常处理机制
linux常用命令
mac快捷键终端常用操作
python
基础01.Python是什么,为什么要安装Python02.Python项目中.venv是什么03.Python基础语法
基础实战sql替换
HTTPXHRMS员工详情接口调用(Python HTTPX)
windowswindows激活

npm 与 npx 的区别

一、一句话理解

npm 主要负责管理 Node.js 项目中的软件包;npx 主要负责临时运行某个软件包提供的命令。简单说:npm 管理工具,npx 运行工具。

二、理论:npm 和 npx 是什么

2.1 npm 是什么

npm 是 Node.js 生态中最常用的包管理工具。它可以连接 npm Registry,帮助我们:

  • 安装项目依赖;
  • 卸载和更新依赖;
  • 管理 package.json;
  • 执行项目脚本;
  • 管理依赖版本和锁文件。

例如:

npm install axios

这条命令会把 axios 安装到当前项目,并通常更新 package.json 和锁文件。

2.2 npx 是什么

npx 是 npm 提供的命令执行器,用来运行 npm 包中的 CLI 命令。

例如:

npx prettier . --write

它会寻找或准备 prettier 命令,然后执行格式化操作。

现代 npm 中,npx 与 npm exec 是同一类能力的不同入口。npx 更适合直接在终端中使用,npm exec 更适合写进脚本或需要明确控制参数解析的场景。npm 官方文档

2.3 两者的关系

可以把它们理解成一套工具中的两个角色:

npm 负责下载、安装、升级和管理软件包
                         ↓
npx 负责找到并运行软件包提供的命令

npx 通常会优先使用当前项目中已经存在的命令;如果本地没有,可能从 npm Registry 下载到缓存中再运行,不一定永久安装到项目或系统中。

三、理论:npm 和 npx 是怎么工作的

3.1 npm 的基本工作方式

当执行:

npm install prettier

大致会发生以下事情:

  1. 查询并下载 prettier 包。
  2. 把包放入当前项目的 node_modules。
  3. 将依赖信息写入 package.json。
  4. 更新 package-lock.json 或其他锁文件。
  5. 以后项目可以直接复用这份依赖。

3.2 npx 的基本工作方式

当执行:

npx prettier . --write

大致会发生以下事情:

  1. 查找当前项目是否已经安装 prettier。
  2. 如果存在,优先运行项目中的版本。
  3. 如果不存在,根据命令需要准备可执行包。
  4. 把命令行参数传给 prettier。
  5. 执行完成后,不要求把工具作为项目依赖永久保存。

因此,npx 适合一次性运行、快速试用或不想污染当前项目依赖的工具。

3.3 命令中的参数属于谁

这是使用 npx 时最容易混淆的地方:

npx -y skills add tt-a1i/archify -g

可以拆成:

部分所属作用
npxnpm运行命令行工具
-ynpx下载工具时自动确认
skillsnpx 要运行的工具Skills 命令行工具
addskills安装 Skill 的子命令
tt-a1i/archifyskills要安装的 GitHub 仓库
-gskills全局安装 Skill

这里最后的 -g 不是 npx 的全局安装参数,而是 skills add 的参数。

四、实践:npm 常用命令

4.1 安装项目依赖

npm install

按照 package.json 和锁文件安装项目依赖。

4.2 安装一个依赖

npm install axios

安装运行时依赖。

安装开发依赖:

npm install --save-dev eslint

也可以写成:

npm install -D eslint

4.3 执行 package.json 脚本

假设 package.json 中有:

{
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "test": "vitest"
  }
}

执行脚本:

npm run dev
npm run build
npm test

4.4 查看和更新依赖

npm list
npm outdated
npm update

这些命令分别用于查看依赖树、检查过期依赖和更新依赖。

五、实践:npx 常用命令

5.1 运行项目中的工具

npx eslint src
npx prettier . --write
npx vitest

如果项目已经在 devDependencies 中安装了这些工具,npx 通常会优先使用项目版本。

5.2 创建一个新项目

npx create-vite@latest my-app

含义是:运行 create-vite 的最新版本,并创建名为 my-app 的项目。

5.3 临时运行 TypeScript 工具

npx tsx app.ts

这会运行 tsx,让它执行 app.ts。

5.4 固定工具版本

npx prettier@3.6.2 . --write

@3.6.2 表示使用指定版本,而不是任意版本。

5.5 自动确认下载

npx -y skills add tt-a1i/archify -g

-y 或 --yes 表示:如果 npx 需要准备命令行工具,不再询问是否确认。

六、最小例子:用 npx 安装 archify Skill

6.1 archify 是什么

archify 是一个第三方 Agent Skill,可以帮助 Codex 生成架构图、工作流图、时序图、数据流图和生命周期图。

它不是直接由 Codex /plugins 浏览器安装的完整 Plugin,而是通过 skills 命令行工具安装的第三方 Skill。

6.2 全局安装

npx skills add tt-a1i/archify -g

这里的执行链路是:

npx
  ↓
运行 skills 命令行工具
  ↓
skills add
  ↓
下载 tt-a1i/archify
  ↓
安装到全局 Skill 目录

安装完成后,重新启动 Codex 或新建会话,然后提出任务:

分析当前仓库,然后使用 archify 创建一张高层运行时架构图。
展示核心组件、主要调用路径、外部依赖和信任边界。

6.3 临时试用

如果只想试用,不想进行永久安装:

npx skills use tt-a1i/archify@archify --agent codex

这条命令同样使用 npx 运行 skills,但调用的是 use 子命令,而不是 add。

6.4 这条命令为什么不用 npm install

也可以先把 skills 命令行工具安装到全局,再使用它:

npm install -g skills
skills add tt-a1i/archify -g

但一次性使用时,npx skills ... 更简洁,因为不需要先把 skills 工具永久安装到系统中。

七、npm 和 npx 的区别

对比项npmnpx
核心作用管理软件包和项目依赖运行软件包提供的命令
是否强调安装是不一定永久安装
常见对象项目依赖、开发依赖、脚本CLI 工具、脚手架、一次性命令
是否修改 package.json安装依赖时通常会通常不会
常见命令npm install、npm runnpx prettier、npx create-vite
适合场景项目长期使用某个包临时运行或快速试用工具

八、如何选择

8.1 项目长期依赖一个工具

使用 npm:

npm install --save-dev prettier

然后在项目脚本或命令中使用:

npx prettier . --write

这样可以固定项目使用的 Prettier 版本。

8.2 只想快速试用一个工具

使用 npx:

npx create-vite@latest demo

8.3 想保存一套项目命令

使用 npm 的 scripts:

{
  "scripts": {
    "format": "prettier . --write"
  }
}

执行:

npm run format

8.4 想安装第三方 Skill

按照 Skill 项目 README 提供的命令执行。例如 archify:

npx skills add tt-a1i/archify -g

不能因为命令中出现 npx,就认为所有 npx 命令都是安装操作。npx 只负责运行后面的工具,具体是安装、创建项目还是生成文件,取决于后面的子命令。

九、常见误区

9.1 误以为 npx 等于 npm install

两者不是一回事:

npm install prettier

重点是把 Prettier 安装为项目依赖;

npx prettier . --write

重点是运行 Prettier 命令。

9.2 误以为每个 npx 都是临时的

npx 是命令执行入口。后面的工具可能会创建项目、写入文件、安装依赖或修改系统配置。是否产生持久化变化,取决于后面的命令。

9.3 误以为 -g 总是 npx 的参数

例如:

npx skills add tt-a1i/archify -g

这里的 -g 属于 skills add;它表示 Skill 全局安装,不表示 npx 全局安装。

9.4 直接运行来源不明的 npx 命令

npx 可能从网络准备并运行软件包。执行陌生命令前,应先检查 npm 包、GitHub 仓库、版本和它会运行的脚本。

十、总结

10.1 一句话总结

npm 负责管理 Node.js 软件包,npx 负责运行软件包提供的命令;命令最终做什么,要看 npx 后面的工具和子命令。

10.2 记忆方法

npm install  → 把工具装进项目
npm run      → 执行项目脚本
npx          → 直接运行某个工具
npx -y       → 运行时自动确认

10.3 官方参考资料