当前位置: 首页
前端开发
Angular8升级到Angular13常见问题解决

Angular8升级到Angular13常见问题解决

热心网友 时间:2026-06-16
转载

将Angular从8升级至13需逐级进行,首先确保Node版本≥12 20并备份项目、删除锁文件。依次升级核心依赖、@angular cdk、NG-ZORRO及NG-ALAIN。常见问题包括TypeScript编译未用文件、仓库不洁、依赖缺失、ViewChild参数遗漏、样式路径错误、模块导入路径变更等,对应提供配置修改或重新安装依赖等解决方案。

升级前言:Angular 8 到 13 的迁移记录

项目升级需求要求我们将 Angular 从 8 版本提升至 13 版本,由于无法直接跳级,必须逐级递进。本文详细记录了升级过程中遇到的各类报错信息及其对应的解决方案。

一、升级前的准备工作

首先确保 Node.js 版本不低于 12.20。接着新建一个分支或采用其他方式备份当前项目,以保障安全。最后删除项目目录下的 yarn.lock 或 package-lock.json 文件,避免旧依赖干扰新版本安装。

二、逐级升级的操作步骤

  1. 升级相关依赖:访问 update.angular.io,根据官方引导将项目逐步升级至 Angular 9~13 对应版本。
  2. 若单独使用了 @angular/cdk,请执行 ng update @angular/cdk@(对应版本) 进行同步更新。
  3. 升级 NG-ZORRO 组件库:运行 ng update ng-zorro-antd@(对应版本)
  4. 升级 NG-ALAIN 框架:执行 ng update ng-alain(对应版本)

三、常见问题与修复方法

错误1:WARNING in xxx is part of the TypeScript compilation but it's unused.Add only entry points to the 'files' or 'include' properties in your tsconfig.

\

// 在 exclude 后加上以下信息
 "files": ["../src/main.ts", "../src/polyfills.ts"],
 "include": ["src/**/*.d.ts"]
错误2:Repository is not clean. Please commit or stash any changes before updating.
ng update --all --force --allow-dirty
错误3:Package '@angular/core' is not a dependency…

\

遇到此类提示,重新安装依赖即可。

npm i
错误4:ERROR in ./src/styles.less (…), @import '~@delon/theme/styles/index'; Can't resolve '@delon/theme/styles/index.less' …

这是由于路径发生了变动,需要移除多余的一层目录。例如 @import '~@delon/theme/styles/index' 中的 styles 层级应去掉。所有报错的目录文件都需要逐一检查修正。

如果路径正确后仍然报错:

\

那么需要在 angular.json 中配置样式路径:

\

"stylePreprocessorOptions": {
  "includePaths": [
    "node_modules/"
  ]
}
错误5 src/app/layout/default/header/components/taskmange.component.ts:33:28 – error NG1001: @ViewChild options must be an object literal

\

原因是 @ViewChild 现在要求传入两个参数,而第二个参数缺失。官方说明指出:static 参数决定是否在变更检测运行前解析查询结果。若不提供,编译器将按照默认行为处理。

@ViewChild("taskDrawer", {static: true}) taskDrawer;
// 或者
@ViewChild("taskDrawer", {static: false}) taskDrawer;
// 或者
@ViewChild("taskDrawer") taskDrawer;

请根据实际业务场景选择合适的方式。

错误6:样式丢失
// angular.json 文件引入
"styles": [
  "src/styles.less",
  "./node_modules/ng-zorro-antd/ng-zorro-antd.min.css"
],
// styles.less 文件引入
@import '~ng-zorro-antd/ng-zorro-antd.less';
@import '~ng-zorro-antd/style/entry.less';
@import '~ng-zorro-antd/button/style/entry.less';
错误7:ERROR in src/app/core/i18n/i18n.service.ts:13:24 – error TS2307: Cannot find module 'date-fns/locale/en'
import { enUS as dfEn, zhCN as dfZhCn, zhTW as dfZhTw, vi as dfVi } from 'date-fns/locale';
错误8:import { STColumn, STComponent, STReq, STRequestOptions, STRes } from '@delon/abc/table';
// https://github.com/ng-alain/ng-alain/issues/1569 里有说明路径变化,改成下面这样
import { STColumn, STComponent, STReq, STRequestOptions, STRes } from '@delon/abc/st';
错误9:error TS2307: Cannot find module 'date-fns/distance_in_words_to_now'
import formatDistanceToNow from 'date-fns/formatDistanceToNow';
错误10:NullInjectorError: No provider for ACLService!
// 在 app.module.ts 里补上缺失的 provider
providers: [
  // ...
  ACLService,
  AlainConfigService,
],
错误11:Package '@angular/core' is not a dependency…
npm i
错误12:ERROR in Failed to list lazy routes: Unknown module '…/app.module#AppModule'.

(暂无标准修复步骤,建议检查路由配置或版本间兼容性)

错误13:Angular11 升级报错:Two incompatible decorators on class

查阅多种资料未找到通用解法,后来在 Angular 官方文档中发现以下配置可以解决:

{
  "angularCompilerOptions": {
    "fullTemplateTypeCheck": true,
    "strictInjectionParameters": true
  }
}
错误14:typescript 不兼容问题 @angular/compiler-cli@8.0.3 requires a peer of typescript@>=3.4 <3.5
npm i typescript@3.4.3
错误15:import { NzMessageService, UploadFile } from 'ng-zorro-antd';

组件导入路径已发生变化:

\

import { NzMessageService } from 'ng-zorro-antd/message';
import { NzUploadFile } from 'ng-zorro-antd/upload';
错误16:import { NzModalService } from 'ng-zorro-antd';

同样需要更新路径:

\

import { NzModalService } from 'ng-zorro-antd/modal';
错误17:自定义主题色失效

在 angular.json 中移除已引入的组件主题色,然后在 src/styles.less 中引入预定义主题文件:

@import "../node_modules/ng-zorro-antd/ng-zorro-antd.less";
@import './styles/theme';
@import './styles/index';
错误18:Can't bind to 'formGroup' since it isn't a known property of 'form'

使用 Reactive Forms 需要额外导入 ReactiveFormsModule,详细参考官方文档。

错误19:Angular12 报错 (resize-observer-polyfill) TS2717: Property contentRect must be of type DOMRectReadOnly

\

提供两种解决办法:

(1)等待第三方库修复更新;

(2)在 tsconfig.json 中添加 "skipLibCheck": true 以跳过第三方库的类型检查。

错误20:

\

npm install --sa ve-dev raw-loader
错误21:多次注入

\

platformBrowserDynamic 被重复注入(通常出现在 main.ts 和 app.module.ts 中),删除多余的那一处,例如移除 App.module.ts 中的相关代码。

错误22:angular 从11.x更新到12.x 收到 DON'T USE IT FOR PRODUCTION! 警告

升级到 12.2.17 后,执行以下命令:

ng update @angular/cli --migrate-only --from=11.2.0 --to=12.2.17

再次运行 ng serve,警告即可消除。

错误23:Git无法提交(Must use import to load ES Module)

由于升级需要逐级进行,每一步都需 git commit。临时注释掉 .husky/pre-commit 中以 npx 开头的行,完成全部升级后再恢复。

错误24:An unhandled exception occurred: Directory import '…/dev-server' is not supported resolving ES modules

\

这是版本不兼容导致,需要升级 @angular-devkit/build-angular:

// 升级前
"@angular-devkit/build-angular": "~12.2.18"
// 升级后
"@angular-devkit/build-angular": "~13.3.9"
错误25:export 'startWith' (imported as 'startWith') was not found in 'rxjs'

\

原因是 rxjs 版本过低,需要升级:

// 升级前
"rxjs": "~6.5.3"
// 升级后
"rxjs": "~7.5.0"
错误26:Module '"@delon/chart"' has no exported member 'G2TimelineData'

\

路径已变更,需要调整:

import { G2TimelineData } from '@delon/chart/timeline';
错误27:编译后git出现了很多缓存编译文件

\

更新 .gitignore,添加以下忽略项:

# Compiled output
/dist
/tmp
/out-tsc
/bazel-out

# Node
/node_modules
npm-debug.log
yarn-error.log

# IDEs and editors
.idea/
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace

# Visual Studio Code
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
.history/*

# Miscellaneous
/.angular/cache
.sass-cache/
/connect.lock
/coverage
/libpeerconnection.log
testem.log
/typings

# System files
.DS_Store
Thumbs.db
错误28:抽屉组件内部自定义内容无法展示

\

自定义的 ng-content 外层需要使用进行包裹。

错误29:antd-Table组件渲染数据时出现第一行空白行

添加 [nzScroll]="{ x: '1500px' }" 后出现了空白行,解决方案如下:

:host ::ng-deep .ant-table-measure-now {
  visibility: collapse;
}
30.报错如下:

\

在 tsconfig.json 中新增 "skipLibCheck": true 即可。

\

升级总结

以上便是从 Angular 8 升级至 Angular 13 过程中遇到的主要问题以及对应的解决办法。版本跨度较大,坑点众多,但只要按步骤推进、逐一排查,终究能顺利完成迁移。希望这份实战记录能为遇到类似需求的开发者提供参考。

来源:https://www.jb51.net/article/273530.htm

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
如何用拖放在Flask看板应用中更新数据库状态

如何用拖放在Flask看板应用中更新数据库状态

在Flask看板应用中,通过HTML5拖放API结合前端fetch异步POST请求,将拖拽任务的task_id和target_state发送至后端路由;后端接收JSON后更新数据库并提交事务,实现跨列拖拽时实时更新状态。需注意将事件绑定到容器而非子元素,并在ondragover中阻止默认行为以确保drop触发。

时间:2026-07-09 07:01
如何用CSS :has()选择器快速实现悬停span显示相邻div

如何用CSS :has()选择器快速实现悬停span显示相邻div

利用CSS的:has()伪类选择器,通过` bar:has(> baz:hover)+ qux`实现悬停内联元素时显示相邻块级容器,解决了传统相邻兄弟选择器无法跨层级匹配的局限,可用于悬停图标显示详情框等交互场景。需注意浏览器兼容性和性能优化,避免过度使用影响渲染效率。

时间:2026-07-09 07:01
display:block居中段落文本的响应式实现方法

display:block居中段落文本的响应式实现方法

通过`display:block`与`max-width`限制宽度,配合`margin:auto`使段落块水平居中并实现响应式布局;同时用CSS统一控制段落间距,避免脱离文档流,提升可读性与维护性。

时间:2026-07-09 07:01
JavaScript代码去重:高效避免重复编写的技巧

JavaScript代码去重:高效避免重复编写的技巧

将重复代码中的变化点提取为参数,利用ES6模板字符串动态生成选择器,可消除重复、保持一致性。注意参数安全性,必要时进行白名单校验;批量化场景可扩展为数组形式;现代框架中更推荐数据驱动或组件化封装替代手动选择器。

时间:2026-07-09 07:00
使用容器查询单位cqw实现表单输入框相对于祖父容器百分比宽度

使用容器查询单位cqw实现表单输入框相对于祖父容器百分比宽度

利用CSS容器查询单位cqw,表单输入框宽度可直接基于祖父容器计算,绕过中间包装器尺寸干扰,实现简洁响应式布局,无需硬编码或JavaScript,显著降低维护成本,提升嵌套结构下的布局灵活性。

时间:2026-07-09 07:00
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 热门数据榜