当前位置: 首页 > news >正文

npm vs pnpm 之幽灵依赖

在之前的文章📄 果断放弃npm切换到pnpm–节约磁盘空间(256G硬盘救星) 中有提及 npm 扁平化带来的幽灵👻依赖 问题,但没有特别展开,这段时间实际业务中遇到了该问题,特整理如下:

♨️ 问题描述:项目使用 npm 安装依赖可以正常运行,而使用 pnpm 安装依赖运行报错!

以 node-emoji 为例:其是一款表情符号查找和解析工具,它依赖了 @sindresorhus/is 用于值类型检查。

{"name": "node-emoji","version": "2.1.3","dependencies": {"@sindresorhus/is": "^4.6.0",...}
}

🐜 使用 npm/pnpm 新增 node-emoji 依赖

$ npm install node-emoji --save
$ pnpm add node-emoji --save

示例:我 ❤️ 🇨🇳

const emoji = require('node-emoji') console.log(emoji.emojify('我 :heart:  :cn:')) 

🐝 均可正常执行,我们修改代码如下:

const emoji = require('node-emoji') 
+ const is = require('@sindresorhus/is')console.log(emoji.emojify('我 :heart:  :cn:')) 
+ console.log(is('李刚')) // string

⚠️ npm 可正常执行!pnpm 报错:Error: Cannot find module '@sindresorhus/is'

在这里插入图片描述左侧:npm;右侧:pnpm


通过安装的结构,便可以察觉问题:

  • 使用 npm 安装,所有依赖都被提升到了 node_modules 下(npm@3之后的依赖扁平化,解决路径地狱);
  • 使用 pnpm 安装,只有直接依赖(package.json dependences 中声明)安装在 node_modules 下,其他在 .pnpm(扁平化) 目录下。

👉 不再 node_modules 下,所以项目中无法直接引用!

pnpm 好处:

  1. 通过软链的形式,使得 require 可以正常引用;同时对非真正依赖的项目做隔离(避免引用依赖的混乱)

    $ ls -li node_modules/node-emoji                                 
    30559101 lrwxr-xr-x  1 ligang  staff  46  8  6 16:59 node_modules/node-emoji -> .pnpm/node-emoji@2.1.3/node_modules/node-emoji
    
  2. .pnpm 的存在避免了循环引用和层级过深的问题(扁平化)

    node_modules
    └─ .pnpm
    |  ├─ node_modules
    |  |		└─ @sindresorhus+is@4.6.0 -> ../../@sindresorhus+is@4.6.0/node_modules/@sindresorhus/is
    |  ├─ @sindresorhus+is@4.6.0
    |  └─ node-emoji@2.1.3
    |     └─ node_modules  
    |        └─ @sindresorhus/is -> ../../../@sindresorhus+is@4.6.0/node_modules/@sindresorhus/is
    └─ node-emoji
    
  3. 硬链使得不同项目相同依赖只存在一个副本,减少磁盘空间

    $ ll -li node_modules/.pnpm/@sindresorhus+is@4.6.0/node_modules/@sindresorhus/      30564598 drwxr-xr-x  6 ligang  staff   192B  8  6 17:52 is
    
    inode值文件类型权限链接计数文件拥有者文件群组大小修改日期名称
    30564598drwxr-xr-x6ligangstaff192B8月6日 17:52is

pnpm基于符号链接的 node_modules 结构

硬连接
软连接
inode \n 30564598
file2
file1
inode \n 30559101
file1
file2

解决方案:不推荐

如果缺少依赖太多,可以使用提升选项。此选项官方不推荐。

pnpm install --shamefully-hoist

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • qt客户端与服务端通信
  • 谷粒商城实战笔记-140-商城业务-nginx-搭建域名访问环境二(负载均衡到网关)
  • Roaringbitmap+Mysql构建标签--实际使用问题
  • CACTER直播预告:重保期间邮件网关与SMC2如何多维度防护
  • 常见的框架漏洞
  • 常见的CMS漏洞
  • Stable Diffusion绘画 | 图生图-上传重绘蒙版
  • Massa如何构建完全链上的去中心化网络?
  • 计算机学习
  • SQL Server数据库文件过大而无法直接导出解决方案
  • 开源威胁情报查询
  • 07.FreeRTOS列表与列表项
  • leetcode 234.回文链表
  • 【C++ 面试 - 基础题】每日 3 题(一)
  • postgreSQL16添加审计功能
  • [LeetCode] Wiggle Sort
  • 【面试系列】之二:关于js原型
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • gitlab-ci配置详解(一)
  • java 多线程基础, 我觉得还是有必要看看的
  • MobX
  • pdf文件如何在线转换为jpg图片
  • python学习笔记-类对象的信息
  • spring + angular 实现导出excel
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • VUE es6技巧写法(持续更新中~~~)
  • 阿里研究院入选中国企业智库系统影响力榜
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 前端之Sass/Scss实战笔记
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 使用putty远程连接linux
  • 我的业余项目总结
  • Semaphore
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # .NET Framework中使用命名管道进行进程间通信
  • (12)目标检测_SSD基于pytorch搭建代码
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (二十三)Flask之高频面试点
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)计算机毕业设计ssm电影分享网站
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (六)DockerCompose安装与配置
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (一)UDP基本编程步骤
  • (原创)可支持最大高度的NestedScrollView
  • (转载)(官方)UE4--图像编程----着色器开发
  • (转载)Linux网络编程入门
  • .Net Core与存储过程(一)
  • .NET 使用配置文件