图像优化指令- NgOptimizedImage

Angular团队一直专注于改进框架,让一切变得更快,从编译器到我们的运行时代码,都得到了优化、最小化和摇树。

图像优化指令被添加到角15本着同样的精神。

它的作用:

  • 智能延迟加载:用户在页面加载时不可见的图像稍后会在用户向下滚动到该页面部分时加载。
  • 关键图像的优先级:首先加载基本图像(例如标题横幅)
  • 针对流行映像工具的优化配置:如果你使用的是CDN,该指令将自动从CDN中选择适当的图像大小,根据图像将显示在屏幕上的像素数优化下载大小。
  • 内置错误和警告:除了上述内置优化之外,该指令还具有内置检查,以确保开发人员在图像标记中遵循了推荐的最佳实践。

你所要做的就是使用ngSrc属性,而不仅仅是src

对于CDN优化,您可以使用其中之一现有4家供应商(或创建自己的),以便始终要求适当的图像大小。在我的例子,我使用Imgix所以我的配置看起来像这样:

仅从这些信息中,我们就可以知道Angular能够生成适当的图像url来获取尽可能小的图像来适合我们的div——如果你需要的只是200 x 100像素的图像,就不用再下载2000 x 1000像素的图像了:

NgOptimizedImage指令的一部分@angular /常见模块,就像ngFor而且ngIf,所以如果你使用这些指令,它已经是你工具箱的一部分了。

它也可以用作独立的指令没有进口CommonModule.我的例子是在斯塔克布利茨.的官方文档以及更多关于这个指令可以在这里找到

惰性加载独立组件

现在我们两个都讲了独立的组件而且惰性加载Angular模块,我们可以引入的概念延迟加载独立组件,这在Angular 14之前是不可能的。

从语法的角度来看,唯一的区别是我们使用loadComponent而不是loadChildren.在路由配置方面,其他一切保持不变:

现在,延迟加载模块的好处之一是它可以有自己的路由配置一次为不同的路由惰性加载多个组件

好消息是,我们还可以惰性加载多个独立组件。它所需要的只是创建一个指定的路由文件loadChildren像这样:

今天要分享的最后一件很酷的事情是:除了上面的语法,Angular现在还支持Typescript中的默认导出loadChildren而且loadComponent

这意味着前面的详细语法:

loadComponent: () => import('./admin/panel.component').then(mod => mod. adminpanelcomponent)},

现在可以变成:

loadComponent: () => import('./admin/panel.component')

如果该组件是其文件中的默认导出,则此方法有效,这意味着类声明看起来像这样:

导出默认类PanelComponent

这同样适用于loadChildren如果路由数组(或NgModule)是其文件中的默认导出。你可以看到斯塔克布利茨的例子

延迟加载以获得更好的Angular性能

在我们继续关于独立组件的系列文章之前,有必要先讨论一下创建高性能Angular应用的最重要工具:延迟加载

当我们使用惰性加载时,我们不是将我们的应用程序构建为一个单独的代码包,当用户在浏览器中访问应用程序时就会下载,而是将我们的代码分成几个不同的部分,然后下载在需要时按需提供

例如,在没有延迟加载的情况下,如果我们的应用程序Javascript代码有25mb大,那么浏览器必须下载、解析和运行这25mb的代码,这可能会大大降低移动设备或internet连接的速度。

相反,我们可以将应用程序划分为不同的模块包含组件、管道、指令和服务。在我们的例子中,让我们假设创建一个AdminModule其中包括应用程序Admin部分所需的所有功能。如果这个模块最终包含10mb的代码,并且我们对它使用惰性加载,那么应用程序的初始包将从25mb下降到15mb,这是一个很大的差异。

只有管理员用户必须下载管理部分的10mb代码,这对性能和安全性都很好(黑客无法对从未在他们的浏览器中下载过的代码进行逆向工程)。

惰性加载最好的部分是在我们的路由器配置中使用一行代码启动它:

上面的代码行会让Angular编译器自动创建一个代码包AdminModule并启用延迟加载该代码时/项目访问。就是这样!

TypeScript中的联合类型

昨天,我们讨论了任何未知的,以及使用这些类型的利弊。

今天,让我们关注联盟类型,是替代枚举在描述自定义类型时更加性能和灵活。让我们假设在应用程序中需要支持不同的货币。由于货币主要是一种代码/符号,我们可以采取以下简单的方法:

但这对我们帮助不大。例如,is any字符串有效货币?绝对不会。所以更好的选择是创建一个枚举并描述其中所有可能的值:

现在我们有了一个合适的类型来描述a货币是多少。但枚举并不是那么方便,因为它们不能在Angular组件模板中按原样使用一些解决方法.同样,它们被编译成JavaScript的怪物结构这毫无理由地增加了代码包的大小,因为我们在浏览器中没有运行时的类型检查。

输入联合类型

联合类型解决了所有这些问题。它们是轻量级的,根本不需要编译成任何东西,这意味着它们的性能总是比枚举(更少的代码下载+更少的代码解释=更快的应用程序在浏览器)。它们保证类型安全,可以由任何东西组成,包括字符串:

联合类型可以做更多的事情,比如对于给定的变量有更多的选项,而不仅仅是一个单一的类型:

Angular使用联合类型很多.例如,如果你曾经用过可以激活路由器保护,它的签名支持多达6种不同的返回类型,都是用联合类型定义的:

当特定子类型需要更多粒度时,我们可以使用联合类型的联合: