pnpm解决幽灵依赖问题

news2025/4/23 8:06:09

文章目录

  • 前言
      • 1. npm/yarn 现在还有幽灵依赖问题吗?
      • 2. pnpm 解决了幽灵依赖问题吗?
      • 3. pnpm 是如何解决的?
        • 举例说明
    • 1. pnpm 的 node_modules 结构原理
      • 结构示意
    • 2. 实际演示幽灵依赖的杜绝
      • 步骤1:初始化项目并安装依赖
      • 步骤2:在代码中引入未声明的依赖
      • 步骤3:运行代码
    • 3. 查看 pnpm 的 node_modules 结构
    • 4. 总结


前言

1. npm/yarn 现在还有幽灵依赖问题吗?

有。

  • npm(包括 v9)和 yarn(classic/berry)默认依然采用“扁平化 node_modules”结构。
  • 只要依赖被扁平化安装到顶层 node_modules,项目代码就可以直接 require/导入未在本项目 package.json 声明的依赖(即幽灵依赖)。
  • 只要依赖树发生变化(比如间接依赖被移除),你的代码就会因为找不到依赖而报错。

2. pnpm 解决了幽灵依赖问题吗?

pnpm 基本解决了这个问题。

  • pnpm 采用了“严格的 node_modules 隔离”机制(hoisting less,严格依赖树)。
  • 每个包只能访问自己 package.json 里声明的依赖,不能直接 require 间接依赖。
  • 如果你在代码里 require 了未声明的依赖,pnpm 安装后运行会直接报错(找不到模块)。

3. pnpm 是如何解决的?

  • pnpm 在 node_modules 下采用了“软链接+隔离”结构。
  • 每个包的 node_modules 只包含自己声明的依赖(通过 symlink 指向全局 store),不会自动把所有依赖都扁平化到顶层。
  • 这样,只有在 package.json 里声明的依赖才能被 require 到,未声明的依赖不会被自动暴露出来。
举例说明

假设你的 package.json 没有声明 moment,但代码里用了:

const moment = require('moment');
  • 用 npm/yarn 安装,如果有其他依赖间接依赖了 moment,代码可能能跑。
  • 用 pnpm 安装,运行时会直接报错:Cannot find module 'moment'

1. pnpm 的 node_modules 结构原理

  • pnpm 不像 npm/yarn 那样把所有依赖都“扁平化”到顶层 node_modules。
  • pnpm 会在项目的 node_modules 下为每个包建立一个“虚拟隔离环境”,每个包只能访问自己 package.json 里声明的依赖。
  • 具体实现方式是:pnpm 在 node_modules 里用符号链接(symlink)指向全局 store 里的真实包内容,并且只为声明的依赖建立链接。

结构示意

假设你的项目结构如下:

project/
  node_modules/
    .pnpm/
      react@18.1.0/
      lodash@4.17.21/
    react -> .pnpm/react@18.1.0/node_modules/react
    lodash -> .pnpm/lodash@4.17.21/node_modules/lodash
    footer/
      node_modules/
        react -> ../../../.pnpm/react@18.1.0/node_modules/react
  • .pnpm 目录存放所有真实包内容。
  • node_modules/react 是指向 .pnpm/react@18.1.0/node_modules/react 的符号链接。
  • 每个包(如 footer)自己的 node_modules 只包含自己声明的依赖的链接。

2. 实际演示幽灵依赖的杜绝

步骤1:初始化项目并安装依赖

pnpm install

步骤2:在代码中引入未声明的依赖

假设 footer 包的 package.json 没有声明 moment,但你在代码里写了:

const moment = require('moment');

步骤3:运行代码

pnpm run start

结果:

Error: Cannot find module 'moment'

pnpm 会直接报错,因为 footer 的 node_modules 里没有 moment 的符号链接。


3. 查看 pnpm 的 node_modules 结构

你可以用如下命令查看符号链接结构:

tree /F node_modules

在 Windows 的 cmd 终端中,你可以使用 cd 命令切换到指定目录。
具体命令如下:

cd /d d:\js\getting-started-example

/d 参数用于切换驱动器(比如从 C: 切换到 D:)。

你会发现只有声明的依赖才会出现在每个包的 node_modules 里,未声明的依赖不会被暴露出来。


4. 总结

  • pnpm 通过“符号链接+隔离”机制,保证每个包只能访问自己声明的依赖,彻底杜绝了幽灵依赖。

  • 这样可以极大提升依赖安全性和可维护性,适合大型 Monorepo 项目。

  • npm/yarn:幽灵依赖问题依然存在,需靠开发者自律和工具检测(如 depcheck)。

  • pnpm:通过 node_modules 隔离机制,从根本上杜绝了幽灵依赖,强制每个包声明自己的依赖。

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

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

相关文章

测试第四课---------性能测试工具

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

【C++】新手入门指南(下)

文章目录 前言 一、引用 1.引用的概念和定义 2.引用的特性 3.引用的使用 4.const引用 5.指针和引用的关系 二、内联函数 三、nullptr 总结 前言 这篇续上篇的内容新手入门指南(上),继续带大家学习新知识。如果你感兴趣欢迎订购本专栏。 一、…

前后端分离项目在未部署条件下如何跨设备通信

其实我此前也不知道这个问题怎么解决,也没有想过—因为做的项目大部分都是前后端分离的,前端直接用后端的部署好的环境就行了。最近也是有点心高气傲开始独立开发,一个人又写前端又写后端也是蛮累的,即使有强有力的cursor也很累很…

基于Python的多光谱遥感数据处理与分类技术实践—以农作物分类与NDVI评估为例

多光谱遥感数据包含可见光至红外波段的光谱信息,Python凭借其丰富的科学计算库(如rasterio、scikit-learn、GDAL),已成为处理此类数据的核心工具。本文以Landsat-8数据为例,演示‌辐射校正→特征提取→监督分类→精度评…

vscode python 代码无法函数跳转的问题

TL; DR; python.languageServer 配置成了 None 导致 vscode python 代码无法函数跳转 详细信息 mac 环境下 vscode 正常 command 鼠标左键 可以跳转到定义或者使用位置,但是我的为何不知道失效了 我一开始以为是热键冲突,结果发现 mac 好像没办法定…

Unity 脚本使用(二)——UnityEngine.AI——NavMesh

描述 Singleton class 用于访问被烘培好的 NavMesh. 使用NavMesh类可以执行空间查询(spatial queries),例如路径查找和可步行性测试。此类还允许您设置特定区域类型的寻路成本,并调整寻路和避免的全局行为。 静态属性&#xff0…

从项目真实场景中理解二分算法的细节(附图解和模板)

遇到一个真实场景里使用二分算法的问题,本以为可以放心交给小师弟去做,结果出现了各种问题,在此梳理下二分算法的核心思想和使用细节。 文章目录 1.场景描述2.场景分析3.二分算法的精髓3.1 核心模板3.2 二分过程图解3.3 各种区间写法3.3.1 闭…

Jetson Orin NX 16G 配置GO1强化学习运行环境

这一次收到了Jrtson Orin NX, 可以进行部署了。上一次在nano上的失败经验 Jetson nano配置Docker和torch运行环境_jetson docker-CSDN博客 本次的目的是配置cuda-torch-python38环境离机运行策略。 Jetson Orin NX SUPER 1. 烧录镜像 参考链接在ubuntu系统中安装sdk manag…

深度学习3.5 图像分类数据集

%matplotlib inline import torch import torchvision from torch.utils import data from torchvision import transforms from d2l import torch as d2l代码执行流程图 #mermaid-svg-WWhBmQvijswiICpI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-…

js原型链prototype解释

function Person(){} var personnew Person() console.log(啊啊,Person instanceof Function);//true console.log(,Person.__proto__Function.prototype);//true console.log(,Person.prototype.__proto__ Object.prototype);//true console.log(,Function.prototype.__prot…

【知识】性能优化和内存优化的主要方向

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 前言 现在有很多论文,乍一看很高级,实际上一搜全是现有技术的堆砌,但是这种裁缝式的论文依然能发表在很好的会议和期…

VS Code + GitHub:高效开发工作流指南

目录 一、安装 & 基本配置 1.下载 VS Code 2.安装推荐插件(打开侧边栏 Extensions) 3.设置中文界面(可选) 二、使用 VS Code 操作 Git/GitHub 1.基本 Git 操作(不输命令行!) 2.连接 GitHub(第一次使用) 三、克隆远程仓库到 VS Code 方法一(推荐): 方…

软件测试之接口测试常见面试

一、什么是(软件)接口测试? 接口测试:是测试系统组件间接口的一种测试方法 接口测试的重点:检查数据的交换,数据传递的正确性,以及接口间的逻辑依赖关系 接口测试的意义:在较早期开展,在软件开发的同时…

11、Refs:直接操控元素——React 19 DOM操作秘籍

一、元素操控的魔法本质 "Refs是巫师与麻瓜世界的连接通道,让开发者能像操控魔杖般精准控制DOM元素!"魔杖工坊的奥利凡德先生轻抚着魔杖,React/Vue的refs能量在杖尖跃动。 ——以神秘事务司的量子纠缠理论为基,揭示DOM…

uniapp-商城-33-shop 布局搜索页面以及u-search

shop页面上有一个搜索&#xff0c;可以进行商品搜索&#xff0c;这里我们先做一个页面布局&#xff0c;后面再来进行数据i联动。 1、shop页面的搜索 2、搜索的页面代码 <navigator class"searchView" url"/pagesub/pageshop/search/search"> …

【dataframe显示不全问题】打开一个行列超多的excel转成df之后行列显示不全

出现问题如下图&#xff1a; 解决方案&#xff5e; display.width解决列显示不全 pd.set_option(display.max_columns,1000) pd.set_option(display.width, 1000) pd.set_option(display.max_colwidth,1000) pd.set_option(display.max_rows,1000)

Windows下Golang与Nuxt项目宝塔部署指南

在Windows下将Golang后端和Nuxt前端项目打包&#xff0c;并使用宝塔面板部署的步骤如下 一、Golang后端打包 交叉编译为Linux可执行文件 在Windows PowerShell中执行&#xff1a; powershell复制下载 $env:GOOS "linux" $env:GOARCH "amd64" go build…

真实趋势策略思路

该交易策略通过一系列技术指标的计算与逻辑判断&#xff0c;旨在捕捉市场趋势的反转与延续点&#xff0c;以实现盈利。其主要交易逻辑思路可以概括如下&#xff1a; 1. 趋势与动量分析 策略首先利用动量函数计算收盘价的短期&#xff08;3周期&#xff09;变化&#xff0c;通过…

江奇霖惊喜亮相泡泡岛音乐节,新歌首唱+合作舞台燃动现场

2025年4月20日&#xff0c;江奇霖受邀参加2025泡泡岛音乐与艺术节东南站。现场献唱三首歌曲&#xff0c;超5万名观众现场一同感受音乐的魅力。 在泡泡岛SPECIAL SET特别企划舞台中&#xff0c;江奇霖带来新歌的首唱&#xff0c;温暖的旋律如低语倾诉&#xff0c;观众们也纷纷喊…

【HarmonyOS】ArKUI框架

目录 概述 声明式开发范式 基于ArKUI的项目 • 1&#xff0e;创建资源文件 • 2&#xff0e;引用资源 • 3&#xff0e;引用系统资源&#xff1a; • 系统资源有哪些 • 4. 在配置和资源中引用资源 声明式语法 UI描述规范 UI组件概述 组件化 组件渲染控制语法 修改…