好包不等待:用 pnpm 加速你的项目依赖

欢迎来到我的博客,代码的世界里,每一行都是一个故事


在这里插入图片描述

好包不等待:用 pnpm 加速你的项目依赖

    • 前言
    • 什么是pnpm
      • 背景和诞生原因:
      • 与传统 npm 安装方式的区别:
    • 基础用法
      • 安装依赖:
      • 卸载依赖:
      • 安装全局依赖:
      • 更新依赖:
    • 零拷贝的原理与优势
      • 1. **零拷贝原理:**
      • 2. **零拷贝的优势:**
    • pnpm的高级特性
      • 1. Workspaces:多包管理
      • 2. Link:本地包的链接与管理
      • 3. Alias:依赖版本的灵活管理
    • pnpm在设计项目中的应用
      • 1. pnpm 与现有项目的集成
        • 步骤:
      • 2. pnpm 在大型项目中的最佳实践
        • 最佳实践:
    • 结语

前言

在前端开发的世界中,依赖管理是一项既重要又让人头疼的任务。传统的 npm 安装方式可能让你感到繁琐,而今天我们要介绍的 pnpm 就是为了解决这一问题而诞生的利器。让我们一起揭开 pnpm 的神秘面纱,看看它是如何为前端项目注入新的活力的。

什么是pnpm

pnpm 是 Node.js 生态系统中的一种包管理工具,类似于 npm。它的名称是“可持久化(persistent) Node.js 模块”(Persistent Node Modules)的缩写。下面是关于 pnpm 的一些信息:

背景和诞生原因:

pnpm 的诞生是为了解决 Node.js 项目中依赖包管理的一些问题。在传统的 npm 安装方式中,每个项目都会有一个独立的 node_modules 目录,这导致了大量重复的依赖包占用存储空间。此外,当多个项目使用相同的依赖时,它们会各自下载一份,浪费带宽和时间。

pnpm 的目标是通过共享依赖,减少存储空间的占用,加快项目的构建速度,并提高整体效率。它采用一种称为“硬链接”(hard-link)的方式来共享依赖,从而在不同项目之间共享相同的包,减少冗余。

与传统 npm 安装方式的区别:

  1. 硬链接共享依赖: pnpm 通过硬链接机制在不同项目之间共享相同版本的依赖包,减少了存储占用。
  2. 单一存储位置: 所有项目的依赖包都存储在全局的 pnpm 目录中,而不是每个项目都有一个独立的 node_modules 目录。
  3. 快速安装: 由于依赖的共享和硬链接的使用,pnpm 的安装速度相对较快,特别是在多个项目之间有相同依赖时。
  4. 版本控制: pnpm 使用一个称为 pnpm-lock.yaml 的文件来记录项目的依赖关系和版本,类似于 npm 的 package-lock.json 文件,确保项目在不同环境中得到相同的依赖版本。

总体而言,pnpm 通过优化依赖管理,提供更高效的包安装和使用经验。在一些场景下,它可能是一个更好的选择,特别是对于需要频繁安装和升级依赖的项目。

基础用法

使用 pnpm 安装和卸载依赖的基本用法与 npm 类似。下面是一些基础用法:

安装依赖:

使用以下命令可以通过 pnpm 安装项目的依赖:

pnpm install

这将会读取项目中的 package.json 文件,并安装所有声明的依赖。如果你要安装特定依赖包,可以使用:

pnpm install package-name

卸载依赖:

卸载依赖同样简单,使用 pnpm uninstall 命令:

pnpm uninstall package-name

这会将指定的依赖从 node_modules 目录中删除,并更新 package.json 文件中的依赖列表。如果你只是想在 node_modules 中删除,但保留在 package.json 中,可以使用 pnpm unlink

pnpm unlink package-name

安装全局依赖:

如果你想安装全局依赖,可以使用 -g 标志:

pnpm install -g package-name

更新依赖:

更新依赖同样直观,使用 pnpm update

pnpm update

这会更新项目中所有依赖的版本,根据 package.json 中的规定。

记得在执行上述命令时,你需要在项目的根目录中打开终端,并确保已经安装了 pnpm(可以通过 npm install -g pnpm 安装)。此外,根据你的项目配置,可能还需要运行 pnpm install 时添加 --global 标志来进行全局安装。

零拷贝的原理与优势

1. 零拷贝原理:

pnpm 实现零拷贝的核心原理是通过硬链接(hard links)来共享依赖包。当一个项目安装了某个版本的依赖时,pnpm 并不会在每个项目中创建一个独立的副本,而是将依赖包的实际文件硬链接到项目的 node_modules 目录。这意味着多个项目可以共享相同版本的依赖,而不会占用额外的存储空间。

2. 零拷贝的优势:

零拷贝机制带来了一些显著的优势,特别是在大型项目或者多个项目共享相同依赖时:

  • 减少存储空间占用: 由于相同版本的依赖被多个项目共享,不会重复存储,从而减少了磁盘空间的占用。这在有大量项目或依赖重叠的情况下尤为明显。

  • 更快的安装速度: 由于不需要在每个项目中复制整个依赖包,安装速度更快。硬链接操作相对轻量,尤其在依赖包较大的情况下,这带来的性能提升是显著的。

  • 快速的重复安装: 当多个项目共享相同依赖时,如果某个项目已经安装了特定版本的依赖,其他项目可以直接共享,无需重新下载和安装,加快了项目的初始化和构建过程。

  • 版本控制: pnpm 使用一份全局的 pnpm-lock.yaml 文件来记录所有项目的依赖关系和版本。这确保了不同项目在相同的环境中使用相同版本的依赖,提高了项目的一致性。

总体而言,零拷贝机制通过优化依赖管理,减少了存储占用和提升了安装速度,特别是在多个项目之间有相同依赖时,能够带来明显的性能提升。

pnpm的高级特性

1. Workspaces:多包管理

pnpm 支持 Workspaces,这是一项高级特性,允许你在一个仓库中管理多个相关的包(即多包管理)。通过 Workspaces,你可以在根目录的 package.json 文件中定义一个 workspaces 字段,列出所有相关的包,然后在这些包之间共享依赖关系。

使用示例:

// 根目录的 package.json
{"workspaces": ["packages/*"],// 其他配置...
}

这里的 packages/* 表示 pnpm 会在 packages 目录下寻找所有包,并将它们联合管理。

2. Link:本地包的链接与管理

pnpm link 允许你在本地环境中开发和测试包,而无需将它们发布到 npm 仓库。通过 link 命令,你可以在一个项目中将本地的包链接到其他项目中,实现对本地包的实时修改和调试。

使用示例:

# 在包目录中执行
pnpm link# 在另一个项目中执行
pnpm link package-name

这会在另一个项目的 node_modules 目录中创建一个符号链接,指向你正在开发的本地包。

3. Alias:依赖版本的灵活管理

pnpm 具有一个强大的别名(Alias)功能,允许你为依赖包设置别名,以实现更灵活的依赖版本管理。通过别名,你可以使用自定义的名称引用依赖,而不仅仅是它们的正式名称和版本。

使用示例:

// 根目录的 package.json
{"dependencies": {"my-library": "npm:library@^1.0.0"},// 其他配置...
}

这里的 my-library 是一个自定义别名,指向 library 包的版本号在 ^1.0.0 以上。

这三个高级特性使得 pnpm 在管理多包项目、本地开发调试以及依赖版本管理上更为灵活和强大。通过这些功能,你可以更有效地组织和开发你的项目,减少冗余和提高开发效率。

pnpm在设计项目中的应用

1. pnpm 与现有项目的集成

步骤:
  1. 安装 pnpm: 在项目的根目录下执行以下命令安装 pnpm:

    npm install -g pnpm
    
  2. 初始化 pnpm: 在项目的根目录执行以下命令:

    pnpm init
    

    这将创建一个 pnpm-lock.yaml 文件,用于记录项目的依赖关系。

  3. 使用 pnpm 安装依赖: 执行以下命令安装项目的依赖:

    pnpm install
    

    或者按照之前提到的 Workspaces 特性,进行多包管理。

  4. 替代 npm/yarn 命令: 在以后的开发过程中,使用 pnpm 替代 npmyarn 命令进行依赖管理。

2. pnpm 在大型项目中的最佳实践

最佳实践:
  1. 使用 Workspaces: 对于大型项目,使用 pnpm 的 Workspaces 特性可以更好地管理多个相关包。这样可以确保这些包之间共享依赖关系,减少存储占用和提高整体效率。

  2. 合理使用 Link: 在开发阶段,使用 pnpm link 可以方便地将本地包链接到其他项目,实现实时修改和调试。但要小心不要滥用,确保链接的包是稳定的,以免影响其他项目的开发。

  3. 灵活使用 Alias: 利用 pnpm 的别名功能,通过自定义的名称引用依赖,使得在项目中切换依赖版本更为灵活。这对于大型项目中需要同时维护多个分支或版本的情况特别有用。

  4. 定期更新 pnpm 版本: 定期检查并更新 pnpm 的版本,以确保使用的是最新的功能和性能优化。可以通过以下命令升级:

    npm install -g pnpm
    
  5. 合理使用版本锁定: 尽管 pnpm 采用零拷贝的方式,但在生产环境中,仍建议使用版本锁定机制(如 pnpm-lock.yamlpackage-lock.json)来确保不同环境之间的依赖版本一致性。

结语

综合考虑上述最佳实践,pnpm 在大型项目中可以带来依赖管理的高效性和灵活性。通过合理配置和使用 pnpm 的特性,可以提高项目的开发效率,降低维护成本。

通过学习本文,你将不仅了解 pnpm 的基本使用方法,更深入理解它的原理和高级特性。pnpm 为前端开发者提供了一种轻松愉快的依赖管理方式,让我们一同拥抱这个新时代的 JavaScript 依赖管理工具,为我们的项目注入更多活力。

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

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

相关文章

2024百元蓝牙耳机测评推荐,百元超强的开放式蓝牙耳机合集

现在的蓝牙耳机市场真的是太卷了,各种品牌、各种型号让人挑得眼花缭乱,但你知道吗?其实在百元价位里也有很多好货。今天,我就来给大家好好测评几款2024年的百元级蓝牙耳机,看看哪些是真正的性价比之王,开放…

基于JAVA的康复中心管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 普通用户模块2.2 护工模块2.3 管理员模块 三、系统展示四、核心代码4.1 查询康复护理4.2 新增康复训练4.3 查询房间4.4 查询来访4.5 新增用药 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的康复中…

小微企业适用什么样的CRM系统?CRM选型有哪些技巧?

小型企业主的日子着实不好过,从营销和销售到客户支持和保留,这些基本都要亲力亲为,才能确保将客户放在首位。如果您要是一个小企业主,那么相信您能懂这个感觉,恨不得自己长出八只手,才能让一切井井有条——…

Wordpress网站开发问题解决——除了主页之外的所有页面都是“找不到页面内容”(修复记录)

一条纯经验操作 引言慌火上浇油后台查看 解决之路结尾 引言 最近 阿里云老是提醒我边缘计算机控制升级 我自己建立了一个网站,用的就是阿里云的万网服务器 所以 我去看看 结果跟我没什么关系 本以为就这么愉快地结束了 没想到 我建立的网站就只能打开主页 其他页…

羊奶加红枣,女性必备的加法!

羊奶加红枣,女性必备的加法! 在当今社会,女性健康备受关注。而羊奶和红枣作为常见的食材,以其独特的营养价值备受追捧。不少人认为,羊奶里面加红枣对女生有很大的帮助。那么,到底羊奶加红枣对女性健康有哪…

06.构建大型语言模型步骤

在本章中,我们为理解LLMs奠定了基础。在本书的其余部分,我们将从头开始编写一个代码。我们将以 GPT 背后的基本思想为蓝图,分三个阶段解决这个问题,如图 1.9 所示。 图 1.9 本书中介绍的构建LLMs阶段包括实现LLM架构和数据准备过程、预训练以创建基础模型,以及微调基础模…

无重复字符的最长字串

题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解…

PMP报考流程?

项目管理相关证书,PMP是一个不错的选择,尤其是小白朋友。 PMP 是项目管理的一个入门证书,理论知识很全面,涵盖了项目管理的全流程,可作为日常工具参考书、完全小白的可以先考一个PMP学好理论,再考一个PRIN…

用友U8流程审批效率-SQLServer+SSRS

文章目录 @[TOC]1、 需求及效果1.1 需求1.2 效果2、 思路及SQL语句3、实现折叠明细表4、结语1、 需求及效果 1.1 需求 想要查看U8的审批流程,查看流程在哪个节点或人停留的时间,这个单据整个流程走下来需要的时间。可以更加直观方便的查看审批效率 1.2 效果 采用了SSRS上…

【漏洞复现】大华 DSS 数字监控系统 itcBulletin SQL 注入

漏洞描述 大华 DSS存在SQL注入漏洞,攻击者 pota/services/itcBuletin 路由发送特殊构造的数据包,利用报错注入获取数据库敏感信息。攻击者除了可以利用 SQL注入漏词获取数据库中的信息例如,管理员后台密码、站点的用户人人信息)之外,甚至在高权限的情况可向服务器中写入木…

HNU-数据库系统-作业

数据库系统-作业 计科210X 甘晴void 202108010XXX 第一章作业 10.09 1.(名词解释)试述数据、数据库、数据库管理系统、数据库系统的概念。 数据,是描述事物的符号记录。 数据库(DB),是长期存储在计算机内、有组织、可共享的大量…

已签名驱动程序安装后提示“Windows无法验证此设备所需驱动程序数字签名”的原因和解决方法

在Windows 64位系统上,正常开启数字签名认证时,驱动程序软件需要经过微软数字签名的才允许被使用。否则在设备管理器下,安装完硬件驱动后设备上会有“黄色感叹号”标识,右键该设备属性提示:“Windows 无法验证此设备所…

nginx配置 请求静态文件时带上额外的响应头信息

注意:这种方式添加的额外信息会出现在响应头中。 例如在location{}中,try_files之前添加如下信息: add_header X-Extra-Header "Value"; add_header X-Forwarded-For $proxy_add_x_forwarded_for; …

Triumphcore FPGA调测试记录

FPGA采用Xilinx pynq Z2开发板。基于V2.5版本开发 OverView uart端口映射 BUG调试记录 2024.1.7 复位状态导致取指时序错误 错误波形: 正确波形 问题代码: 2024.1.9 clock_wizard设置输入时钟是输出时钟的2^n倍,输出时钟的占空比才…

算法训练营第四十二天|动态规划:01背包理论基础 416. 分割等和子集

目录 动态规划&#xff1a;01背包理论基础416. 分割等和子集 动态规划&#xff1a;01背包理论基础 文章链接&#xff1a;代码随想录 题目链接&#xff1a;卡码网&#xff1a;46. 携带研究材料 01背包问题 二维数组解法&#xff1a; #include <bits/stdc.h> using namesp…

jsonvue-mobile 联动方式说明。

目录 jsonvue-mobile的联动类型分为两种 一种是命令式的&#xff1a; 另一种是响应式的&#xff1a; 联动场景 场景一&#xff1a;某一个字段的值变化时&#xff0c;同步修改另一个字段的值 命令式&#xff1a; 响应式&#xff1a; 场景一演示效果GIF 场景二&#xff1…

【模块系列】STM32TCS3472

前言 手上正好有TCS3472模块&#xff0c;也正好想在加深一下自己对I2C协议的理解和应用&#xff0c;所以就写了这个代码库出来。参考的资料主要来源于TCS3472的数据手册&#xff0c;和arduino中MH_TCS3472库的宏定义&#xff0c;和函数名称&#xff0c;我就没有重新命名&#x…

华为数通HCIA题库(750题)

完整题库在这里&#xff1a;华为数通HCIA-RS题库注释版-加水印.pdf资源-CSDN文库 此处只节选几题。 1.网络管理员在网络中捕获到了一个数据帧&#xff0c;其目的MAC地址是01-00-5E-AO-B1-C3。关于该MAC地址的说法正确的是&#xff08; )。 A.它是一个单播MAC地址 B.它是一个广播…

详解ajax、fetch、axios的区别

众所周知它们都用来发送请求&#xff0c;其实它们区别还蛮大的。这也是面试中的高频题&#xff0c;本文将详细进行讲解。 1. ajax 英译过来是Aysnchronous JavaScript And XML&#xff0c;直译是异步JS和XML&#xff08;XML类似HTML&#xff0c;但是设计宗旨就为了传输数据&a…

从JDK源码级别剖析JVM类加载器

欢迎大家关注我的微信公众号&#xff1a; 类加载运行全过程 当我们用java命令运行某个类的main函数启动程序时&#xff0c;首先需要通过类加载器把主类加载到JVM。 package com.tuling.jvm;public class Math {public static final int initData 666;public static User u…