前言
- 背景
- 项目对所有的开源组件依赖进行过统计,并将该版本号的依赖都统一提交至生产库(源地址: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中的同名依赖包,所以不要在两个地方都写。