- 背景
- npm 内部机制和背后的思考
- yarn 安装理念以及破解依赖管理困境
- npm 与 yarn 对比
- [拓展]npm 企业级部署私服原理
- 管理项目依赖的小技巧(集思广益…)
实际上,更优雅的方式是使用 npm dedupe 命令达到上述结构。而 yarn 在安装依赖时会自动执行 dedupe 命令。
正是由于上述一些 npm 历史的坑,所以更建议使用 yarn 作为项目协作的包管理工具。当然 npm 发展至今,很多问题已经优化掉,现在 yarn 和 npm 是两款互相看齐、互相获取灵感的依赖管理工具。
npm 与 yarn 对比
这里简单对比 npm v6 和 yarn v1. 这是我们生产开发常用的版本。
npm 和 yarn 作为两款相似的包管理工具,在一些功能实现上它们互相获取灵感。
相同点:
- package.json 作为项目依赖描述文件。
- node_modules 作为依赖存储目录,yarn v2 不再是这样。
- lockfile 锁定版本依赖,在 yarn 中叫 yarn.lock,在 npm 中叫 package-lock.json,在 npm v7 也支持了 yarn.lock。它确保在不同机器或不同环境中,能够得到稳定的 node_modules 目录结构。
差异:
- 依赖管理策略。
- lockfile。package-lock.json 自带版本锁定+依赖结构,你想改动一些依赖,可能影响的范围要比表面看起来的复杂的多;而 yarn.lock 自带版本锁定,并没有确定的依赖结构,使用 yarn 管理项目依赖,需要 package.json+yarn.lock 共同确定依赖的结构。
- 性能。(对比 npm v6 和 yarn v1)目前 npm v7 优化了缓存和下载网络策略,性能的差异在缩小。
[拓展]npm 企业级部署私服原理
npm 中的源(registry),其实就是一个查询服务。以 npmjs.org 为例,它的查询服务网址是 https://registry.npmjs.org/,在这个网址后加上依赖的名字,就会得到一个 JSON 对象,里面包含了依赖所有的信息。例如:
- https://registry.npmjs.org/react
- https://registry.npm.taobao.org/react
我们可以通过 npm config set registry
命令来设置安装源。你知道我们公司为什么要部署私有的 npm 镜像吗?虽然 npm 并没有被屏蔽,但是下载第三方依赖包的速度依然较缓慢,这严重影响 CI/CD 流程或本地开发效率。通常我们认为部署 npm 私服具备以下优点:
- 确保高速、稳定的 npm 服务
- 确保发布私有模块的安全性
- 审核机制可以保障私服上 npm 模块质量和安全
部署企业级私服,能够获得安全、稳定、高速的保障。
管理项目依赖的小技巧(集思广益…)
- 推荐使用 yarn 作为团队包管理工具,而不是 npm。尽管在 npm v6 之后的版本趋向稳定和安全,但由于历史原因和团队管理兼容性,仍然是推荐使用 yarn 作为团队统一的包管理工具。
- 项目中一定要存在 lockfile 文件,且禁止手动修改,因为这是项目稳定性运行的保障。
- 如果 yarn.lock 在代码合并的过程中出现了问题,可以尝试使用 yarn install 解决问题。
- …
以上文章来源于 ELab 团队 ,作者 ELab.zhangqiang