npm install命令都做了哪些事情
npm install
(或其简写 npm i
)是 Node.js 项目中最重要的命令之一,它负责安装项目所需的所有依赖项。下面我将详细解释这个命令的完整执行过程和底层机制,让你彻底理解它背后的工作原理。
一、npm install 的完整工作流程
1. 依赖解析阶段
- 读取 package.json:npm 首先解析项目根目录下的
package.json
文件 - 分析依赖树:
dependencies
:生产环境依赖devDependencies
:开发环境依赖peerDependencies
:宿主环境必须提供的依赖optionalDependencies
:可选依赖(安装失败不中断)
- 检查 lock 文件:
- 优先使用
package-lock.json
(npm 5+) - 或
npm-shrinkwrap.json
(优先级更高) - 没有 lock 文件则使用语义化版本规则解析
- 优先使用
2. 包下载阶段
- 确定安装源:
- 检查
.npmrc
配置 - 默认使用 npm 官方源(https://registry.npmjs.org)
- 私有源如公司内部源
- 检查
- 缓存检查:
- 先在本地缓存目录检查(~/.npm/_cacache)
- 缓存命中直接使用本地包
- 缓存未命中则从远程下载
- 并行下载:
- 使用多线程下载依赖包(.tgz格式)
- 默认最多15个并行下载请求
3. 依赖树构建阶段
- 扁平化处理 (dedupe):
graph TDA[顶级依赖] --> B[依赖A@1.0]A --> C[依赖B@2.0]B --> D[依赖C@3.0]C --> D[依赖C@3.0]
- 将相同依赖提升到顶层(node_modules)
- 避免重复安装相同模块
- 处理版本冲突:
- 不同版本依赖在各自目录下安装:
node_modules/ ├── depA@1.0/ │ └── node_modules/ │ └── depC@3.0/ └── depB@2.0/└── node_modules/└── depC@4.0/
- 不同版本依赖在各自目录下安装:
- 符号链接处理:
- 本地包通过
npm link
创建符号链接
- 本地包通过
4. 模块安装阶段
- 解压缩包:
- 将.tgz包解压到node_modules
- 保持目录结构:
node_modules/└── lodash@4.17.21/├── package.json├── LICENSE└── lib/*.js
- 执行生命周期脚本:
preinstall
install
postinstall
- 二进制链接:
- 将 bin 目录下的可执行文件链接到:
- Windows:
node_modules/.bin/
- Unix-like: 全局路径或项目路径
- Windows:
- 将 bin 目录下的可执行文件链接到:
5. 生成lock文件
- 创建package-lock.json:
{"name": "my-project","version": "1.0.0","lockfileVersion": 2,"requires": true,"packages": {"node_modules/lodash": {"version": "4.17.21","resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz","integrity": "sha512-..." }} }
- 内容包含:
- 精确的依赖版本
- 下载地址和完整性哈希
- 完整的依赖树结构
二、不同场景下的特殊行为
1. 无参数安装
npm install
- 安装 package.json 中的所有依赖
- 使用 package-lock.json 确保一致性
2. 添加新依赖
npm install <package>[@version] [--save|--save-dev]
- 自动更新 package.json
- 更新 package-lock.json
- 安装依赖并执行其生命周期脚本
3. 全局安装
npm install -g <package>
- 安装到全局目录
- Windows:
%APPDATA%\npm
- Unix-like:
/usr/local/lib/node_modules
- Windows:
- 创建全局可执行文件链接
4. 强制安装模式
npm install --force
- 忽略缓存重新下载所有包
- 重建依赖树
5. 生产环境安装
npm install --production
- 仅安装 dependencies
- 跳过 devDependencies
三、npm install 的技术细节
1. 依赖解析算法
- SemVer 解析:
^1.2.3
→ 1.x.x (最新minor/patch)~1.2.3
→ 1.2.x (最新patch)1.2.x
→ 指定minor的最新patch
2. 缓存机制
- 目录结构:
~/.npm/ ├── _cacache/ │ ├── content-v2/ # 包内容 │ └── index-v5/ # 索引信息 └── _logs/ # 安装日志
- 缓存策略:
- 自动清理旧包(npm cache verify)
- 最大缓存空间(默认为10GB)
3. 安全性保障
- 完整性校验:
- 使用 SHA-512 哈希验证包完整性
- 防止下载内容被篡改
- 安全审计:
- 自动运行
npm audit
- 报告已知漏洞
- 自动运行
四、实际应用建议
1. 最佳实践
- 始终提交 lock 文件:
package-lock.json # 或 npm-shrinkwrap.json
- 定期更新依赖:
npm outdated # 检查过期依赖 npm update # 安全更新
2. 故障排除技巧
- 清除缓存:
npm cache clean --force
- 重建依赖:
rm -rf node_modules package-lock.json npm install
- 查看安装过程:
npm install --loglevel verbose
3. 性能优化
- 使用国内镜像源:
npm config set registry https://registry.npmmirror.com
- 预装依赖:
# Dockerfile 示例 COPY package*.json ./ RUN npm ci --only=production
五、与其他工具的区别
特性 | npm install | yarn install | pnpm install |
---|---|---|---|
安装速度 | 中等 | 快 | 非常快 |
磁盘空间 | 大(重复依赖) | 中等 | 小(硬链接) |
lock 文件 | package-lock.json | yarn.lock | pnpm-lock.yaml |
依赖隔离 | 弱 | 中等 | 强 |
兼容性 | 最好 | 好 | 兼容大多数项目 |
了解 npm install
的完整工作原理,能帮助你更高效地管理项目依赖,解决安装问题,并优化项目构建流程。在团队协作中,这些知识尤为重要,可以确保所有开发者使用完全一致的依赖环境。
相关文章:
npm install命令都做了哪些事情
npm install(或其简写 npm i)是 Node.js 项目中最重要的命令之一,它负责安装项目所需的所有依赖项。下面我将详细解释这个命令的完整执行过程和底层机制,让你彻底理解它背后的工作原理。 一、npm install 的完整工作流程 1. 依赖…...

Linux 学习-模拟实现【简易版bash】
1、bash本质 在模拟实现前,先得了解 bash 的本质 bash 也是一个进程,并且是不断运行中的进程 证明:常显示的命令输入提示符就是 bash 不断打印输出的结果 输入指令后,bash 会创建子进程,并进行程序替换 证明&#x…...

【中国・珠海】2025 物联网与边缘计算国际研讨会(IoTEC2025)盛大来袭!
2025 物联网与边缘计算国际研讨会(IoTEC2025)盛大来袭! 科技浪潮奔涌向前,物联网与边缘计算已成为驱动各行业变革的核心力量。在此背景下,2025 物联网与边缘计算国际研讨会(IoTEC2025)即将震撼…...
企业级安全实践:SSL/TLS 加密与权限管理(二)
案例分析:成功与失败的经验教训 成功案例分析 以一家知名电商企业 ABC 为例,该企业每天处理数百万笔订单,涉及大量用户的个人信息、支付信息和商品数据。在网络安全建设方面,ABC 电商高度重视 SSL/TLS 加密与权限管理。 在 SSL…...
Java面试:从Spring Boot到分布式系统的技术探讨
场景一:电商平台的订单处理 面试官: “谢先生,假设我们在一个电商平台工作,你将如何使用Spring Boot构建一个订单处理服务?” 谢飞机: “这个简单,我会使用Spring Boot快速启动项目࿰…...
NodeJS全栈开发面试题讲解——P7 DevOps 与部署和跨域等
✅ 7.1 如何部署 Node.js 项目到生产环境?用过哪些工具? 面试官您好,我部署 Node.js 项目通常分为 构建 → 上传 → 启动服务 三步,常用工具包括 PM2、Nginx、Docker、Git Hooks、CI/CD 工具。 🛠️ 主要部署步骤&…...

中国高分辨率高质量地面CO数据集(2013-2023)
时间分辨率:日空间分辨率:1km - 10km共享方式:开放获取数据大小:9.83 GB数据时间范围:2013-01-01 — 2023-12-31元数据更新时间:2024-08-19 数据集摘要 ChinaHighCO数据集是中国高分辨率高质量近地表空气污…...

GO——内存逃逸分析
一、可能导致逃逸的5中情况 package mainimport "fmt"func main() {f1()f2()f3()f4()f5() }type animal interface {run() }type dog struct{}func (d *dog) run() {fmt.Println("狗在跑") }// 指针、map、切片为返回值的会发生内存逃逸 func f1() (*int,…...

MinVerse 3D触觉鼠标的技术原理与创新解析
MinVerse3D触觉鼠标通过三维交互和触觉反馈技术,彻底颠覆了传统二维鼠标的操作方式。用户在操作虚拟物体时,可以真实感知表面质感、重量和阻力。这种技术不仅为数字环境注入了深度与临场感,还在3D设计、游戏开发和工程仿真等领域展现了广泛潜…...
Spring Boot整活指南:从Helo World到“真香”定律
📌 一、Spring Boot的"真香"本质(不是996的福报) 你以为Spring Boot只是个简化配置的工具?Too young!它其实是程序员的摸鱼加速器。 经典场景还原: 产品经理:“这个…...
Python-Selenium报错截图
报错截图设计方案: 功能:截图层主要用来存放selenium运行时的报错截图信息 1. 截图路径管理 分层存储:在项目根目录下创建 screenshots 文件夹,并按日期进一步分类(如 20250601)。命名规范࿱…...
数论——质数和合数及求质数
质数和合数及求质数 一个大于 1 的自然数,除了 1 和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。其中,质数又称素数。有的资料用的词不同,但质数和素数其实是一回事。 规定 1 既不是质数也不是合数。 …...
nc 命令示例
nc -zv 实用示例 示例 1:测试单个 TCP 端口(最常见) 目标: 检查主机 webserver.example.com 上的 80 端口 (HTTP) 是否开放。 nc -zv webserver.example.com 80成功输出: Connection to webserver.example.com (19…...

乾元通渠道商中标青海省自然灾害应急能力提升工程基层防灾项目
近日,乾元通渠道商中标青海省自然灾害应急能力提升工程基层防灾项目,乾元通作为设备厂家,为项目提供通信指挥类装备(多链路聚合设备)QYT-X1。 青岛乾元通数码科技有限公司作为国家应急产业企业,深耕于数据调…...
Ubuntu取消开机用户自动登录
注:配置前请先设置登录密码,不同显示管理器配置方法不同,可用命令查看:cat /etc/X11/default-display-manager 一、LightDM 显示管理器,关闭 Ubuntu 系统用户自动登录 查找自动登录配置文件,可以看到类似 a…...
用 Spring Boot 静态资源映射 vs 用 Nginx 提供静态文件服务总结
【1】Spring Boot 静态资源映射 vs 用 Nginx 提供静态文件服务 ✅ 简短回答: 在性能、并发能力、缓存控制、安全性等方面,Nginx 完胜。 所以:如果你只是提供静态文件下载(如图片、PDF、Excel 等),强烈推荐…...

openssl-aes-ctr使用openmp加速
openssl-aes-ctr使用openmp加速 openssl-aes-ctropenmp omp for openssl-aes-ctr 本文采用openssl-1.1.1w进行开发验证开发;因为aes-ctr加解密模式中,不依赖与上一个模块的加/解密的内容,所以对于aes-ctr加解密模式是比较适合进行并行加速的…...

PHP+MySQL开发语言 在线下单订水送水小程序源码及搭建指南
随着互联网技术的不断发展,在线下单订水送水服务为人们所需要。分享一款 PHP 和 MySQL 搭建一个功能完善的在线订水送水小程序源码及搭建教程。这个系统将包含用户端和管理端两部分,用户可以在线下单、查询订单状态,管理员可以处理订单、管理…...

计算机网络第1章(上):网络组成与三种交换方式全解析
目录 一、计算机网络的概念二、计算机网络的组成和功能2.1 计算机网络的组成2.2 计算机网络的功能 三、电路交换、报文交换、分组交换3.1 电路交换(Circuit Switching)3.2 报文交换(Message Switching)3.3 分组交换(Pa…...

Android studio进阶开发(七)---做一个完整的登录系统(前后端连接)
我们已经讲过了okhttp和登录系统的使用,我们今天做一个完整的登录系统,后端用springmybatis去做 数据库内容 -- 创建学生信息表 CREATE TABLE student_info (id SERIAL PRIMARY KEY, -- 添加自增主键name VARCHAR(255) NOT NULL,number INT NOT NULL,…...

计算机网络第1章(下):网络性能指标与分层模型全面解析
目录 一、计算机网络的性能指标1.1 性能指标1:速率1.2 性能指标2:带宽1.3 性能指标3:吞吐量1.4 性能指标4:时延1.5 性能指标5:时延带宽积1.6 性能指标6:往返时延1.7 性能指标7:信道利用率 二、计…...

恶意软件清理工具,让Mac电脑安全更简单
你的Mac最近是不是开始表演"电子迷惑行为"?浏览器主页突然变成澳门赌场,风扇转得比直升机螺旋桨还猛......恭喜你!可能中奖获得"恶意软件大礼包"!别慌,今天就教你用恶意软件清理工具化身数字特工…...

HackMyVM-Jabita
信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.43.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-01 05:20 EDT Nmap scan report for 192.168.43.1 Host is up (0.020s latency). MAC Address: C6:45:66:05:91:88 (Unknown) Nmap scan repo…...

112 Gbps 及以上串行链路的有效链路均衡
通道均衡已成为当今高速串行链路的关键机制。目前有许多均衡方案,例如发射机加重均衡、接收机CTLE(连续时间线性均衡器)、FFE(前馈均衡器)、DFE(判决反馈均衡器)和FEC(前向纠错&…...
Mac 版不能连接华为 GaussDB 吗?我看 Windows 版可以连接?
🧑💻 GaussDB 用户 Mac 版不能连接华为 GaussDB 吗?我看Windows 版可以连接。 🧑🔧 官方技术中心 由于 GaussDB 数据库本身未支持 macOS 系统,所以在 macOS 上的 Navicat 中也未支持该数据库。 &…...

Python-13(永久存储)
创建并打开文件 open(file,mode)函数 该函数用于打开一个文件并返回对应的文件对象。 file参数指定的是文件路径和文件名,如果没有添加路径,那么默认将文件创建在python的主文件夹里面。mode参数指定的是打开的模式,r表示读取(…...
《关于有序推动绿电直连发展有关事项的通知》核心内容
《关于有序推动绿电直连发展有关事项的通知》(发改能源〔2025〕650 号)由国家发展改革委和国家能源局于 2025 年 5 月 21 日联合印发,旨在明确绿电直连项目的适用范围、规划引导、运行管理、交易与价格机制以及组织保障等内容。 适用范围与原…...
数据结构-排序(1)
一,排序的基本概念 1.排序的定义 核心概念: 给定一个包含 n 个元素的序列 (R1, R2, ..., Rn) 和一个关键码 Ki(通常是记录 Ri 的一个属性),排序的目标是找到一个排列 (p1, p2, ..., pn),使得关键码序列 (K…...

记录一次session安装应用recyclerview更新数据的bug
首先抛出异常日志,在 先说结论:因为session安装监听是在点击事件里面,所以会保留旧的对象数据 直接上代码,原有的逻辑是点击时执行session安装,并注册监听回调 private fun installApk(position: Int) {val packageIns…...

大数据-274 Spark MLib - 基础介绍 机器学习算法 剪枝 后剪枝 ID3 C4.5 CART
点一下关注吧!!!非常感谢!!持续更新!!! 大模型篇章已经开始! 目前已经更新到了第 22 篇:大语言模型 22 - MCP 自动操作 FigmaCursor 自动设计原型 Java篇开…...