建网站公司浩森宇特,智慧团建登录网站入口,成都1号病例判刑,wordpress 支持数据库首先 pnpm 和 npm yarn 一样是包管理工具#xff0c;他解决了npm 和 yarn 存在的一些问题
npm3之前每个依赖都是一层嵌套一层的#xff0c;每个依赖里都有node_modules 用来存放依赖所需的依赖包导致重复下载的依赖包很多#xff0c;一层层嵌套#xff0c;嵌套很深#x…首先 pnpm 和 npm yarn 一样是包管理工具他解决了npm 和 yarn 存在的一些问题
npm3之前每个依赖都是一层嵌套一层的每个依赖里都有node_modules 用来存放依赖所需的依赖包导致重复下载的依赖包很多一层层嵌套嵌套很深模块实例之间无法共享
之后的 npm3 和 yarn 因为上述问题从而使用扁平化结构管理依赖
node_modules下所有的依赖都会平铺到同一层级。由于 require 寻找包的机制如果 A 和 C 都依赖了 B那么 A 和 C 在自己的 node_modules 中未找到依赖 C 的时候会向上寻找并最终在与他们同级的 node\_modules 中找到依赖包 C。这样就不会出现重复下载的情况而且依赖层级嵌套也不会太深,因为没有重复的下载所有的 A 和 C 都会寻找并依赖于同一个B包自然也就解决了实例无法共享数据的问题。
虽然解决了问题但是也带来了新问题
依赖结构的不确定性 需要借助lock文件保证no de_modules 结构稳定性。否则出现同一层级相同包不同版本的话会根据安装的顺序给一个版本提升到公共node_modules中而另一个版本则会继续以嵌套node_modules的形式嵌套 扁平化算法的复杂度增加项目中仍然可以非法访问没有声明过的依赖包(幽灵依赖) 虽然是依赖中依赖的包没有在本身项目的package.json 中没有声明但是由于扁平化处理我们不仅仅发现多出很多没有声明在package.json 中的包外我们还可以直接在项目中引用这类没有被声明的包这就造成了幽灵依赖
以上就是 npm. 和 yarn 的一些问题那么pnpm 如何解决这类问题呢
pnpm 的优势
包安装速度非常快磁盘利用效率非常高基于内容寻址 不会重复安装同一个包。用 npm/yarn 的时候如果 100 个项目都依赖 lodash那么 lodash 很可能就被安装了 100 次磁盘中就有 100 个地方写入了这部分代码。但在使用 pnpm 只会安装一次磁盘中只有一个地方写入后面再次使用都会直接使用 hardlink即使一个包的不同版本pnpm 也会极大程度地复用之前版本的代码。举个例子比如 lodash 有 100 个文件更新版本之后多了一个文件那么磁盘当中并不会重新写入 101 个文件而是保留原来的 100 个文件的 hardlink仅仅写入那 一个新增的文件 支持monorepo pnpm 与 npm/yarn 另外一个很大的不同就是支持了 monorepopnpm 内置了对 monorepo 的支持只需在工作空间的根目录创建 pnpm-workspace.yaml 和 .npmrc 配置文件同时还支持多种配置相比较 lerna 和 yarn workspacepnpm 解决 monorepo 的同时也解决了传统方案引入的问题。
pnpm依赖的管理
pnpm 使用的是 npm version 2.x 类似的嵌套结构同时使用 .pnpm 以平铺的形式储存着所有的包然后使用 Store Links 和文件资源进行关联。简单地说 pnpm 把会包下载到一个公共目录如果某个依赖在 sotre 目录中存在了话那么就会直接从 store 目录里面去 hard-link避免了二次安装带来的时间消耗如果依赖在 store 目录里面不存在的话就会去下载一次。通过 Store hard link 的方式使得项目中不存在 NPM 依赖地狱问题从而完美解决了 npm3 和 yarn 中的包重复问题
软链接 和 硬链接 机制 pnpm 是通过 hardlink 在全局里面搞个 store 目录来存储 node_modules 依赖里面的 hardlink 地址然后在引用依赖的时候则是通过 symlink 去找到对应虚拟磁盘目录下(.pnpm 目录)的依赖地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ntHPliC-1686748158315)(/Users/wangyongjie/Library/Application Support/typora-user-images/image-20230614210025958.png)]
以上是A,B两个依赖使用pnpm安装后的 node_modules 结构可以看到首先会去全局的store中查找A,B两个依赖是否存在不存在则下载存入这个公共store, 然后对声明的A,B两个依赖通过软连接.pnpm文件夹下的各自依赖A,B进行关联而.pnpm则以平铺形式存储所有包而真正包 则会硬链接形式链接到项目