如何从package-lock.json推断项目构建所用的npm具体版本
从package-lock.json推断构建时Node、npm版本的方法
你已知的lockfileVersion: 1对应npm v5/v6的结论是准确的,可以通过lock文件内的字段特征进一步缩小版本范围:
- 字段特征对应npm版本细分:
- 若lock文件根节点不存在
packages字段(仅存在嵌套结构的dependencies字段),才属于v5/v6生成的v1格式锁文件;如果有packages字段则是npm v7+生成的向后兼容格式,不属于原生v1锁。 - 若依赖条目下没有
requires字段、integrity值多为sha1-前缀,对应npm v5.0~v5.3版本,随Node.js 8.0~8.3默认分发。 - 若依赖条目下存在
requires字段、integrity值开始出现sha512-前缀,但根节点没有记录npm版本的"npm"字段,对应npm v5.4~v6.9版本,随Node.js 8.4~10.15默认分发。 - 若v1格式锁文件的根节点存在
"npm": "x.y.z"字段,该字段值就是生成锁文件时的精确npm版本,对应npm v6.10~v6.14版本,随Node.js 10.16+、12.x全系列、14.0~14.4默认分发。
- 若lock文件根节点不存在
- 对应Node版本可以通过npm和Node的默认绑定关系直接推导,不需要额外判断,因为npm是随Node.js安装包默认分发的,版本对应关系固定。
ts-node报错的非破坏性修复方案
你运行ts-node时出现的如下报错,和锁文件本身、构建时用的npm版本没有直接关系,核心原因是TypeScript版本和调用TS解析API的包版本不兼容,不需要删除重建整个package-lock.json,采用下面的方案即可保留原有锁文件的依赖版本锁定:
ts.Debug.assert(typeof typeReferenceDirectiveName === "string", "Non-string value passed to `ts.resolveTypeReferenceDirective`, likely by a wrapping package working with an outdated `resolveTypeReferenceDirectives` signature. This is probably not a problem in TS itself.");
报错核心含义:有包装TypeScript解析逻辑的包用了旧版API签名,向
ts.resolveTypeReferenceDirective传入了非字符串类型的类型引用名,这个问题不是TS本身导致的。
- 首先对齐核心依赖的兼容版本:
- TypeScript 4.7及以上版本,必须搭配ts-node@10.8.0及以上版本
- TypeScript 4.04.6版本,搭配ts-node@10.0.010.7.0版本
- TypeScript 3.x版本,搭配ts-node@9.x及以下版本
- 执行定向更新命令,仅调整不兼容的包版本,不改动其他依赖的锁定版本:
对齐版本后执行npm install <对应版本的typescript> <对应版本的ts-node> --save-dev --legacy-peer-deps即可,命令只会更新锁文件中这两个包以及其必要依赖的条目,不会重置整个锁文件的版本。 - 如果对齐ts-node和TS版本后仍有报错,检查项目中是否安装了
tsconfig-paths、nx、@typescript-eslint/typescript-estree这类会调用TS解析API的包,将其升级到兼容当前TS版本的版本即可。
内容的提问来源于stack exchange,提问作者Irina Rapoport
相关产品推荐
相关产品推荐

