O with occluded right edge to appear also as a C Web Widget 指南 文档 Toggle darkmode

深入: 可用性

AMP 的性能优先的工程设计为 Web Widget 的诞生提供了很多灵感,它的优化策略对采用 Web Widget 的网站也同样有效,一些推荐设置:

  • HTML 中的布局、文本等关键元素通过服务器渲染,而 Web Widget 应用由浏览器渲染
  • HTML 中的布局、文本等关键元素的 CSS 样式内嵌入在页面中
  • 文本等需要支持 SEO 的内容使用插槽
  • 为 Web Widget 容器预设置尺寸,避免渲染回流
  • 为 Web Widget 容器开启懒加载
  • 为 Web Widget 容器提供占位符
  • 为 Web Widget 容器提供后备
  • 为 Web Widget 容器的运行时文件采用异步加载

更多相关信息可以参考 AMP 的官网。

懒加载

类似 <img> 标签,使用 loading="lazy" 属性可以让用户即将看到的时候才加载,而不会占用网络请求。

<web-widget src="app.widget.js" loading="lazy"></web-widget>

占位符

<placeholder> 元素将充当 Web Widget 容器的占位符号。用途:

  • 预览图片或文本
  • 骨架占位或 loading 动画
<web-widget src="app.widget.js">
  <placeholder>
    <img src="preview.jpg" />
  </placeholder>
</web-widget>

后备

<fallback> 元素将充当 Web Widget 容器的后备占位符号。用途:

  • 浏览器不支持某个元素
  • 内容未能加载(例如,推文被删除)
  • 图片类型不受支持(例如,并非所有浏览器都支持 WebP)
<web-widget src="video.js">
  <fallback hidden>
    <p>This browser does not support the video element.</p>
  </fallback>
</web-widget>

当 Web Widget 应用变更为以下任意状态将会触发 fallback 元素显示:

  • load-error
  • bootstrap-error
  • mount-error

搜索引擎优化

因为 Web Widget 容器是一个标准的 Web Component,因此它的 SEO 问题本质上是 JavaScript 和 Web Component 的 SEO 问题。社区中有两种实践方式:

Web Widget 容器的 SSR 渲染服务即将推出。

预加载

应用将在 bootstrap 的生命周期完成挂载前的准备工作,例如样式、图片、数据的加载,因此我们可以使用容器的 bootstrap() 方法来完成应用的预加载。

const preload = (async () => {
  const widget = document.createElement('web-widget');
  widget.inactive = true;
  widget.src = 'app.widget.js';
  document.body.appendChild(widget);
  await widget.bootstrap();
  return widget;
})();