npm(Node Package Manager)——Node.js 平台的标准包管理器,随 Node.js 安装包提供。npm 管理 JavaScript 和 TypeScript 项目的依赖关系:在 node_modules 中安装库、更新包版本、解决版本冲突。package.json ——包含元数据和依赖列表的中央配置文件。npm Registry ——最大的包注册中心。更多信息请访问 npm Registry。
要点
npm 于 2010 年由 Isaac Schlueter 创建,作为管理 Node.js 依赖关系的解决方案。自 2014 年起,npm 由 npm, Inc. 公司管理,该公司于 2020 年被 Microsoft/GitHub 收购。该工具由两部分组成:用于安装和管理包的 CLI(命令行)以及 Registry ——位于 registry.npmjs.org 的所有已发布模块的中央存储库。
npm Registry ——最大的包注册中心:超过 200 万个包,每月超过 100 亿次下载。每个包都有 SemVer 版本、描述、依赖关系、许可证和作者信息。发布自己的包通过 npm publish 完成。npm 支持组织的范围包(@scope/package)、私有注册中心和内置安全审计。
Node.js 18+ 版本包含 npm 9+,具有改进的性能、用于多仓库的 workspaces 和重新设计的 peer dependencies 机制。npm 生态系统涵盖服务器端 JavaScript、前端(React、Vue、Angular)、移动开发(React Native)、构建工具(Webpack、Vite)和 CLI 实用程序。npm 是 JavaScript 库的主要分发渠道。
npm install ——主命令,读取 package.json 和 package-lock.json 以将所有依赖安装到 node_modules。首次运行时,npm 计算依赖图,解决版本冲突并生成 package-lock.json。npm install <package> 命令安装特定包;--save-dev 标志添加到 devDependencies,--global ——全局安装。
npx ——包执行器,从 npm 5.2 版本开始包含。npx 允许在无需全局安装的情况下运行 CLI 实用程序:npx react-native init 或 npx create-react-app my-app。npx 将包下载到临时缓存中运行,完成后清除。npx 也适用于运行特定版本的工具。
npm audit 扫描依赖树以查找来自 npm 数据库的已知漏洞。该命令显示带有严重级别(critical、high、moderate)的报告,并建议 npm audit fix 以自动更新易受攻击的包。npm cache 在本地存储下载的包。npm cache clean --force 在安装出现问题时清除缓存。npm outdated 显示过时的包。
# npm 主要命令
$ npm install
$ npm install react-native-webview --save
$ npm install typescript --save-dev
# 无需全局安装运行
$ npx react-native init MyApp
# 安全审计
$ npm audit --fix
package.json ——是项目根目录中的一个 JSON 文件,描述其元数据、依赖关系和配置。必填字段:name(包的唯一名称)和 version(SemVer 版本,例如 1.0.0)。该文件通过 npm init -y 命令快速初始化或手动创建。
Semantic Versioning(SemVer)——MAJOR.MINOR.PATCH 版本控制标准。主版本在 API 不兼容更改时更改,次版本在添加功能时更改(向后兼容),补丁在修复错误时更改。版本前的 ^ 符号允许更新次版本和补丁版本,~ 仅允许补丁版本。
{
"name": "my-app",
"version": "1.0.0",
"private": true,
"scripts": {
"start": "expo start",
"android": "expo start --android",
"ios": "expo start --ios"
},
"dependencies": {
"react": "^18.3.0",
"react-native": "^0.76.0"
},
"devDependencies": {
"typescript": "^5.5.0",
"@types/react": "^18.3.0"
}
}
| 字段 | 用途 | 示例值 |
|---|---|---|
| scripts | 用于 npm run 的运行命令 | "start": "node index.js" |
| dependencies | 应用程序的生产依赖 | "react": "^18.3.0" |
| devDependencies | 开发和测试工具 | "jest": "^29.7.0" |
| peerDependencies | 库的主机依赖 | "react": ">=17.0.0" |
| engines | Node.js 版本要求 | {"node": ">=18.0.0"} |
React Native 项目积极使用 npm 管理依赖。标准套件包括 react、react-native、导航库(React Navigation)、HTTP 请求(axios)、状态管理(Redux、Zustand)和 UI 组件。npm 允许从注册中心安装数千个兼容包。
npx pod-install ——在 React Native 中为 iOS 安装原生模块后的必需命令。npm 根据 package-lock.json 自动生成 Podfile.lock。在 Expo 项目中,使用 expo install 代替 npm install,因为它选择与当前 Expo SDK 版本兼容的版本。
版本冲突 ——React Native 中的常见问题:react-native-reanimated、react-native-gesture-handler 和 react-native-safe-area-context 需要协调的版本。解决方案 ——将所有包更新到最新的兼容版本或使用 --legacy-peer-deps。package-lock.json 对于通过 CocoaPods 和 Gradle 编译的原生模块至关重要。
npm ——随 Node.js 提供的标准包管理器。主要替代品:yarn(由 Facebook 于 2016 年创建)和 pnpm(快速,使用硬链接)。从 npm 5 开始,npm 和 yarn 之间的速度和功能差异微乎其微。npm 7+ 添加了 workspaces,使其对多仓库具有竞争力。
| 特性 | npm | yarn | pnpm |
|---|---|---|---|
| 创建年份 | 2010 | 2016 | 2017 |
| 锁定文件 | package-lock.json | yarn.lock | pnpm-lock.yaml |
| 安装 | 顺序(npm 5+) | 并行 | 并行 |
| 磁盘空间 | 标准 | 标准 | 最小(链接) |
| Workspaces | 是(npm 7+) | 是 | 是 |
| Plug'n'Play | 否 | 是 | 否 |
根据 State of JS 2025:62% 的开发者使用 npm,yarn ——35%(主要是旧项目和 PnP 爱好者),pnpm ——3%。对于 React Native 项目,两种工具相当,但 npm 在 Expo SDK 50+ 项目和新 React Native 初始化中更常见。
yarn 由于更成熟的 workspaces 和 Plug'n'Play 实现,在超大多仓库(100+ 个包)中保持优势。pnpm 通过指向全局存储的硬链接在磁盘空间节省方面胜出。管理器的选择取决于团队偏好和基础设施。
常见问题
npm install 更新 package-lock.json,并可以在语义范围内安装新的次版本。npm ci(Clean Install)删除 node_modules 并严格根据 package-lock.json 安装包而不更新它。npm ci 更快,用于 CI/CD,并确保所有机器上环境一致。如果缺少 package-lock.json,npm ci 会返回错误。
从 npm 7 开始,peer dependencies 冲突会导致构建错误。解决方案:通过 npm update 将所有包更新到兼容版本,使用 --legacy-peer-deps 标志进入 npm 6 模式,或在 package.json 中添加 overrides 部分以强制锁定特定包的版本。最佳方案 ——将依赖更新到兼容版本。
npm audit 扫描依赖树以查找来自 npm Security Advisory 数据库的已知漏洞。该命令显示带有严重级别(critical、high、moderate、low)的报告,并建议 npm audit fix 以自动将易受攻击的包更新到安全版本。定期运行 npm audit ——JavaScript 项目的基本安全实践。
npm workspaces 允许在单个存储库中管理多个包。在根 package.json 中添加 "workspaces": ["packages/*"] 字段。优势:所有依赖统一安装到共享的 node_modules、本地包之间自动符号链接、从根目录为所有包运行脚本、消除版本重复。
package-lock.json 锁定所有依赖及其传递包的精确版本。没有它,不同的开发者和 CI 服务器可能会在语义范围内获得不同的库版本,导致「在我的机器上能运行」的错误。提交锁定文件可确保可重现的构建和所有环境中一致的行为。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。