为什么amp-html有一个隐藏body元素的css规则?



amp-html的示例页面,以及目前可用的少数amp-html站点,包含以下代码:

<style>body {opacity: 0}</style><noscript><style>body {opacity: 1}</style></noscript>

为什么会这样?如果时间紧迫,将支持javascript的客户机的不透明度设置为0似乎不是一个好主意。将不透明度设置为1的JavaScript可能不会被缓存,下载缓慢,或者根本无法加载(例如,中国倾向于阻止谷歌服务器,因此谷歌CDN可能有问题)。

干脆不改变不透明度,只使用JavaScript操作来改进页面不是更好吗?与完全不使用Javascript相比,使用amp-html有什么改进?

请注意,我们正在考虑至少改变一点以优化非js用例,但功能和理性将保持不变。

AMP页面确实需要AMP JS库来正确渲染。在正常情况下,让它们在没有它的情况下渲染会导致不和谐的体验,因为它下载得很快或已经缓存了。

最初,我们通过使主JS二进制同步来实现这一点。这有非常相似的效果,不需要不透明度样板。然而,这并不允许浏览器开始对文档应用样式——如果不是因为它在字体下载的关键路径上,因为浏览器只下载与样式匹配的字体,这并不是那么糟糕。

目前的方法存在问题,我们正在https://github.com/ampproject/amphtml/issues/323跟踪以进一步优化它。

更新: AMP现在使用CSS动画来避免依赖JS。

为什么amp-html有一个隐藏body元素的css规则

AMP使用来自Web组件的自定义元素。例如,组件amp-img替换每个标记<img>:

这些组件可以取代规范中不直接允许的HTML5元素,如amp-img和amp-video。[源]

与JavaScript应用程序一样,最好在初始DOM操作期间隐藏页面。

使用amp-html比根本不使用Javascript有什么改进?

AMP设法以最佳顺序惰性加载资源。它是为大页面上的丰富内容而设计的:

但是我们如何从好的变成,比如说,即时的?我们会作弊:)AMP文档从头开始设计,以有效地预渲染。浏览器早就通过<link rel=prerender>标签支持预渲染,但他们需要对这种机制保持保守,因为预渲染可能会很昂贵。使用AMP HTML,我们增加了告诉文档的能力:渲染自己,但只在可见的部分,只有那些不是CPU密集型的元素,以尽量减少预渲染的成本。有了这种机制,AMP文档的引用者可以在用户采取更激进的行动之前启动文档的呈现,因此在许多情况下,当用户单击时,文档将完成呈现。[源]

最新更新