Hi!这里是JustHappy的技术博客,前几天在扒pnpm实现原理的时候偶然发现!我们的cnpm既然也采用了非扁平化的node_modules结构,这意味着cnpm已经不是从前我们认识的单纯的npm国内镜像那么简单了,当前cnpm甚至可以解决幽灵依赖,所以让我们来重新认识一下cnpm吧!
我是怎么发现的...
在写上一篇文章的时候,我记忆里cnpm只是npm的国内镜像,那它的包管理构建的node_modules肯定是和npm一样,应该是扁平化的,于是一开始我直接选择cnpm与pnpm进行比对,毕竟国内镜像要快很多嘛,但是我对同一项目分别使用cnpm和pnpm安装依赖后就发现不太对劲,这俩怎么那么像呢?下图是左边是使用cnpm,右边是使用pnpm
你会发现这哥俩基本一个模子刻出来的,除了 .pnpm 文件夹变成了 .store,其他的结构上基本没什么区别,事实上.store文件夹的作用和.pnpm的作用是一模一样的
事实是什么呢?
cnpm也构建了一个非扁平化的node_modules,那我们可以大胆的提出一个结论,cnpm也可以解决幽灵依赖的问题!
我们不妨来尝试一下
可以看到我们这个项目上是没有安装lodash的,我们先来试试在使用npm安装依赖的情况下会发生什么?我在项目文件中使用了一下代码来测试
可以看到正常执行了,我们成功的在项目中引用了package.json文件中并没有声明的文件,我们的浏览器和node都没有报错,我们实质上是实现了一个 “幽灵依赖”
那我们使用cnpm试试吧,结果如下!cnpm解决了幽灵依赖!!!
由此我们可以得出结论,cnpm不止是一个国内npm镜像源那么简单,cnpm和pnpm一样使用非扁平化的node_modules结构解决了幽灵依赖!
那么cnpm有什么更好的地方
得益于国内镜像的通畅性,cnpm安装包的速度甚至会比pnpm要快!是的,你没有听错!
对于同一项目使用pnpm安装依赖用了13.4s
而cnpm只需要4s!!
有关镜像站
这是cnpm的镜像站,真的非常感谢阿里的团队可以长期运营这个公益性的镜像站!截止发文npmmirror的下载数据如下。
同时像python的清华源之类的国内镜像站,虽然说很多情况下我们使用这些服务是出于种种的不方便,但是还是很感谢有这么一群人,愿意提供开源镜像服务!
所以,如果哪天有个人问该使用哪个包管理工具,或许我会推荐他使用cnpm
这波填一个坑哈😁,前阵子写的一篇文章
「工具链🛠️」npm ? Yarn ? pnpm ? cnpm ? bun ? 我***到底要用哪个? 💢💢(聊一聊软件包下载器)