深入理解 pnpm(Performant NPM) 的实现原理及其与 npm 的区别

news2024/12/22 19:53:50

深入理解 pnpm 的实现原理及其与 npm 的区别

在 JavaScript 生态系统中,包管理器是开发者日常工作中不可或缺的工具。npm(Node Package Manager)作为 Node.js 的默认包管理器,已经广泛应用于各种项目中。然而,随着项目规模的扩大和依赖管理需求的增加,pnpm 作为一个高效、节省磁盘空间的包管理器,逐渐受到开发者的关注。本文将深入探讨 pnpm 的具体实现原理,并详细比较其与 npm 的区别,帮助你更好地理解和选择适合你项目的包管理器。

1. 内容寻址存储(Content-Addressable Storage)

pnpm 采用内容寻址存储(Content-Addressable Storage)机制,将每个包的内容存储在一个全局的存储区中,通常位于用户主目录下的 ~/.pnpm-store。每个包根据其内容生成唯一的哈希值作为存储路径,这意味着相同内容的包只会存储一次,无论被多少项目使用。

优点

  • 去重存储:多个项目共享相同版本的包,节省磁盘空间。
  • 快速访问:通过哈希值直接定位包,减少查找时间。

2. 全局存储区与符号链接(Symlinks)

在安装依赖时,pnpm 不会将包直接复制到项目的 node_modules 目录中,而是通过符号链接(symlinks)将全局存储区中的包链接到项目中。这种方式不仅节省了磁盘空间,还加快了安装速度。

工作流程

  1. 下载与存储:首次安装某个包时,pnpm 将其下载并存储在全局存储区。
  2. 链接到项目:项目的 node_modules 目录中会创建指向全局存储区的符号链接,指向所需的包。

3. 严格的依赖解析(Strict Dependency Resolution)

pnpm 采用严格的依赖解析策略,确保每个包只能访问其明确声明的依赖。这有助于减少依赖冲突和隐式依赖问题,提升项目的可靠性。

特点

  • 避免隐式依赖:如果包 A 依赖包 B,而包 B 依赖包 C,包 A 无法直接访问包 C,除非包 A 也明确声明依赖包 C。
  • 依赖隔离:不同版本的依赖可以在同一项目中共存,不会相互干扰。

4. 高效的缓存机制

pnpm 利用全局存储区作为缓存,避免了重复下载和存储相同的包。这种缓存机制不仅加快了依赖安装速度,还减少了网络带宽的占用。

缓存策略

  • 全局缓存:所有项目共享全局存储区中的包,确保相同包只下载一次。
  • 增量更新:仅下载和更新变化的包,减少不必要的网络请求。

5. 并行安装与性能优化

pnpm 在安装依赖时,采用并行下载和处理的策略,充分利用多核 CPU 的能力,显著提升安装速度。此外,pnpm 还优化了磁盘 I/O 操作,减少了安装过程中的瓶颈。

优化措施

  • 并行下载:同时下载多个包,缩短总安装时间。
  • 优化 I/O:减少磁盘读写次数,提高数据传输效率。

6. 工作空间与 Monorepo 支持

pnpm 内置了对工作空间(Workspaces)的支持,适用于管理 Monorepo(单仓库多包)项目。通过工作空间,多个包可以在同一仓库中协同开发,共享依赖,并通过符号链接实现高效的依赖管理。

功能

  • 统一依赖管理:共享和集中管理依赖,避免重复安装。
  • 交叉依赖处理:不同包之间的依赖关系由 pnpm 自动处理,确保一致性。
  • 统一脚本运行:在根目录下运行命令,自动应用到所有工作空间包。

7. 锁文件与确定性安装

pnpm 使用 pnpm-lock.yaml 作为锁文件,记录具体的依赖版本和解析路径,确保在不同环境中的安装一致性。pnpm 的锁文件支持更细粒度的依赖描述,结合其内容寻址存储机制,实现高度确定性的安装过程。

特点

  • 版本锁定:锁定每个依赖的具体版本,避免版本漂移。
  • 确定性:确保在任何环境下安装的依赖结构完全一致。

8. 完整性校验(Integrity Checks)

pnpm 在安装过程中,会对下载的包进行完整性校验,确保包内容未被篡改,保障项目的安全性。通过哈希值验证包的完整性,防止恶意代码注入。

校验机制

  • 哈希校验:使用 SHA-512 等哈希算法验证包内容。
  • 安全保障:防止包在传输过程中被篡改,提高安全性。

9. CLI 与扩展性

pnpm 提供了一套丰富的命令行接口(CLI),支持所有常见的包管理操作,如安装、更新、卸载、发布等。此外,pnpm 还支持插件和钩子(hooks),允许开发者扩展其功能,适应不同项目的需求。

常用命令

  • pnpm install:安装项目依赖。
  • pnpm add <package>:添加新依赖。
  • pnpm remove <package>:移除依赖。
  • pnpm update:更新依赖。

扩展性

  • 钩子支持:在特定事件触发时执行自定义脚本。
  • 插件系统:通过插件扩展 pnpm 的功能,如支持不同的包解析协议等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2201140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

略谈发展测量方法论-高敏雪老师的文章解读与收获

历史地看&#xff0c; GDP 被誉为“世纪性发明”&#xff0c;我们曾经将其视为衡量一国经济发展的重要工具&#xff1b;现实地看&#xff0c;“超越 GDP”是当前出现的带有国际性的口号&#xff0c;内在地包含着对 GDP作为发展指标的批评和替代。 如何看到发展&#xff1f; 如…

apisix云原生网关

定义 企业级网关通过域名、路由将请求分发到对应的应用上&#xff0c;通常承载数千个服务的流量&#xff0c;对稳定性有较高要求。 CNCF全景图 选型 Kubernetes抽象出两个核心概念&#xff1a;Service&#xff0c;为多个Pod提供统一的访问入口&#xff1b;Ingress&#xff…

【STM32-HAL库】实现微秒、毫秒、纳秒延时。(STM32F4系列)(附带工程下载链接)

使用了本代码后不能使用HAL库自带的HAL_Delay函数 使用了本代码后不能使用HAL库自带的HAL_Delay函数 使用了本代码后不能使用HAL库自带的HAL_Delay函数 一、新建工程 可以参考我的新建工程系列教程 stm32-HAL库cubeMX新建工程教程&#xff08;以F103C8T6为例&#xff09;ht…

【长文梳理webserver核心】核心类篇

前言 有三个核心组件支撑一个reactor实现 [持续] 的 [监听] 一组fd&#xff0c;并根据每个fd上发生的事件 [调用] 相应的处理函数。这三个组件就是 EventLoop 、Channel 以及 Poller 三个类&#xff0c;其中 EventLoop 可以看作是对业务线程的封装&#xff0c;而 Channel 可以看…

从零开始搭建一个node.js后端服务项目

一、下载node.js及配置环境 网上很多安装教程&#xff0c;此处就不再赘述了 版本信息 C:\Users\XXX>node -v v20.15.0C:\Users\XXX>npm -v 10.7.0 二、搭建node.js项目及安装express框架 在任意位置创建一个项目文件夹&#xff0c;此处项目文件夹名为test&#xff0…

右键菜单添加cmd

regedit 计算机\HKEY_CLASSES_ROOT\Directory\Background\shell\命令提示符\command 数据&#xff1a;cmd.exe /s /k title 命令提示符 或软件商店安装 Windows Terminal

基于element-ui的upload组件与阿里云oss对象存储的文件上传(采用服务端签名后直传的方式)

服务端签名后直传图解 步骤 1 开通阿里云OSS对象存储服务&#xff0c;创建新的Bucket 2 创建子账户获取密钥 创建用户 添加权限 后端 1 新建一个第三方服务的模块 third-party pom文件 <?xml version"1.0" encoding"UTF-8"?> <project x…

HAL+M4学习记录_3

一、HAL库开发框架 记录HAL学习过程 1.1 CMSIS CMSIS&#xff08;Cortex微控制器软件接口标准&#xff09;&#xff0c;用于提供用户和硬件间的接口&#xff0c;用户通过CMSIS标准对Cortex微控制器内部寄存器单元进行读写 1.2 HAL库 HAL&#xff08;硬件抽象层&#xff09;为…

加固与脱壳04 - 一些简单的脱壳方法

这里只讨论一些简单壳的脱壳方法及其原因。 FRIDA-DEXDump https://github.com/hluwa/FRIDA-DEXDump 适用于不需要研究那些被强保护起来的代码&#xff0c;只是想单纯的看看某个地方的业务逻辑。 原理&#xff1a; 对于完整的 dex&#xff0c;采用暴力搜索 dex035&#xf…

云栖实录 | Hologres3.0全新升级:一体化实时湖仓平台

本文根据2024云栖大会实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a; 姜伟华 | 阿里云智能集团资深技术专家、Hologres 负责人 丁 烨 | 阿里云智能集团产品专家、Hologres 产品负责人 活动&#xff1a; 2024 云栖大会 - 商用大数据计算与分析平台论…

基于Arduino的超声波和舵机模块集成使用

一.超声波模块和舵机模块集成使用 超声波模块&#xff1a;HC-SR04舵机模块&#xff1a;SG90目的&#xff1a;通过Arduino UNO核心板控制舵机旋转到不同位置&#xff0c;同时获取不同位置超声波模块和障碍物间的距离&#xff0c;配合控制算法&#xff0c;进行基于超声波智能避障…

需求10——通过改一个小bug来学习如何定位问题

在浏览我之前完成的一些小需求时&#xff0c;我发现了一个非常有价值的需求。这个需求可以让我深入了解系统中关于故障上报的功能。通过完善这个需求&#xff0c;我能够全面掌握整个故障上报的流程。 这个需求主要是关于故障上报流程中出现的问题。当前的流程如下&#xff1a;…

ML 系列:机器学习和深度学习的深层次总结(16) — 提高 KNN 效率-使用 KD 树和球树实现更快的算法

一、说明 在机器学习系列的第 16 节&#xff0c;我们重点介绍了提高 K 最近邻 &#xff08;KNN&#xff09; 算法的效率&#xff0c;这是一种广泛用于分类和回归任务的方法。虽然 KNN 简单有效&#xff0c;但对于大型数据集来说&#xff0c;其计算成本可能会令人望而却步。为了…

基于SpringBoot问卷调查系统小程序【附源码】

基于SpringBoot问卷调查系统小程序 效果如下&#xff1a; 管理员登录界面 管理员功能界面 调查人管理界面 问卷调查管理界面 问卷题目管理界面 用户登录界面 APP首页界面 公告信息界面 研究背景 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&…

组织病理学图像中的再识别|文献速递--基于多模态-半监督深度学习的病理学诊断与病灶分割

Title 题目 Re-identification from histopathology images 组织病理学图像中的再识别 01 文献速递介绍 在光学显微镜下评估苏木精-伊红&#xff08;H&E&#xff09;染色切片是肿瘤病理诊断中的标准程序。随着全片扫描仪的出现&#xff0c;玻片切片可以被数字化为所谓…

怎么在单片机裸机程序中移植EasyLogger?

1、介绍 EasyLogger 是一款超轻量级、高性能的C日志库&#xff0c;非常适合对资源敏感的软件项目。例如&#xff1a;IoT产品、可穿戴设备、智能家居等等。相比log4c、zlog这些知名的C日志库&#xff0c;EasyLogger的功能更加简单&#xff0c;提供给用户的接口更少&#xff0c;但…

肺腺癌预后新指标:全切片图像中三级淋巴结构密度的自动化量化|文献精析·24-10-09

小罗碎碎念 本期这篇文章&#xff0c;我去年分享过一次。当时发表在知乎上&#xff0c;没有标记参考文献&#xff0c;配图的清晰度也不够&#xff0c;并且分析的还不透彻&#xff0c;所以趁着国庆假期重新分析一下。 这篇文章的标题为《Computerized tertiary lymphoid structu…

基于springboot vue 校园失物招领平台的设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm springcloud等开发框架&#xff09; vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作☆☆☆ 精彩专栏推荐订阅☆☆☆☆…

【AIGC】OpenAI API在快速开发中的实践与应用:优化ChatGPT提示词Prompt加速工程

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;使用最新型号确保最佳实践利用最新模型进行高效任务处理为什么要选择最新模型&#xff1f;结论 &#x1f4af;指令与上下文的分隔最佳实践分隔指令和上下文的重要性使用符…

叉车毫米波雷达防撞技术,保护叉车作业安全

在叉车作业频繁的仓库与物流中心&#xff0c;安全隐患往往隐藏于细微之处&#xff0c;稍有不便可能引发重大事故。我们的叉车毫米波防撞系统方案&#xff0c;正是针对这一痛点而精心设计的创新之作。该系统通过集成的毫米波雷达技术&#xff0c;实现了对叉车周边环境的实时、精…