npm 依赖?不熟知的 optionalDependencies(可选依赖项)
前言
-
背景 项目对所有的开源组件依赖进行过统计,并将该版本号的依赖都统一提交至生产库(源地址:npm-prod)中; 项目的开发源地址直连外网,有所有开源组件:npm-test; 之前项目运行没问题 问题 最近一次操作(npm-prod下): => cd 到项目目录下 => npm i 初始化依赖,正常 => npm run dev 报错: the dependency was not found: * canvg in ./node_modules/jspdf/dist/jspdf.es.min.js
😒然而:
- 查看 package-lock.json 文件:没有 canvg 这个组件
- 查看 package-lock.json 文件: D 是 jspdf 的依赖,并且有 canvg 3.0.6 版本,这就奇怪了:既然有这个依赖,为什么安装依赖不报错,运行时报错呢?
- 又在 npm-test 下重新安装 canvg ,npm run dev 运行正常😂;区别在于在 npm-test 下比在 npm-prod 下安装的 canvg 中多了一个 @types/raf ,而这个组件是不在 npm-prod 库中的。
🥲问题到底在哪,之前运行可以,现在不行!?
-
问题还在于 canvg ,它在项目中是 jspdf 的一个 optional dependencies,即:可选的依赖项,所以不是必须安装的,因此之前没有被排查到。
🤞主角:optionalDependencies
在 npm 中,熟知的依赖是 dependencies 和 devDependencies,除此之外,其实还有包括 optional dependencies 在内的几种依赖,重点说下 optional dependencies :
- 解释一: 如果一个依赖关系可以被使用,但你希望npm在找不到它或安装失败的情况下继续进行,那么你可以把它放在optionalDependencies对象中。这是一个包名到版本或url的映射,就像依赖对象一样。不同的是,构建失败不会导致安装失败。
- 解释二: 可选依赖,如果有一些依赖包即使安装失败,项目仍然能够运行或者希望npm继续运行,就可以使用optionalDependencies。另外optionalDependencies会覆盖dependencies中的同名依赖包,所以不要在两个地方都写。
❤️参考
下一篇:
空间分析:2-1.QGIS生成热力图
