You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular9升级至14后执行ng g c命令报错:keyword 'id'不支持

Angular 9升级到14后执行ng g c报错:NOT SUPPORTED: keyword "id", use "$id" for schema ID

问题重现

将Angular从9升级到14后,执行CLI命令ng g c component-name时触发以下错误:

An unhandled exception occurred: NOT SUPPORTED: keyword "id", use "$id" for schema ID

已尝试更新@angular-eslint/schematics但未解决,相关依赖配置及错误日志如下:

package.json依赖

"dependencies": {
    "@angular/animations": "^14.2.12",
    "@angular/common": "^14.2.12",
    "@angular/compiler": "^14.2.12",
    "@angular/core": "^14.2.12",
    "@angular/forms": "^14.2.12",
    "@angular/localize": "^14.2.12",
    "@angular/platform-browser": "^14.2.12",
    "@angular/platform-browser-dynamic": "^14.2.12",
    "@angular/router": "^14.2.12",
    "@fingerprintjs/fingerprintjs": "^3.0.6",
    "@kolkov/angular-editor": "^1.1.4",
    "@ng-bootstrap/ng-bootstrap": "6.1.0",
    "@ngx-translate/core": "^12.0.0",
    "@ngx-translate/http-loader": "^5.0.0",
    "@types/file-saver": "^1.3.0",
    "@types/html2canvas": "0.0.36",
    "@types/jspdf": "^1.3.3",
    "@types/xlsx": "0.0.36",
    "angular-cropperjs": "^1.0.2",
    "angular-in-memory-web-api": "^0.9.0",
    "autoprefixer": "^10.4.5",
    "bootstrap": "^4.6.0",
    "bootswatch": "^4.4.1",
    "classlist.js": "^1.1.20150312",
    "core-js": "^2.6.12",
    "cropperjs": "^1.4.1",
    "crypto-js": "^3.1.9-1",
    "file-saver": "^1.3.8",
    "font-awesome": "^4.7.0",
    "html2canvas": "1.0.0-alpha.12",
    "jspdf": "^1.5.3",
    "jspdf-autotable": "^3.5.3",
    "moment": "^2.29.4",
    "ngx-device-detector": "1.4.1",
    "ngx-xml2json": "^1.0.2",
    "rxjs": "^6.5.4",
    "rxjs-compat": "^6.5.4",
    "sax": "^1.2.4",
    "stream": "0.0.2",
    "stream-browserify": "^2.0.2",
    "timers": "^0.1.1",
    "timers-browserify": "^2.0.11",
    "tslib": "^2.0.0",
    "url-search-params-polyfill": "^5.0.0",
    "xlsx": "^0.18.5",
    "xml2js": "^0.4.23",
    "zone.js": "~0.11.8"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "^14.2.10",
    "@angular-eslint/builder": "12.7.0",
    "@angular-eslint/eslint-plugin": "12.7.0",
    "@angular-eslint/eslint-plugin-template": "12.7.0",
    "@angular-eslint/schematics": "12.7.0",
    "@angular-eslint/template-parser": "12.7.0",
    "@angular/cli": "^14.2.10",
    "@angular/compiler-cli": "^14.2.12",
    "@angular/language-service": "^14.2.12",
    "@types/jasmine": "~3.6.0",
    "@types/jasminewd2": "~2.0.2",
    "@types/node": "^12.12.31",
    "@types/xml2js": "^0.4.5",
    "@typescript-eslint/eslint-plugin": "4.28.2",
    "@typescript-eslint/parser": "4.28.2",
    "eslint": "^7.26.0",
    "jasmine-core": "~3.6.0",
    "jasmine-spec-reporter": "~5.0.0",
    "karma": "~6.4.1",
    "karma-chrome-launcher": "~3.1.0",
    "karma-coverage-istanbul-reporter": "~3.0.2",
    "karma-jasmine": "~4.0.0",
    "karma-jasmine-html-reporter": "^1.5.0",
    "protractor": "~7.0.0",
    "sass": "^1.58.3",
    "ts-node": "~4.1.0",
    "typescript": "~4.6.4"
  }

错误日志

[error] Error: NOT SUPPORTED: keyword "id", use "$id" for schema ID
    at Object.code (C:\Users\username\projectname\node_modules\@angular\cli\node_modules\ajv\dist\vocabularies\core\id.js:6:15)
    at keywordCode (C:\Users\username\projectname\node_modules\@angular\cli\node_modules\ajv\dist\compile\validate\index.js:454:13)
    at C:\Users\username\projectname\node_modules\@angular\cli\node_modules\ajv\dist\compile\validate\index.js:222:17
    at CodeGen.code (C:\Users\username\projectname\node_modules\@angular\cli\node_modules\ajv\dist\compile\codegen\index.js:439:13)
    at CodeGen.block (C:\Users\username\projectname\node_modules\@angular\cli\node_modules\ajv\dist\compile\codegen\index.js:568:18)
    at iterateKeywords (C:\Users\username\projectname\node_modules\@angular\cli\node_modules\ajv\dist\compile\validate\index.js:219:9)
    at groupKeywords (C:\Users\username\projectname\node_modules\@angular\cli\node_modules\ajv\dist\compile\validate\index.js:208:13)
    at C:\Users\username\projectname\node_modules\@angular\cli\node_modules\ajv\dist\compile\validate\index.js:192:13)
    at CodeGen.code (C:\Users\username\projectname\node_modules\@angular\cli\node_modules\ajv\dist\compile\codegen\index.js:439:13)
    at CodeGen.block (C:\Users\username\projectname\node_modules\@angular\cli\node_modules\ajv\dist\compile\codegen\index.js:568:18)

问题根源

错误来自@angular/cli依赖的ajv库,它要求使用$id替代旧的id关键字做Schema ID标识。但核心原因是**@angular-eslint包版本与Angular 14不兼容**——当前使用的@angular-eslint 12.x是为Angular 12设计的,其内部的Schema配置仍使用旧的id关键字,与Angular 14依赖的ajv版本冲突。

解决方案

1. 卸载旧版@angular-eslint相关包

npm uninstall @angular-eslint/builder @angular-eslint/eslint-plugin @angular-eslint/eslint-plugin-template @angular-eslint/schematics @angular-eslint/template-parser

2. 安装与Angular 14匹配的@angular-eslint版本

npm install @angular-eslint/builder@14.0.0 @angular-eslint/eslint-plugin@14.0.0 @angular-eslint/eslint-plugin-template@14.0.0 @angular-eslint/schematics@14.0.0 @angular-eslint/template-parser@14.0.0 --save-dev

3. 同步升级eslint及typescript-eslint依赖

Angular 14需要配套的eslint和typescript-eslint版本,执行以下命令更新:

npm install eslint@8.23.0 @typescript-eslint/eslint-plugin@5.36.2 @typescript-eslint/parser@5.36.2 --save-dev

4. 清理依赖缓存并重新安装

# 删除node_modules和锁文件
rm -rf node_modules package-lock.json
# 重新安装依赖
npm install

5. 验证修复效果

执行组件生成命令测试:

ng g c test-component

额外排查点

如果上述步骤无效,检查项目中是否存在其他第三方schematics工具(如自定义生成器)或依赖包,这些包可能仍在使用旧的Schema配置,需要同步升级到兼容Angular 14的版本。

内容的提问来源于stack exchange,提问作者Praveen Bomminani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:42:03