Lit Web Components 开发框架技术调研 logo

Lit Web Components 开发框架技术调研

基于 Web 标准构建跨框架组件的主流开发库

精选工具Web Components标准优先Shadow DOM组件库

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 Stars19,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.32026 年 5 月当前稳定版,持续补丁和性能优化。
Lit 3.02023 年 10 月移除 IE11 支持,ES2021 模块,移除废弃 API,更小 bundle 和更快渲染。
Lit 2.02021 年整合 lit 包,引入 lit-html 2.0,优化 SSR 支持。
LitElement 1.02018 年首个稳定版本,确立基于标准 Web Components 的组件模型。

2026 年核心趋势

  1. Web Components 生态核心:Lit 已成为 Web Components 生态中最主流的框架选择。
  2. 现代技术栈的一部分:Lit 被纳入 2025 年"现代 Web Components 技术栈"推荐。
  3. 性能竞争力:Lit 的性能和体积被认为与 Solid、Svelte、Preact 处于同一水平。
  4. @lit/react 成熟:React 集成方案成熟,使 Lit 组件在 React 项目中使用体验接近原生。
  5. Lit 编译器进展:实验性编译器持续开发,有望带来编译时优化。
  6. 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 dev

2. 标准项目结构

my-lit-app/
├── src/
│   ├── my-element.ts           # 自定义元素组件
│   ├── components/             # 可复用组件
│   ├── styles/                 # 共享样式
│   └── index.ts                # 入口文件
├── index.html
├── vite.config.ts
├── tsconfig.json
└── package.json

3. 核心开发命令

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 = 0

5. 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(&#123; type: String &#125;) 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 使用标准 &lt;slot&gt; 元素支持内容分发:

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>

九、 技术局限与边界

  1. 不是应用框架: Lit 是组件库,不是完整的应用框架。复杂路由、状态管理、数据流需要配合其他框架或自行构建。

  2. Shadow DOM 的样式限制: Shadow DOM 虽然提供样式隔离,但也带来了一些限制:外部样式难以深入组件内部(除非使用 CSS 自定义属性),slot 内容样式控制有限。

  3. 浏览器兼容性: Lit 3.x 不支持 IE11,需要现代浏览器。虽然主流浏览器都支持 Custom Elements 和 Shadow DOM,但某些企业环境可能需要 polyfill。

  4. SSR 生态仍在发展@lit-labs/ssr 提供 SSR 支持,但相比 Next.js、Nuxt 的成熟 SSR 生态,Lit 的 SSR 方案和工具链仍在完善。

  5. 表单集成复杂度: 将 Lit 组件与标准表单集成(如表单验证、提交)需要额外处理,因为 Shadow DOM 中的表单元素不会自动参与父表单。

  6. 开发工具相对简单: 相比 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-htmlLit 的底层模板引擎,也可独立使用。
React 集成@lit/react官方 React 包装器,让 Lit 组件在 React 中像原生组件使用。
Vue 集成vue-custom-elementVue 的自定义元素包装器,或直接使用 Lit 组件。
Angular 集成CUSTOM_ELEMENTS_SCHEMAAngular 可直接使用 Custom Elements。
SSR@lit-labs/ssr实验性 SSR 支持,可在 Node.js 中渲染 Lit 组件。
动画@lit-labs/motionLit 动画效果库。
异步任务@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 / RollupLit 可与任何现代构建工具集成。

十二、 开发与工程化

1. TypeScript 严格模式

Lit 完全使用 TypeScript,建议开启严格模式:

{
  "compilerOptions": {
    "strict": true,
    "experimentalDecorators": true,
    "useDefineForClassFields": false,
    "moduleResolution": "bundler"
  }
}

注意:Lit 装饰器需要 experimentalDecorators: trueuseDefineForClassFields: 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.ts

3. 多框架包装器发布

构建组件库后,发布多个框架的包装器包:

  • @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)
  }
}

十四、 技术对比

特性维度LitStencilReact 19Vue 3
核心定位Web Components 库Web Components 编译器UI 渲染库渐进式框架
输出标准Custom ElementsCustom Elements + 框架包装器框架组件框架组件
运行时体积约 5KB轻量40KB+22KB
编译器无(标准 JS)无(或使用 Compiler)
Shadow DOM默认启用默认启用不使用可选
跨框架复用最强强(自动生成包装器)需包装需包装
学习曲线平缓中等中等平缓
最适合场景跨框架组件库、设计系统跨框架组件库编译器高交互应用中后台应用

十五、 最佳实践

  1. 构建标准 Custom Elements: 使用 @customElement 注册组件,确保组件可在任何 HTML 环境中使用。

  2. 使用 Shadow DOM 实现样式隔离: 默认启用 Shadow DOM,通过 :host 和 CSS 自定义属性控制组件外观。

  3. 通过 CSS 自定义属性暴露样式变量: 让外部可以自定义组件样式,同时保持内部实现细节封装。

  4. 优先使用 lit-html 的精准更新: 使用 repeatcache 等指令优化列表和条件渲染性能。

  5. 属性设计遵循 HTML 语义: 组件属性命名和类型应遵循 HTML 元素习惯,布尔属性使用 reflect 时谨慎。

  6. 跨框架复用使用官方包装器: React 项目使用 @lit/react,Vue/Angular 项目使用对应包装器或直接使用 Custom Elements。

  7. 避免在 Shadow DOM 中渲染不可信内容: 使用 unsafeHTML 时确保内容来源可信,或进行 HTML 消毒。

  8. 组件库发布多个入口包: 将核心 Lit 组件和框架包装器分开发布,避免强制用户安装不需要的运行时。

  9. 使用 ElementInternals 参与表单: 如果组件是表单控件,使用 ElementInternals 参与表单验证和提交。

  10. 测试覆盖跨浏览器兼容性: Custom Elements 和 Shadow DOM 在现代浏览器中支持良好,但仍需通过 Playwright 进行跨浏览器测试。


十六、 学习与社区资源

1. 官方核心资源

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 构建企业级设计系统。