我们在用npm下载包的时候,有时候会碰到这样的提示
这是npm的警告,说我们使用的nodejs版本与下载的包所要求的nodejs版本不一致。
这是因为有些包它对nodejs的版本有要求,然后就会在package.json文件里的engines字段里声明它所要求的nodejs版本。
比如这样
"engines": { "node": "^12.20.0 || ^14.15.0 || ^16.10.0" },
这段代码的意思就是要求nodejs版本得是>=12.20.0并且<13.0.0,或者是>=14.15.0并且<15.0.0,又或者是>=16.10.0并且小于17.0.0。
所以上面的警告就是因为我的nodejs版本是18.19.1,不符合它的要求。
那这个时候应该怎么解决这个问题,通常有三种方法。
第一种,就是升级或者降级你的nodejs,使nodejs符合包的要求。
第二种就是升级你的包,有些包升级了之后对nodejs的要求也不一样了,可能升级之后就符合你的nodejs版本了,这要看具体的包。
第三种就是更换一个功能类似又符合你的nodejs版本的包。
那就会有一个问题,就是为什么有些包对nodejs的版本会有要求?
这个原因有很多,可能是这个包依赖某个nodejs版本特有的API,因为不同的nodejs版本可能有不同的api,升级了之后这个api可能就被删除或者修改了, 不符合包的要求了。
又或者说是这个包所使用的包对nodejs版本有要求,所以连带着这个包也得对nodejs版本有要求。
又可能是某些nodejs版本有已知的安全漏洞或者不稳定因素,包的开发者出于对包的安全性和稳定性考虑,可能会特意声明避开这些版本。
所以原因可能有很多,各种各样,大家还是尽量按照包的的要求来使用包。
那为什么有时候你的nodejs版本和包要求的nodejs版本不一样,却也能正常使用它。
这个可能是因为nodejs版本虽然不一样,但你的nodejs版本能兼容它所要求的版本,功能都能正常使用。又或者说这个包只有部分代码部分功能对nedejs版本有要求,而你所使用到的功能和代码刚好不包括那部分有要求的代码,所以能正常使用。
比如说ngx-custom-validators这个包,这个包为什么会对nodejs版本有要求呢,是因为它依赖angular13.3.11版本,而angular13.3.11对nodejs版本有要求,所以连带着它也对nodejs版本有要求,可以看下面这张图:
那为什么我不按它的要求,用18版本的nodejs,也能正常使用?
这是因为angular对nodejs的版本的要求是需要是LTS,也就是长期维护版。而当时最高的长期维护版就是16了。所以它的要求只到16。但其实后续的nodejs18LTS版本也能兼容angular13.3.11。所以我用nodejs18LTS版本也能正常使用ngx-custom-validators这个包。