你知道吗?Angular 9 就要来啦!Angular 是基于 TypeScript 的 Web 应用程序框架,Angular 9 的一系列更新将为开发者们带来不小的影响。本文将主要从最新功能、重大更改、Angular 组件等方面对 Angular 9 的相关动态进行详解。
Angular 9 RC 版已经发布了,这对 Angular 开发人员来说真是激动人心的时刻——我针对的不是 Angular 9 RC 的发布,我说的是 Ivy,Ivy 现在是 Angular 中的默认渲染引擎。
相信我,如果你还没觉得有多兴奋,请看看Mathias Raacke的推文:一个Hello World应用才有7KB大小!
下面我们就来研究一下,看看除了Ivy还有哪些东西。
对指令和组件来说,直到Angular 8时装饰器对基类都是可选的。这适用于未使用@Injectable装饰器的服务。
export class BasePlain {
constructor(private vcr: ViewContainerRef) {}
}
@Directive({selector: '[blah]'})
export class DerivedDir extends BasePlain {}
引擎变成Ivy后这种类也需要装饰器。为了处理这种情况,使用ng update迁移时装饰器将作为迁移的一部分添加进来。请阅读此处内容以获取详情,有少数情况是不会被照顾到的。
下面的代码你可能已经用过很多次了,但是我们从来没有考虑过[formControlName]=“i”的工作机制;因为它接受字符串类型的值,所以没有fullTemplateTypeCheck也可以。但是在Ivy中这样做会失败。为了确保下面的语法仍然有效,formControlName可以接受string | number类型的值。
<div formArrayName="tags">
<div *ngFor="let tag of tagsArray.controls; index as i">
<input [formControlName]="i">
</div>
</div>
在Angular 8中有一项重大更改,TestBed.get不再接受字符串值;现在团队决定回滚更改,因为它影响到了更大的应用程序基础部分。现在我们有了类型安全的版本TestBed.inject,TestBed.get已弃用。
TestBed.get(ChangeDetectorRef) // returns any
TestBed.inject(ChangeDetectorRef) // returns ChangeDetectorRef
Angular 8中引入的另一项重大更改,是ViewChild需要static标志。静态属性仍然存在,但使用假值时我们不再需要传递这个属性。使用ng update更新到Angular 9后,迁移会移除所有位置使用的{ static: false }。
@ViewChild(ChildDirective) child: ChildDirective;
@ViewChild(ChildDirective, { static: false }) child: ChildDirective; // similar to above code
要使用@angular/localize,我们现在可以运行ng add @angular/localize,这条命令会安装软件包并将必要的导入添加到polyfills中,这也是它工作时需要的。
在使用Angular时常常会遇到一个问题:“为什么不严格检查模板的类型”。这是之前的情况,但是现在对于*ngIf、*ngFor这样的指令,甚至是管道都会是严格的。有3种模式可用于检查模板的类型:
更多详情请参阅这篇文档。
新版Angular现在需要Typescript 3.6版本。下面是Lars Gyrup Brink Nielsen总结的Angular版本和对应的TypeScript版本支持。
Angular CLI、Anuglar、Node.js和TypeScript兼容性列表。
如果你是Angular库的所有者,那么你很可能已经用过Angular 9中的ModuleWithProviders了。现在必须使用泛型ModuleWithProviders类型来指示Angular模块类型。
新版已经添加了迁移原理图(Schematic),因此ng update将负责这部分的迁移。
之前的代码:
@NgModule({ ...}) export class MyModule {
static forRoot(config: SomeConfig): ModuleWithProviders {
return {
ngModule: SomeModule,
providers: [{ provide: SomeConfig, useValue: config }]
};
}
}
迁移后:
@NgModule({ ...})
export class MyModule {
static forRoot(config: SomeConfig): ModuleWithProviders<SomeModule>
{
return {
ngModule: SomeModule,
providers: [{ provide: SomeConfig, useValue: config }]
};
}
}
ng update负责所有代码的迁移,但不适用于Angular库。在Angular 9中,ng update会将所有迁移原理图也应用于库项目。这对Angular库的作者来说是很重要的,可以让你的代码与最新更改保持同步。
如果你使用过Angular中的popup,则必须使用这个属性。有了它,你才能在动态加载组件后无需在模板中引用它。现在改用Ivy后就用不着它了。
Angular现在不再依赖tslib。在早期版本的Angular中它是必需的,并且是依赖项的一部分。如果你不用Angular CLI,则可能需要安装这个包。
opts: { warnOnDeprecatedNgFormSelector?: "never" | "once" | "always"; }
在ngsw-config.json中移除了versionedFiles属性
之前:
"assetGroups": [
{
"name": "test",
"resources": {
"versionedFiles": [
"/**/*.txt"
]
}
}
]
之后:
"assetGroups": [
{
"name": "test",
"resources": {
"files": [
"/**/*.txt"
]
}
}
]
完整指南请参阅官方文档。本文没有涉及Ivy的介绍内容,因为这是一个非常大的主题,我们将很快写一篇博文来介绍Ivy的所有功能。
新增检查可以验证所安装的CLI是否为最新发布的版本。如果不是最新版,那么在运行ng update时将安装最新版本,作为临时包来运行迁移。
之前我们使用ng build时可以使用–configuration来传递配置,一个问题是,如果我想覆盖某些配置,我们必须复制整个配置并创建一个新条目才能使用它。
现在可以使用ng build --configuration=prod,testing这样的写法,这样在testing配置中我们就可以只传递需要覆盖的配置。
另一项更新针对Angular库的作者,你可以使用ng add来指定是否应将包添加到依赖项。
你可以在package.json中指定以下选项:
ng-add : {
"save": false | true | 'dependencies' | 'devDependencies'
}
目前来说,当我们使用ng gc user时,它将使用组件类UserComponent生成一个文件,其类型选项可让你定义要创建的组件类型;例如ng gc user --type=“dialog”将创建一个组件,其类名称为UserDialog。
目前来说添加拦截器都是手动的。在Angular 9中,我们将能够使用ng g i custom创建CustomInterceptor类。
为了生成app-shell,我们必须传递–clientProject;它现在是可选的。如果没有提供,它将考虑默认项目。
如果我们使用–minimal=true创建应用程序,它将跳过端到端和单元测试配置。但当我们使用ng g生成component/pipe/service时,它会添加一个spec.ts文件。从Angular CLI 9开始这个问题已经解决了。
现在要创建一个可以有multiSelect的prompt,我们必须提供其他许多选项。在Angular 9中,可以像下面的配置一样简化这里的步骤。
test: {
type: 'array',
'x-prompt': {
'type': 'list',
'multiselect': false,
'items': [
{
'value': 'one',
'label': 'one'
},
{
'value': 'two',
'label': 'two'
},
],
'message': 'test-message',
},
}
npm中提供了NPM_CONFIG_USERCONFIG和NPM_CONFIG_GLOBALCONFIG变量。当提供这些变量时,Angular CLI会首选它们而非全局.npmrc文件。请参阅npm文档以获取更多细节。
有一个新的剪贴板组件可用,它是@angular/cdk系列的一部分。
想要了解更多实现细节,请阅读Tim Deschryver的博客文章。
在早期版本中需要hammerjs来添加手势支持。它现在是可选的,并且内部使用的所有实现都已移除,你可以使用@angular/platform-browser中的HammerModule。
@angular/google-maps包现已发布,所以集成谷歌地图不再是一项艰巨的任务了。这个包已经在多种设备上进行了测试。你可以参考Tim Deschryver的博客文章了解实现细节。
终于看到Ivy更加稳定并且可以用于生产了,我感到非常兴奋,相信你也很会很激动。Angular CLI新增了许多很棒的功能,提升了我们的工作效率。很高兴看到Angular Material中添加了一些很棒的组件,例如地图和剪贴板。相信我,现在有了Ivy,我们可以对未来抱有更大的期待,因此Angular无疑会迎来激动人心的时刻,你也应该为此感到振奋。
作者介绍: Santosh Yadav拥有10多年的经验,他是Angular和NgRx的开源贡献者,并且是AngularInDepth和DotNetTricks的作者。
原文链接: https://blog.angularindepth.com/exciting-time-ahead-be-ready-for-angular-9-b3dbb4078c47
领取专属 10元无门槛券
私享最新 技术干货