Back

NPM vs NPX:掌握 Node.js 中的现代包执行方式

NPM vs NPX:掌握 Node.js 中的现代包执行方式

即使是经验丰富的 JavaScript 开发者,在决定使用 npm 还是 npx 命令时有时也会犹豫。这种困惑持续存在,因为这两个工具虽然一起发布、处理相同的包,但在现代 Node.js 工作流程中却有着根本不同的用途。

理解何时使用 Node Package Manager(Node 包管理器)与 Node Package Execute(Node 包执行器)可以节省数小时的调试时间,减少项目臃肿,并简化你的开发流程。让我们彻底弄清楚这些 JavaScript 工具。

核心要点

  • npm 永久管理和安装项目依赖,而 npx 无需安装即可执行包
  • 对项目需要反复使用的核心依赖使用 npm
  • 对一次性命令、CLI 工具和测试不同包版本使用 npx
  • 有效结合这两个工具可以创建更清洁的项目和更轻量的开发环境

npm 的作用:你的依赖基础

**npm(Node Package Manager,Node 包管理器)**管理你项目的依赖——它安装、更新和跟踪应用程序运行所需的包。当你运行 npm install 时,包会被下载到 node_modules 并记录在 package.json 中。

# Installing dependencies
npm install express
npm install -g typescript

# Running scripts defined in package.json
npm run build
npm test

可以把 npm 想象成你项目的图书管理员——它记录你需要什么,获取它,并保持一切井然有序。每个包都会成为你项目(本地)或系统(全局)的永久组成部分。

npx 的作用:无需安装即可执行

**npx(Node Package Execute,Node 包执行器)**无需永久安装即可运行包。它在 npm 5.2.0 中引入,可以执行来自 npm 注册表或本地 node_modules/.bin 目录的二进制文件。

# Run without installing
npx eslint src/
npx typescript --version

# Execute specific package versions
npx node@14 index.js

这种以执行为中心的方法保持系统清洁,并确保你始终运行预期的版本。

实际用例:各工具的优势场景

使用 npm 进行依赖管理

在构建应用程序时,npm 处理你的核心依赖:

# Setting up a new project
npm init -y
npm install react react-dom
npm install --save-dev vite @types/react

这些包成为项目基础的一部分,在 package.json 中跟踪,每次构建都需要。

使用 npx 执行一次性命令

现代 JavaScript 开发涉及许多单次使用的 CLI 工具。无需让全局安装变得混乱:

# Project scaffolding
npx create-vite@latest my-app --template react
npx create-next-app@latest

# Running formatters and linters
npx prettier --write .
npx eslint --fix src/

# Testing different versions
npx typescript@4.9 --version
npx typescript@5.0 --version

无需承诺即可测试包版本

需要测试预发布版本或比较不同版本的行为?npx 在这方面表现出色:

# Test beta versions
npx vite@beta build

# Run specific Node versions
npx node@18 --version
npx node@20 server.js

# Try experimental features
npx @angular/cli@next new test-app

这种方法可以防止版本冲突并保持全局命名空间清洁。

现代工作流最佳实践

有效结合两个工具

// package.json
{
  "scripts": {
    "dev": "vite",
    "lint": "eslint src/",
    "format": "prettier --write ."
  },
  "devDependencies": {
    "vite": "^5.0.0",
    "eslint": "^8.50.0",
    "prettier": "^3.0.0"
  }
}

使用 npm 在本地安装开发工具,然后团队成员可以通过 npm 脚本或 npx 运行它们:

# Team member A (uses npm scripts)
npm run lint

# Team member B (prefers direct execution)
npx eslint src/

安全注意事项

在使用 npx 执行之前,始终验证包,特别是来自未知来源的包:

# Check package details first
npm view suspicious-package

# Use --no-install to prevent auto-installation
npx --no-install known-package

# Specify exact versions for production scripts
npx typescript@5.3.3 --build

CI/CD 流水线集成

npx 在持续集成中表现出色,你需要一致的、隔离的执行:

# GitHub Actions example
- name: Type Check
  run: npx typescript --noEmit
  
- name: Run Tests
  run: npx jest --coverage

结论

npm 和 npx 在 Node.js 包管理中扮演互补的角色。使用 npm 构建项目的依赖基础——安装、跟踪和管理你将反复使用的包。使用 npx 按需执行包——运行 CLI 工具、测试版本或搭建项目脚手架,无需永久安装。

掌握这两个工具,你将编写更清洁的 package.json 文件,维护更轻量的开发环境,并更高效地执行 JavaScript 工具。你未来的自己(以及你的团队)会感谢你将全局安装保持在最低限度并明确项目依赖。

常见问题

可以,npx 首先检查本地的 node_modules/.bin 目录,然后才下载。如果包存在于本地,npx 将使用该版本,除非你使用 @ 语法指定不同版本,如 npx package@version。

不是,npx 会临时缓存下载的包。它首先检查缓存,然后是本地 node_modules,只有在两者都不包含请求的包时才从注册表下载。缓存会定期清理。

不一定。对于你在所有项目中每天使用的工具(如 typescript 或 nodemon),保留全局安装。对偶尔使用的工具、项目生成器以及测试不同版本时使用 npx。

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay