angular - 当你有一个 SSR Web 应用程序时如何处理图像延迟加载?
问题描述
所以,我现在阅读了一堆关于延迟加载图像的文章和谷歌文档,并找到了这个解决方案:
- 在受支持的标签中使用较新
loading="lazy"
的标签<img />
- 回退到不存在的交叉点观察器
到目前为止一切都很好,但是当我交付具有服务器端渲染的 Web 应用程序(在我的情况下是启用了 Angular Universal 的 Angular 8 应用程序)时,我无法验证我的客户端在渲染时使用哪个浏览器,只是当应用程序被渲染,然后延迟加载不起作用。
我正在使用 Natanel 的这个好方法:链接
import { Directive, ElementRef } from '@angular/core';
@Directive({ selector: 'img' })
export class LazyImgDirective {
constructor({ nativeElement }: ElementRef<HTMLImageElement>) {
const supports = 'loading' in HTMLImageElement.prototype;
if (supports) {
nativeElement.setAttribute('loading', 'lazy');
}
}
}
问题是这个 if 在服务器中总是假的。
解决方案
图像仍将作为单独的 http 调用下载,因此服务器上的逻辑不会像您预期的那样工作。做什么实际上取决于您如何处理“不受支持”的情况。
案例 1:您只想将图像保留为非懒惰。如果是这样 - 只需在服务器环境中使用此逻辑时添加属性。对于较新的浏览器 - 这些图像将是惰性的。对于较旧的浏览器 - 您的图像将像简单图像一样加载,就像您的指令逻辑一样。
案例 2:您想回退到IntersectionObserver
. 在这种情况下,在服务器上运行时只需跳过此指令中的逻辑。它将在客户端处理。
推荐阅读
- c++ - SDL_image.h 不工作,#include "sdl.h" :没有这样的文件或目录
- nuxt.js - 当我运行 nuxt porject 时,出现应用程序崩溃错误
- pyspark - 将结构数组分解为 pyspark 中的列
- reactjs - 无法使用来自 axios 请求的 request.form 在烧瓶 api 中获取请求正文
- html - 将多个 div 组合并对齐为一个形状
- c++ - 脚本运行后引用 lua 表/对象
- crystal-reports - 水晶报13 Oracle连接问题
- ios - GoogleMaps myLocation 标记(蓝点)在 iOS 13.1 上消失
- xamarin.forms - NuGet 降级警告
- macos - macOS Catalina 上缺少头文件