Elena v1.0.0-rc.7 – 渐进式 Web 组件库

要点

Elena v1.0.0‑rc.7 提供了一个体积极小(2.6 kB)的库,用于构建 渐进式 Web 组件——这些自定义元素会立即渲染其 HTML 和 CSS,随后仅在需要时才添加基于 JavaScript 的响应性,从而解决常见的 SSR、布局偏移和框架兼容性问题。


什么是渐进式 Web 组件?

渐进式 Web 组件 (PWC) 是一种原生自定义元素,由两层构成:

  1. 基础层 – 静态 HTML 和 CSS,立即渲染,无需任何 JavaScript。
  2. 增强层 – 可选的 JavaScript,用于添加响应性、事件处理和高级模板功能。

PWC 可分为三种设计类别:

  • 复合组件 – 包裹用户提供的标记;所有 HTML/CSS 位于 Light DOM 中。
  • 原始组件 – 自包含;其 HTML 和 CSS 一起输出到 Light DOM 中。
  • 声明式组件 – 混合方式,可使用 Declarative Shadow DOM 实现更强的封装。

"Elena 并不强制这种分类……它们都是普通的 Web 组件,您可以自行决定如何构建。" – Elena 文档。

这种分类是一种设计理念,而非库的限制;开发者可以根据使用场景自由组合。


Elena 的核心承诺

特性 为何重要
极其轻量 2.6 kB(已压缩并 gzip)几乎不产生加载负担。
渐进式增强 HTML + CSS 先渲染,避免无样式内容闪现和布局偏移。
默认可访问性 使用语义化 HTML;没有 Shadow DOM 障碍导致辅助技术无法访问内容。
基于标准 基于原生 Custom Elements、<template><slot>,以及可选的 Declarative Shadow DOM 构建。
响应式更新 属性和状态的变化会触发批量重新渲染,无需虚拟 DOM。
作用域样式 简单的 CSS 封装,无需复杂的变通方案。
SSR 友好 没有 render() 方法的组件可完全在服务器渲染;可选的 @elenajs/ssr 提供水合工具。
零依赖且无锁定 可与任何框架(React、Vue、Svelte 等)或完全不使用框架一起使用。

Elena 抽象了跨框架属性/特性同步、事件委托和生命周期处理所需的底层实现,让团队专注于组件逻辑。


服务端渲染模型

  • HTML 优先渲染 – 由于 PWC 主要是 HTML/CSS,服务器可以在不执行 JavaScript 的情况下输出最终标记。
  • 没有 render() 的组件 – 开箱即全 SSR 兼容。
  • 带有 render() 的组件 – 提供部分 SSR:初始标记是静态的,但完整交互需要客户端水合(或使用可选的 @elenajs/ssr 工具实现完整水合)。
  • Declarative Shadow DOM – 在需要更强隔离且仍保持 SSR 兼容的场景下受支持。

包结构

Elena 被拆分为 @elenajs 作用域下的 13 个 npm 包。最常用的有:

  • @elenajs/core – 用于构建 PWC 的运行时。
  • @elenajs/bundler – 用于打包 Elena 组件库的工具。
  • @elenajs/cli – 脚手架,用于创建新组件。
  • @elenajs/ssr – 可选的服务端渲染工具。
  • @elenajs/components – 随仓库提供的示例 PWC。

来自 Hacker News 的社区洞察

Web 组件 vs 框架组件

"将 Web 组件视为 Custom Elements,而不是框架式组件。对它们不满往往源于把它们当作 React/Vue 组件的直接替代品。" – @akst

该评论强调,PWC 在配合框架使用时表现出色,而不是直接替代框架组件。

实际使用案例

"一篇关于 跨框架设计系统 的博客展示了 Elena 在多框架组件库中的使用案例。" – @thex10

实用技巧

"你可以创建一个自定义 <element-template> 标签,它读取内部的 <template><script><style>,并即时注册一个新的自定义元素。Mutation Observer 可以在模板出现时进行升级。" – @hyperhello

限制与批评

  • Declarative Shadow DOM 复杂性 – 一些开发者认为相较于普通库,它增加了不必要的开销。(@parasti)
  • CSS 框架集成 – 将 Bootstrap、Bulma 等框架包裹在 shadow host 中可能会破坏选择器级联。(@000ooo000)
  • 全局标签名注册 – 自定义元素需要全局唯一的标签名,这在大型团队中可能成为障碍。(@wildpeaks)
  • 缺少性能对比 – 最近一次提交删除了将 Elena 与 Lit、Stencil、Enhance 对比的 FAQ 部分,导致公开基准测试缺失。(@cube00)

这些观点凸显了 Elena 可能需要更清晰文档或工具支持的方面。


Elena 与 Lit 的区别

  • HTML 优先理念 – Lit 通过 JavaScript 模板渲染;Elena 在任何脚本运行之前优先输出静态 HTML/CSS。
  • 零运行时依赖 – Lit 附带一个小型运行时;Elena 的核心无需任何依赖。
  • 内置 SSR 友好 – Elena 的默认组件无需额外配置即可 SSR,就绪;而 Lit 通常需要额外的适配器。

快速开始

  1. 安装核心运行时npm i @elenajs/core
  2. 脚手架创建组件npx @elenajs/cli create my-button – 生成一个 Light‑DOM 组件,附带可立即渲染的 HTML/CSS 文件。
  3. 添加交互性(可选):在组件的 JS 文件中导入 @elenajs/core 并定义响应式属性。
  4. 测试 SSR:使用 @elenajs/ssr CLI 预渲染页面,验证标记在没有 JavaScript 的情况下出现。
  5. 在任意框架中使用:导入编译后的组件,直接在 React、Vue 或普通 HTML 中使用 <my-button>

结论

Elena v1.0.0‑rc.7 提供了一条务实且基于标准的路径,以实现 渐进式 Web 组件,这些组件可即时渲染、保持可访问性,并且能够跨框架集成而无需沉重的运行时开销。虽然社区反馈指出了一些挑战——尤其是 CSS 框架兼容性以及缺乏性能基准——但该库极小的体积和 HTML 优先的方式,使其成为构建跨框架设计系统的团队的有力选择。

Sources