关于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.总结

相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万3 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋3 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁3 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95273 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大3 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师3 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学3 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端