Lit Web Components 开发框架技术调研
基于 Web 标准构建跨框架组件的主流开发库
Lit 让开发者以声明式和响应式方式构建标准 Web Components,适合设计系统、跨框架组件库和长期复用组件。
Lit Web Components 开发框架技术调研
Lit 是由 Google Chrome 团队维护的轻量级 Web Components 开发库。它通过简化标准 Web Components(Custom Elements、Shadow DOM、HTML Templates)的开发流程,让开发者能够以声明式、响应式的方式构建可在任何框架或无框架环境中使用的组件。Lit 的核心理念是拥抱和增强 Web 标准,而非发明新的框架专有 API。2026 年,Lit 3.3.x 持续稳定更新,已成为 Web Components 生态中事实上的主流框架选择。
一、 基本信息
| 维度 | 关键指标 / 描述 |
|---|---|
| 技术方向 | Web Components 开发库 / 标准优先 / Shadow DOM / 跨框架组件 / 轻量级 |
| 开源协议 | BSD-3-Clause License |
| 官方网站 | https://lit.dev/ |
| GitHub 仓库 | lit/lit |
| GitHub Stars | 19,000+(lit 主仓库) |
| 主要维护者 | Google Chrome 团队 |
| 首次发布 | 2018 年(LitElement 1.0);Lit 2.0 于 2021 年发布;Lit 3.0 于 2023 年发布 |
| 最新版本 | Lit 3.3.3(2026 年 5 月 13 日) |
| 生态成熟度 | 高(Web Components 生态事实标准,Google 内部大规模使用) |
| 运行要求 | 现代浏览器(支持 Custom Elements 和 Shadow DOM)/ Node.js 18+(构建和 SSR) |
二、 版本历史与 2026 年现状
| 版本 | 发布时间 | 关键里程碑 |
|---|---|---|
| Lit 3.3.3 | 2026 年 5 月 | 当前稳定版,持续补丁和性能优化。 |
| Lit 3.0 | 2023 年 10 月 | 移除 IE11 支持,ES2021 模块,移除废弃 API,更小 bundle 和更快渲染。 |
| Lit 2.0 | 2021 年 | 整合 lit 包,引入 lit-html 2.0,优化 SSR 支持。 |
| LitElement 1.0 | 2018 年 | 首个稳定版本,确立基于标准 Web Components 的组件模型。 |
2026 年核心趋势
- Web Components 生态核心:Lit 已成为 Web Components 生态中最主流的框架选择。
- 现代技术栈的一部分:Lit 被纳入 2025 年"现代 Web Components 技术栈"推荐。
- 性能竞争力:Lit 的性能和体积被认为与 Solid、Svelte、Preact 处于同一水平。
- @lit/react 成熟:React 集成方案成熟,使 Lit 组件在 React 项目中使用体验接近原生。
- Lit 编译器进展:实验性编译器持续开发,有望带来编译时优化。
- Google 持续投入:Google 在搜索、地图、YouTube 等产品中大量使用 Lit,确保长期发展。
三、 技术定位与简介
Lit 的定位是基于 Web 标准的组件开发库。与 React、Vue、Angular 等框架不同,Lit 不创建新的组件模型或运行时,而是构建在浏览器原生标准之上:
- Custom Elements:组件是标准的自定义 HTML 元素(如
<my-element>)。 - Shadow DOM:提供样式隔离和封装。
- HTML Templates:使用
<template>和 tagged template literals 高效渲染。
Lit 的核心理念:
- 标准优先:拥抱现有 Web 标准,组件不锁定到任何框架。
- 框架无关:构建的组件可在 React、Vue、Angular、Svelte 或纯 HTML 中使用。
- 轻量运行时:核心运行时仅约 5KB(gzip)。
- 未来兼容:基于标准构建,组件在浏览器标准演进中保持兼容。
Lit 特别适合构建跨框架组件库、设计系统、微前端组件和需要在不同技术栈中复用的组件。
四、 快速上手安装说明
1. 创建 Lit 项目
npm create vite@latest my-lit-app -- --template lit-ts
cd my-lit-app
npm install
npm run dev2. 标准项目结构
my-lit-app/
├── src/
│ ├── my-element.ts # 自定义元素组件
│ ├── components/ # 可复用组件
│ ├── styles/ # 共享样式
│ └── index.ts # 入口文件
├── index.html
├── vite.config.ts
├── tsconfig.json
└── package.json3. 核心开发命令
npm run dev # 启动开发服务器
npm run build # 生产构建
npm run preview # 预览生产构建
npm run test # 运行测试4. vite.config.ts 推荐配置
// vite.config.ts
import { defineConfig } from 'vite'
export default defineConfig({
build: {
lib: {
entry: 'src/my-element.ts',
formats: ['es', 'cjs'],
fileName: (format) => `my-element.${format}.js`
},
rollupOptions: {
external: /^lit/
}
}
})5. 第一个 Lit 组件
// src/my-element.ts
import { LitElement, html, css } from 'lit'
import { customElement, property } from 'lit/decorators.js'
@customElement('my-element')
export class MyElement extends LitElement {
// 响应式属性:外部可设置
@property({ type: String }) name = 'World'
// 内部状态
@property({ type: Number }) count = 0
static styles = css`
:host {
display: block;
padding: 1rem;
font-family: sans-serif;
}
button {
background: #007bff;
color: white;
border: none;
padding: 0.5rem 1rem;
cursor: pointer;
}
`
render() {
return html`
<h1>Hello, ${this.name}!</h1>
<p>Count: ${this.count}</p>
<button @click=${this._increment}>+1</button>
`
}
private _increment() {
this.count += 1
}
}
declare global {
interface HTMLElementTagNameMap {
'my-element': MyElement
}
}<!-- index.html -->
<!DOCTYPE html>
<html>
<head>
<script type="module" src="/src/my-element.ts"></script>
</head>
<body>
<my-element name="Lit"></my-element>
</body>
</html>五、 核心特性
1. 基于标准 Web Components
Lit 构建标准的 Custom Elements,可在任何框架、无框架或 HTML 中使用。组件注册后,可以像原生 HTML 元素一样使用。
2. lit-html 模板引擎
lit-html 使用 tagged template literals 作为模板语法:
- 是标准 JavaScript,无需编译器。
- 利用浏览器原生模板解析。
- 通过高效的 DOM diffing 实现精准更新。
import { html, render } from 'lit'
const name = 'Lit'
render(html`<h1>Hello ${name}</h1>`, document.body)3. 响应式属性
@property 装饰器声明响应式属性,属性变化自动触发组件更新:
@property({ type: String, reflect: true }) name = 'World'type:属性类型转换。reflect:是否将属性反射回 DOM。attribute:自定义属性名映射。
4. 内部状态
@state 装饰器声明内部状态,外部不可设置但变化会触发更新:
@state() private _count = 05. Shadow DOM 样式隔离
Lit 默认使用 Shadow DOM 实现样式隔离:
- 组件样式不影响外部。
- 外部样式不影响组件内部(除非使用 CSS 自定义属性)。
- 通过
:host选择器设置组件根样式。
6. 极小运行时
核心运行时仅约 5KB(gzip),适合嵌入和低带宽场景。
7. TypeScript 优先
Lit 完全使用 TypeScript 编写,提供完整的类型支持,包括 HTMLElementTagNameMap 扩展。
8. SSR 支持
@lit-labs/ssr 提供服务端渲染能力,支持在 Node.js 中渲染 Lit 组件为 HTML 字符串。
9. 装饰器语法
Lit 提供装饰器简化组件定义:
@customElement('tag-name'):注册自定义元素。@property():声明响应式属性。@state():声明内部状态。@query()/@queryAll():查询 DOM 节点。@eventOptions():事件选项。
10. 生命周期回调
LitElement 继承自 HTMLElement,提供标准生命周期和额外回调:
connectedCallback()/disconnectedCallback():挂载/卸载。firstUpdated():首次更新后。updated():每次更新后。willUpdate():更新前。render():渲染模板。
六、 适用场景
1. 黄金适用场景
- 跨框架组件库:构建可在 React、Vue、Angular、Svelte 中使用的通用组件库。
- 设计系统:企业设计系统的基础——标准 Web Components 确保跨团队、跨项目复用。
- 微前端架构:作为跨应用的独立微前端组件。
- CMS 和编辑器组件:需要跨框架使用的富文本编辑器、表单组件。
- 遗留系统升级:在 jQuery 等遗留项目中逐步引入现代组件。
- 邮件/嵌入式组件:标准 Web Components 的兼容性确保广泛支持。
- 浏览器扩展:浏览器扩展 UI 组件。
- 独立分发组件:通过 CDN 分发、无需构建即可使用的组件。
2. 局限适用场景
- 复杂 SPA 应用:Lit 是组件库,不是应用框架。复杂路由、状态管理、数据流需要配合其他框架或自行构建。
- 快速原型开发:相比 React/Vue 的完整生态,Lit 缺少路由、状态管理等开箱即用能力。
- 强动态交互应用:虽然 Lit 可以构建交互组件,但缺少 React/Vue 那样的响应式生态和开发工具。
七、 技术亮点
1. 标准优先(Standards-First)
Lit 的最大不同是拥抱现有 Web 标准。组件就是标准的 Custom Elements,使用标准的 Shadow DOM 和 HTML Templates。这意味着:
- 组件不锁定到任何框架。
- 组件在未来 Web 标准演进中保持兼容。
- 组件可以被任何框架(甚至无框架)消费。
2. lit-html 高效渲染
lit-html 使用 tagged template literals,是标准 JavaScript,无需编译器。它通过智能的 DOM diffing 只更新变化的部分,避免不必要的 DOM 操作。
3. Shadow DOM 天然封装
Lit 默认使用 Shadow DOM,提供样式隔离和 DOM 封装。这使组件具有:
- 样式不泄漏。
- 内部结构不暴露。
- 可组合性和可维护性更强。
4. 跨框架复用能力
Lit 组件可以在任何框架中使用。官方提供 @lit/react 包装器,让 Lit 组件在 React 中像原生组件一样使用。
5. Google 生产验证
Lit 在 Google 内部被广泛使用,包括 Google 搜索、Google Maps、YouTube 等产品。这确保了 Lit 在生产环境中的可靠性和性能表现。
6. Lit 3.x 现代化
Lit 3.0 移除 IE11 支持,采用 ES2021 模块,移除废弃 API,进一步减小 bundle 并提升渲染性能。
八、 核心概念与架构
1. Custom Elements + LitElement
Lit 组件继承自 LitElement,后者继承自 HTMLElement。组件通过 @customElement 注册为标准的自定义元素。
digraph Lit_Architecture {
rankdir=TB
node [shape=box, style="rounded,filled", fillcolor="#f5f3ff"]
HTMLElement [label="HTMLElement"]
LitElement [label="LitElement"]
MyElement [label="MyElement (Custom Element)"]
ShadowRoot [label="Shadow Root"]
litHTML [label="lit-html Template"]
HTMLElement -> LitElement
LitElement -> MyElement
MyElement -> ShadowRoot [label="attachShadow"]
ShadowRoot -> litHTML [label="render"]
}2. 响应式属性与更新周期
digraph Lit_Update {
rankdir=LR
node [shape=box, style="rounded,filled", fillcolor="#fef3c7"]
Property [label="Property Set"]
Request [label="requestUpdate()"]
Schedule [label="Schedule Update"]
Render [label="render()"]
DOM [label="DOM Patch"]
Updated [label="updated()"]
Property -> Request
Request -> Schedule
Schedule -> Render
Render -> DOM
DOM -> Updated
}3. Shadow DOM 样式隔离
:host {
display: block;
--my-color: blue;
}
:host([theme="dark"]) {
background: black;
color: white;
}
::slotted(*) {
/* 针对 slot 内容的样式 */
}4. 属性与属性映射
Lit 自动处理 properties 和 attributes 之间的映射:
@property({ type: String }) name会监听name属性变化。- 使用
reflect: true可以将 property 变化反射回 attribute。
5. 事件处理
Lit 使用 @event-name 语法绑定事件:
render() {
return html`
<button @click=${this._handleClick}>Click</button>
<input @input=${this._handleInput} />
`
}6. 插槽(Slots)
Lit 使用标准 <slot> 元素支持内容分发:
render() {
return html`
<div class="card">
<slot name="header"></slot>
<slot></slot>
</div>
`
}<my-card>
<h2 slot="header">Title</h2>
<p>Content</p>
</my-card>九、 技术局限与边界
-
不是应用框架: Lit 是组件库,不是完整的应用框架。复杂路由、状态管理、数据流需要配合其他框架或自行构建。
-
Shadow DOM 的样式限制: Shadow DOM 虽然提供样式隔离,但也带来了一些限制:外部样式难以深入组件内部(除非使用 CSS 自定义属性),slot 内容样式控制有限。
-
浏览器兼容性: Lit 3.x 不支持 IE11,需要现代浏览器。虽然主流浏览器都支持 Custom Elements 和 Shadow DOM,但某些企业环境可能需要 polyfill。
-
SSR 生态仍在发展:
@lit-labs/ssr提供 SSR 支持,但相比 Next.js、Nuxt 的成熟 SSR 生态,Lit 的 SSR 方案和工具链仍在完善。 -
表单集成复杂度: 将 Lit 组件与标准表单集成(如表单验证、提交)需要额外处理,因为 Shadow DOM 中的表单元素不会自动参与父表单。
-
开发工具相对简单: 相比 React/Vue 的 DevTools 生态,Lit 的调试工具相对简单,主要依赖浏览器原生 DevTools 和 Lit 的少量扩展。
十、 生态地图
Lit 生态围绕 Web Components 标准、跨框架集成和样式工具构建:
digraph Lit_Ecosystem {
rankdir=TB
node [shape=box, style="rounded,filled", fillcolor="#f0f9ff"]
Lit [label="Lit Core", fillcolor="#bae6fd"]
Lit -> litHTML [label="lit-html"]
Lit -> React [label="@lit/react"]
Lit -> SSR [label="@lit-labs/ssr"]
Lit -> Motion [label="@lit-labs/motion"]
Lit -> Task [label="@lit-labs/task"]
Lit -> UI [label="UI Libraries"]
Lit -> Tools [label="Dev Tools"]
UI -> Shoelace [label="Shoelace"]
UI -> Material [label="Material Web Components"]
UI -> Ionic [label="Ionic (partially)"]
Tools -> OpenWC [label="Open WC"]
Tools -> Storybook [label="Storybook"]
}十一、 生态集成
| 领域 | 推荐方案 | 集成说明 |
|---|---|---|
| 底层模板 | lit-html | Lit 的底层模板引擎,也可独立使用。 |
| React 集成 | @lit/react | 官方 React 包装器,让 Lit 组件在 React 中像原生组件使用。 |
| Vue 集成 | vue-custom-element | Vue 的自定义元素包装器,或直接使用 Lit 组件。 |
| Angular 集成 | CUSTOM_ELEMENTS_SCHEMA | Angular 可直接使用 Custom Elements。 |
| SSR | @lit-labs/ssr | 实验性 SSR 支持,可在 Node.js 中渲染 Lit 组件。 |
| 动画 | @lit-labs/motion | Lit 动画效果库。 |
| 异步任务 | @lit-labs/task | 异步任务管理,自动处理 loading/error/success。 |
| UI 组件库 | Shoelace / Material Web Components | 基于 Lit 构建的主流 Web Components 库。 |
| 样式 | CSS Custom Properties / Shadow DOM | 通过 CSS 变量穿透 Shadow DOM。 |
| 测试 | Web Test Runner + Playwright | 测试 Web Components 的标准方案。 |
| 组件文档 | Storybook | 支持 Web Components 组件开发。 |
| 构建工具 | Vite / Webpack / Rollup | Lit 可与任何现代构建工具集成。 |
十二、 开发与工程化
1. TypeScript 严格模式
Lit 完全使用 TypeScript,建议开启严格模式:
{
"compilerOptions": {
"strict": true,
"experimentalDecorators": true,
"useDefineForClassFields": false,
"moduleResolution": "bundler"
}
}注意:Lit 装饰器需要 experimentalDecorators: true 和 useDefineForClassFields: false。
2. 组件库项目结构
my-design-system/
├── src/
│ ├── components/
│ │ ├── button/
│ │ │ ├── button.ts
│ │ │ ├── button.styles.ts
│ │ │ └── button.test.ts
│ │ └── card/
│ ├── tokens/ # 设计 token
│ ├── index.ts # 公共导出
│ └── my-element.ts
├── package.json
├── tsconfig.json
└── vite.config.ts3. 多框架包装器发布
构建组件库后,发布多个框架的包装器包:
@my-design/core:Lit 核心组件。@my-design/react:React 包装器(使用@lit/react)。@my-design/vue:Vue 包装器。@my-design/angular:Angular 包装器。
4. CSS 自定义属性穿透 Shadow DOM
static styles = css`
:host {
--button-bg: #007bff;
background: var(--button-bg);
}
`/* 外部通过 CSS 变量覆盖 */
my-button {
--button-bg: #28a745;
}5. 测试策略
- 单元测试:Web Test Runner +
@open-wc/testing。 - E2E 测试:Playwright(跨浏览器测试 Custom Elements)。
- 视觉测试:Storybook + Chromatic。
十三、 性能与安全
1. lit-html 精准更新
lit-html 只更新模板中变化的部分,避免整段 DOM 重建。对于列表渲染,使用 repeat 指令优化:
import { repeat } from 'lit/directives/repeat.js'
render() {
return html`
<ul>
${repeat(
this.items,
(item) => item.id,
(item) => html`<li>${item.name}</li>`
)}
</ul>
`
}2. 避免不必要的属性反射
reflect: true 会将 property 同步回 attribute,增加 DOM 操作开销。只在需要 attribute 选择器或 CSS styling 时启用。
3. 懒加载大型组件
对于不常用的大型组件,使用动态 import() 懒加载:
async function loadChart() {
await import('./my-chart.js')
}4. 安全:XSS 与模板注入
lit-html 默认对插值进行转义,防御 XSS。但需注意:
- 避免使用
unsafeHTML渲染未过滤的用户输入。 - 对动态 URL 和属性进行校验。
import { unsafeHTML } from 'lit/directives/unsafe-html.js'
// 危险:仅在内容完全可信时使用
render() {
return html`<div>${unsafeHTML(this.userContent)}</div>`
}5. 安全:Shadow DOM 与 CSP
Shadow DOM 中的样式内联可能受 CSP 策略影响。生产环境应配置合理的 Content-Security-Policy,并避免在 Shadow DOM 中执行内联脚本。
6. 表单集成安全
Lit 组件中的表单元素默认不参与外部表单。需要时使用 ElementInternals API 让自定义元素参与表单验证和提交:
import { ElementInternals } from 'lit'
class MyInput extends LitElement {
static formAssociated = true
internals = this.attachInternals()
// 设置表单值
setValue(value: string) {
this.internals.setFormValue(value)
}
}十四、 技术对比
| 特性维度 | Lit | Stencil | React 19 | Vue 3 |
|---|---|---|---|---|
| 核心定位 | Web Components 库 | Web Components 编译器 | UI 渲染库 | 渐进式框架 |
| 输出标准 | Custom Elements | Custom Elements + 框架包装器 | 框架组件 | 框架组件 |
| 运行时体积 | 约 5KB | 轻量 | 40KB+ | 22KB |
| 编译器 | 无(标准 JS) | 有 | 无(或使用 Compiler) | 有 |
| Shadow DOM | 默认启用 | 默认启用 | 不使用 | 可选 |
| 跨框架复用 | 最强 | 强(自动生成包装器) | 需包装 | 需包装 |
| 学习曲线 | 平缓 | 中等 | 中等 | 平缓 |
| 最适合场景 | 跨框架组件库、设计系统 | 跨框架组件库编译器 | 高交互应用 | 中后台应用 |
十五、 最佳实践
-
构建标准 Custom Elements: 使用
@customElement注册组件,确保组件可在任何 HTML 环境中使用。 -
使用 Shadow DOM 实现样式隔离: 默认启用 Shadow DOM,通过
:host和 CSS 自定义属性控制组件外观。 -
通过 CSS 自定义属性暴露样式变量: 让外部可以自定义组件样式,同时保持内部实现细节封装。
-
优先使用 lit-html 的精准更新: 使用
repeat、cache等指令优化列表和条件渲染性能。 -
属性设计遵循 HTML 语义: 组件属性命名和类型应遵循 HTML 元素习惯,布尔属性使用
reflect时谨慎。 -
跨框架复用使用官方包装器: React 项目使用
@lit/react,Vue/Angular 项目使用对应包装器或直接使用 Custom Elements。 -
避免在 Shadow DOM 中渲染不可信内容: 使用
unsafeHTML时确保内容来源可信,或进行 HTML 消毒。 -
组件库发布多个入口包: 将核心 Lit 组件和框架包装器分开发布,避免强制用户安装不需要的运行时。
-
使用
ElementInternals参与表单: 如果组件是表单控件,使用ElementInternals参与表单验证和提交。 -
测试覆盖跨浏览器兼容性: Custom Elements 和 Shadow DOM 在现代浏览器中支持良好,但仍需通过 Playwright 进行跨浏览器测试。
十六、 学习与社区资源
1. 官方核心资源
- Lit 官方文档:https://lit.dev/docs — 完整且优质的文档。
- Lit Playground:https://lit.dev/playground — 在线 REPL。
- Google Codelabs:From Web Component to Lit Element — 官方教程。
- Lit 博客:https://lit.dev/blog — 官方更新。
- Lit GitHub:https://github.com/lit/lit
2. 视频与教程
- Google Chrome Developers YouTube:Lit 系列视频和 Web Components 讲解。
- Web Dev Simplified:Web Components 和 Lit 入门。
- Open WC 教程:Web Components 最佳实践。
3. 社区与会议
- Lit Discord:官方 Discord 社区。
- Open WC 社区:Web Components 开发者社区。
- Reddit r/webcomponents:Web Components 讨论。
- Twitter/X @buildWithLit:官方动态。
4. 推荐书籍
- 《Web Components in Action》— 系统学习 Web Components 和 Lit。
- 《Building Design Systems with Lit》— 使用 Lit 构建企业级设计系统。