Elena v1.0.0-rc.7 – 漸進式 Web 元件庫

Elena v1.0.0-rc.7 – 漸進式 Web 元件庫

Elena v1.0.0-rc.7 是一個 2.6 kB 的函式庫,能夠實現漸進式 Web 元件——以 HTML + CSS 為先的自訂元素,無需 JavaScript 即可渲染,並可逐步水化。

Elena v1.0.0-rc.7 – 漸進式 Web 元件庫

重點

Elena v1.0.0‑rc.7 提供了一個小巧(2.6 kB)的函式庫,用於構建 漸進式 Web 元件——這些自訂元素會立即渲染其 HTML 與 CSS,然後僅在需要時才加入基於 JavaScript 的反應性,解決常見的 SSR、版面移位與框架相容性問題。


什麼是漸進式 Web 元件?

漸進式 Web 元件 (PWC) 是以兩層構造的原生 Custom Element:

  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‑Component 與框架元件的比較

「將 Web Components 視為 Custom Elements,而非框架式元件。許多不滿往往源於把它們當作 React/Vue 元件的直接替代品。」 – @akst

此評論強調,PWC 在與框架 同時 使用時表現最佳,而非作為直接替代品。

真實案例

「一篇關於 框架無關設計系統 的部落格展示了 Elena 在多框架元件庫中的使用案例。」 – @thex10

這與 Elena 讓單一元件庫可被 React、Vue、Svelte 等多框架使用的目標相符。

實用技巧

「您可以建立自訂的 <element-template> 標籤,讀取其中的 <template><script><style>,並即時註冊新的自訂元素。Mutation Observer 可在模板出現時即時升級它們。」 – @hyperhello

此類模式說明了 Custom Elements API 的彈性,而 Elena 正是基於此構建。

限制與批評

  • 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