升级至Angular 6后执行npm install出现错误求助
ts.formatting.RulesProvider is not a constructor错误 这个问题我在升级Angular版本的时候也踩过坑,核心原因是**typescript-formatter包和Angular 6要求的TypeScript版本不兼容**。Angular 6对应的TypeScript最低版本是2.7.x,而旧版typescript-formatter依赖的ts.formatting.RulesProvider API已经被TypeScript废弃移除了,所以哪怕你删了node_modules重装也没用——这个包本身就跟不上新版本TS的节奏了。
给你几个可行的解决方案,按优先级排序:
方案1:替换为维护中的代码格式化工具(推荐)
typescript-formatter已经停止维护了,现在Angular生态里更推荐用prettier来做代码格式化,它对新版本TypeScript的兼容性更好,也和Angular CLI适配得不错:
- 先卸载旧的
typescript-formatter:
npm uninstall typescript-formatter --save-dev
- 安装prettier及相关适配依赖:
npm install prettier @angular-eslint/eslint-plugin-prettier --save-dev
- 项目根目录创建
.prettierrc配置文件,参考配置:
{ "singleQuote": true, "trailingComma": "es5", "printWidth": 120, "tabWidth": 2 }
之后你就可以用npx prettier --write "src/**/*.{ts,html,css}"来格式化代码,也可以集成到IDE的自动格式化功能里。
方案2:排查并修复间接依赖问题
如果你的项目本身没直接装typescript-formatter,是某个依赖间接引入的,可以先找出依赖源:
npm ls typescript-formatter
找到后要么升级那个依赖包到兼容Angular 6的版本,要么在package.json里添加resolutions字段(npm需要配合npm-force-resolutions工具,yarn直接支持),强制指定一个兼容的typescript-formatter版本(不过注意,这个包已经停更,可能找不到合适的兼容版本,所以还是方案1更稳妥)。
方案3:临时降级TypeScript(不推荐)
虽然可以把TypeScript降级到2.6.x来适配旧的typescript-formatter,但这样会和Angular 6的要求冲突,后续可能引发其他兼容性问题,所以不建议这么做。
完成操作后,重新执行:
rm -rf node_modules package-lock.json npm install ng upgrade
应该就能顺利继续升级流程了。
内容的提问来源于stack exchange,提问作者Gobli

