这个错误大概是这样的:
代码语言:javascript复制npm ERR! code CERT_HAS_EXPIRED
npm ERR! errno CERT_HAS_EXPIRED
npm ERR! request to https://registry.npm.taobao.org/ylru/download/ylru-1.2.1.tgz failed, reason: certificate has expired
它是在我们执行 npm i 或 npm run xxx 指令时发生的。
这个错误是什么意思呢?
提示说,证书过期了或自定义证书无效,在访问和拉取https://registry.npm.taobao.org/ylru/download/ylru-1.2.1.tgz类库链接时,网络请求失败。
我们将这个链接拷贝一下,直接放在浏览器里访问,它也是不可访问的。(在问题爆发时)
这是由于淘宝仓库源网站的证书过期所致。
自2017年2月27日,npm不再支持自签名证书或过期证书。
而淘宝仓库网站恰好又使用了过期的自定义证书。当我们使用 npm i 安装某些类库时,例如类库地址为 https://registry.npm.taobao.org/ylru/download/ylru-1.2.1.tgz,此时npm无法验证来源,于是抛出了 CERT_HAS_EXPIRED 错误。
怎么解决呢?
关闭 SSL 验证:
代码语言:javascript复制npm config set strict-ssl false
修改软件源,例如将软件源地址改回官网:
代码语言:javascript复制npm config set registry https://registry.npmjs.org/
这个更改的副作用是,更新或安装类库时需要梯子,如果有梯子则无妨。
为什么不向前兼容呢?
不清楚,一向如此。
社区有一些规则的改变,属于基础改变,会对上面的一系列软件建筑产生致命影响。
采用 HTTPS 协议,要求 SSL 验证,不支持自定义的非法证书或过期证书,这些改动是由于安全需要,并非只有 npm 如此,像谷歌的浏览器也作了同样样的安全规则更改。
随着社会的进步,软件的发展,以后仍然会出现类似的基础规则改进,这些变动会对已有的旧软件产生“毁灭”性影响,后果是,你不修改代码或配置,软件就再也无法直接运行。
应对策略也简单,它不兼容我们,那就只有我们兼容它喽。