首页
学习
活动
专区
圈层
工具
发布
技术百科首页 >pnpm >pnpm 与 npm 在依赖提升(hoisting)策略上有什么区别?

pnpm 与 npm 在依赖提升(hoisting)策略上有什么区别?

词条归属:pnpm

1. npm 的扁平化提升

npm 和 Yarn Classic 默认采用扁平化提升策略,将尽可能多的依赖(包括传递依赖)提升到 node_modules 根目录。这种设计的初衷是减少目录嵌套深度,兼容早期 Node.js 的模块解析行为。其副作用是项目代码可以访问任意层级的依赖,形成幽灵依赖,同时同一依赖的多个版本无法并存,可能引发版本冲突。

2. pnpm 的默认提升与可选配置

pnpm 默认将依赖提升到 node_modules/.pnpm/node_modules(隐藏目录),而非根目录。这意味着依赖对 node_modules 内部的包可见,但对外部代码不可见,在兼容性与隔离性之间取得平衡。用户可通过 .npmrc 配置灵活调整提升行为:hoist=false 完全禁止提升,实现最严格隔离;public-hoist-pattern[] 将匹配模式的包提升到根目录,用于兼容特定工具;shamefully-hoist=true 则将所有依赖提升到根目录,行为等同于 npm。

3. 提升策略对工具链的影响

大多数现代工具(Vite、Webpack 5、TypeScript 等)已兼容 pnpm 的非扁平结构。少数依赖扁平化结构的工具(如 React Native 的 Metro 打包器、部分 Webpack 4 配置、某些 serverless 部署环境)需要借助 node-linker=hoisted 配置生成无符号链接的扁平 node_modules,此时会失去幽灵依赖保护,但保留 pnpm 的 store 和锁文件优势。

相关文章
pnpm的安装与配置(Windows/macOS)
PNPM作为新一代的包管理器,通过引入内容可寻址文件系统和硬链接,有效解决了npm存在的重复依赖问题,极大地节省了磁盘空间和提高了安装速度。相比Yarn和npm,PNPM在处理依赖上有其独特的优势:
Allen_z
2024-06-14
30.5K1
深入浅出 npm & yarn & pnpm 包管理机制
本文会以尽量简洁的语言来描述当下主流包管理工具 npm、yarn、pnpm 的管理策略以及进化史,不涉及任何晦涩的代码。
Leecason
2022-07-13
2.4K0
npm、yarn与pnpm详解
🔍 简介: npm是随Node.js一起安装的官方包管理工具,它为开发者搭建了一个庞大的资源库,允许他们在这个平台上搜索、安装和管理项目所必需的各种代码库或模块。
Allen_z
2024-06-14
1.4K0
包管理工具
前端的包管理工具相信大家一定不会陌生,因为每天都需要跟他打交道,新项目或者刚拉下来的前端项目都需要去 install 依赖进行包的依赖安装,大家最熟悉的应该就是 npm 了,或者国内的 npm 镜像包 cnpm ,大家熟称为淘宝镜像
离殊
2022-04-01
3.7K0
从npm发展历程看pnpm的高效
执行npm install 之后。npm 帮我们下载对应的依赖包并解压到本地缓存,然后构造node_modules目录结构,写入依赖文件,对应的node_modules内部结构也经历了几个版本的变化。
虎妞先生
2022-09-28
2.8K0
点击加载更多
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
领券