依赖通过 简单树形 package 嵌套
两个问题:
SemVer 版本管理导致依赖安装不确定
缓存能力存在问题,且无离线模式
将依赖拉平到同一级别目录 依赖扁平化
遇到相同依赖的不同版本就无法扁平化(依然会出现重复依赖)
所以只是一定程度解决了文件路径深度问题,
但却带来了新的问题
锁文件 - 解决依赖不幂等问题
npm-shrinkwrap.json (v3)
需要手动更新 npm shrinkwrap
受 yarn.lock 启发
package-lock.json 此时的锁文件可以自动更行
本地 package-lock 存在后,npm 就可以不用请求查看依赖包的具体信息,而是直接查找文件缓存,没有缓存则下载。
npm v3 的思路上,做出了改进。
在较早的时候 yarn 下载速度会快一些,但在依赖处理上依然是扁平化
同级访问 完全问题实例,
node_modules 中的包 被调用并不需要在packages.json 中体现 (有可能是子依赖)import xx from 'xxx'
但是如果包的子依赖发生变化(对子依赖版本升级或者弃用),项目是不会察觉的,从而导致出错。
npm 中要解决这个问题,就需要检查依赖 dependency-check
monorepo 的项目管理方式
通过链接树的方式
小满zs 视频
核心内容:
pnpm-repo
pnpm import
可以将其他包转化
monorepo 技术 可以一键安装子项目依赖
pnpm-workspace.yaml
子模块复用技术 可以将公共部分抽离出来统一管理,实现同步,不需要一次变动多次修改
npm install -g pnpm
pnpm add -g pnpm # 升级 pnpm
pnpm setup # 添加 path
npm 命令 | pnpm 等价命令 |
---|---|
npm install | pnpm install |
npm i | pnpm add |
npm run | pnpm |
pnpm exec
执行依赖中的命令
在命令不冲突时,可省去 exec
应急处理
plan1:自己重造轮子 代价太大,不现实
plan2:提 issue 等待,或者自己修复后pr 这些都不会尽快发版,
plan3:git host 改源 但不够优雅git hosted dependency
plan4:自己另发布npm包(自己pr的情况),但项目中包名要全局修改,甚至要修改node_modules中的依赖
这个时候可以使用 pnpm 的别名功能
pnp 模式
移去node_modules,
.pnp.cjs 顶替
不再需要靠目录来寻址
依赖存储在 .yarn/cache