Использование директивы NgOptimizedImage для реализации загрузки изображений в Angular
Директива NgOptimizedImage
в Angular отвечает за реализацию загрузки изображений, сохраняя высокую производительность. Она доступна в Angular v14.2.0. Директива помечена как standalone
и может быть импортирована в standalone
компоненты и модули.
Чтобы ее использовать, мы должны заменить атрибут src
Вашего изображения на rawSrc
:
import { NgOptimizedImage } from '@angular/common';
@Component({
standalone: true,
imports: [NgOptimizedImage],
template: `
<!-- видимая область страницы -->
<img rawSrc="https://picsum.photos/200/300" width="200" height="300" priority />
<!-- ниже видимой области страницы -->
<img rawSrc="https://picsum.photos/300/300"
style="margin-top: 300vh"
width="300"
height="300" />`,
})
export class LoginPageComponent {}
Директива предоставит нам следующие преимущества LCP(Скорость загрузки основного контента):
Атрибут
loading
для изображений ниже видимой области страницы будет установлен наlazy
, в то время как атрибутloading
для изображений в видимой области страницы будетeager
.Она гарантирует приоритетность для изображений в видимой области страницы. Это значит, что будет установлено значение
high
для атрибутаfetchpriority
. Значение по умолчанию —default
.Она гарантирует, что изображения в видимой области страницы будут иметь соответствующий тег
preconnect
.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>MyNgApp</title>
<base href="/">
<!-- ?? ?? ?? ?? ?? ?? -->
<link rel="preconnect" href="https://picsum.photos">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
<app-root></app-root>
</body>
</html>
Она гарантирует, что ширина и высота будут установлены таким образом, чтобы предотвращались сдвиги макета.
Слово «гарантирует» означает, что директива предупредит Вас, если это не так.
Загрузчики изображений
Загрузчик — это функция, которая генерирует соответствующий URL-адрес ресурса для данного файла изображения. Загрузчик по умолчанию возвращает src
, который мы передаем для rawSrc
. Также Angular предоставляет различные загрузчики для сторонних сервисов изображений:
Cloudflare Image Resizing
Сloudinary
ImageKit
Imgix
Чтобы их использовать, мы должны передать фабрику провайдеров для выбранного сервиса в массив провайдеров:
import { NgOptimizedImage, provideImgixLoader } from '@angular/common';
NgModule({
providers: [
provideImgixLoader("https://my.base.url/", {
ensurePreconnect: boolean
})
],
bootstrap: [AppComponent]
})
export class AppModule { }
Мы можем создать собственный загрузчик, переопределив провайдер IMAGE_LOADER
:
import { ImageLoaderConfig, IMAGE_LOADER, NgOptimizedImage } from '@angular/common';
@NgModule({
providers: [{
provide: IMAGE_LOADER,
useValue: (config: ImageLoaderConfig) => {
return `https://example.com/images?src=${config.src}&width=${config.width}` }
}
],
bootstrap: [AppComponent]
})
export class AppModule { }
Дополнительная информация про API: