关于npm和pnpm

1. ​​npm(传统包管理器)​​

  • ​​工作原理​​:

    1. ​​扁平化依赖​ ​:安装依赖时,npm会尽量将子依赖提升到 node_modules顶层,避免深层嵌套。例如:安装 vue@3.2.0时,它的子依赖 @vue/reactivity会被放在 node_modules/@vue/reactivity,而不是 node_modules/vue/node_modules/@vue/reactivity。

    2. ​​独立存储​ ​:每个项目的 node_modules都是完全独立的副本,即使多个项目用同一版本的库,也会重复下载存储。

  • ​​优点​​:

    • 简单易用,Node.js 自带,无需额外安装。

    • 扁平化结构让开发者能直接引用子依赖(即使未显式声明)。

  • ​​缺点​​:

    • ​​磁盘空间浪费​ ​:100 个项目用 vue,就有 100 份 vue文件。

    • ​​依赖不确定性​ ​:扁平化可能导致版本冲突(如两个依赖需要不同版本的 axios)。

    • ​​幽灵依赖​​(后文详解)。

2. ​​pnpm(高效包管理器)​​

  • ​​工作原理​​:

    1. ​​全局存储 + 硬链接​​:

      • 所有依赖的包实际存储在统一的全局目录(如 ~/.pnpm-store)。

      • 项目的 node_modules中只创建这些文件的​​硬链接​​(几乎不占额外空间)。

    2. ​​嵌套依赖结构​​:

      • 严格保持依赖树的嵌套关系,避免扁平化。

      • 例如 vue的子依赖 @vue/reactivity会放在 node_modules/vue/node_modules/@vue/reactivity。

  • ​​优点​​:

    • ​​极快安装​​:依赖已存在时,直接创建硬链接(秒级安装)。

    • ​​节省磁盘​ ​:100 个项目用 vue,磁盘上只有 1 份 vue文件。

    • ​​严格依赖隔离​​:避免版本冲突和幽灵依赖。

  • ​​缺点​​:

    • 需要单独安装(npm install -g pnpm)。

    • 某些老旧工具可能不兼容嵌套的 node_modules结构。

3. 幽灵依赖

幽灵依赖是指:​​项目中使用了未在 package.json的 dependencies或 devDependencies中声明的包​​,但这些包却能正常工作(直到某天突然崩溃)。

npm的扁平化依赖​​是罪魁祸首:假设你安装 A包,A依赖 B@1.0。npm会把 B@1.0提升到 node_modules顶层。你的代码​​直接引用 B​​(即使没在 package.json声明),也能运行!这就是一个"幽灵依赖"。

4.总结

相关推荐
鬼手点金7 小时前
nanoGPT/nanochat 能做出 DeepSeek/Qwen 这样的大模型吗?
服务器·前端·javascript·bug·openclaw
蛋蛋的就会顺顺的8 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
程序员Sunday8 小时前
TypeScript 的 any、unknown、never 有什么区别?
前端·面试·typescript
朱涛的自习室8 小时前
70 美金的 Beyond Compare,我让 Gemini 4 和 DeepSeek 造个开源免费版(Day 2)
android·前端·人工智能
码艺-Alimjan8 小时前
Tauri 源码备份 · 打包 & 解压 总结,源码收集之路
前端·javascript·vue.js
小马不起床8 小时前
零基础玩转 FastAPI_11:前端后台管理页面
前端·状态模式·fastapi
子非鱼a10 小时前
【文件上传】一个普普通通的edu16
前端
美狐美颜SDK开放平台10 小时前
直播APP如何实现美白滤镜功能?视频美颜SDK技术开发方案详解
前端·数据库·人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
pride.li11 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
屏什么录11 小时前
电脑如何录屏幕视频和声音?从工具到代码,7 种方案帮你彻底搞定
前端·音视频开发