关于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.jsondependenciesdevDependencies中声明的包​​,但这些包却能正常工作(直到某天突然崩溃)。

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

4.总结

相关推荐
哆啦A梦158823 分钟前
axios 的二次封装
前端·vue.js·node.js
阿珊和她的猫31 分钟前
深入理解与手写发布订阅模式
开发语言·前端·javascript·vue.js·ecmascript·状态模式
Q_Q51100828539 分钟前
python基于web的汽车班车车票管理系统/火车票预订系统/高铁预定系统 可在线选座
spring boot·python·django·flask·node.js·汽车·php
yinuo40 分钟前
一行 CSS 就能搞定!用 writing-mode 轻松实现文字竖排
前端
snow@li1 小时前
html5:拖放 / demo / 拖放事件(Drag Events)/ DataTransfer 对象方法
前端·html·拖放
浪裡遊2 小时前
Nivo图表库全面指南:配置与用法详解
前端·javascript·react.js·node.js·php
漂流瓶jz4 小时前
快速定位源码问题:SourceMap的生成/使用/文件格式与历史
前端·javascript·前端工程化
samroom4 小时前
iframe实战:跨域通信与安全隔离
前端·安全
fury_1234 小时前
vue3:数组的.includes方法怎么使用
前端·javascript·vue.js
weixin_405023374 小时前
包资源管理器NPM 使用
前端·npm·node.js