Web Components 2026:原生组件的春天来了吗
Web Components 这套规范的故事可谓一波三折。2011 年由 Google Polymer 团队提出,2014 至 2016 年是被寄予厚望的「下一代 Web 标准」,但因为浏览器实现拖延、Polymer 早期 API 过于激进、React 与 Vue 占据组件思想主流,Web Components 长期被边缘化。然而 2020 年后情况悄然改变:浏览器实现统一、Lit 1KB 级别的轻量框架成熟、Apple Music、GitHub、Adobe Spectrum 等大厂大规模采用、Declarative Shadow DOM 解决了 SSR 难题、React 19 改进了与 Custom Elements 的互操作。2026 年的 Web Components 已经不再是「未来标准」,而是能与 React/Vue 共存、在跨团队组件库与设计系统中有独特价值的成熟方案。本文从三大规范基础讲起,覆盖浏览器支持、React 互操作、Lit/Stencil 框架、大厂使用案例、Declarative Shadow DOM SSR 全景,帮你判断 Web Components 在你项目中的位置。
1. 三大规范:Custom Elements、Shadow DOM、HTML Templates
Custom Elements 是 Web Components 的入口。你定义一个继承 HTMLElement 的类,通过 customElements.define('my-button', MyButton) 注册一个新标签。使用时直接写 my-button 标签即可,浏览器会创建你的类实例。生命周期回调 connectedCallback、disconnectedCallback、attributeChangedCallback、adoptedCallback 让你处理挂载、卸载、属性变化、跨文档迁移。
Shadow DOM 提供样式与结构封装。在 Custom Element 里调用 this.attachShadow 模式 open 创建 shadow root,之后所有 innerHTML 操作都在 shadow tree 内,外部 CSS 选择器无法穿透、内部样式也不影响外部。这种封装让 Web Components 真正解决了「跨团队组件 CSS 互相污染」的世纪难题。
HTML Templates 提供 template 与 slot 两个元素。template 内的内容不会被浏览器渲染,可以作为模板复用;slot 提供 props.children 风格的内容投影机制,让父级 HTML 内容能插入到子组件指定位置。三者组合形成完整的原生组件模型,浏览器原生支持、无需任何框架。
2. 2026 年的浏览器支持现状
三大规范在所有主流浏览器(Chrome、Edge、Firefox、Safari)的支持已超过 5 年。Custom Elements v1 早已是稳定 API;Shadow DOM 的 ::part、::slotted、:host 等 CSS 选择器已稳定;CSS Shadow Parts 让外部样式可以精确穿透到指定 shadow 内部部件。
Form-Associated Custom Elements(让自定义元素可以参与表单提交、与 form validation 集成)在 Chrome、Safari、Firefox 全面支持,2026 年已可放心用于复杂表单组件。CSS @scope 与 :scope 也让 shadow DOM 的样式策略更灵活。
剩余兼容问题主要在十年前的旧浏览器(IE 11、老 Safari)。如果项目还需支持这些环境(少数政企或银行项目),可以用 webcomponentsjs polyfill 处理大部分场景。但 2026 年绝大多数项目已可放弃这些环境。
3. 与 React、Vue 的互操作
React 19 大幅改进了对 Custom Elements 的支持。之前 React 把所有 props 当作 attribute 字符串处理(导致复杂对象传不进去),React 19 区分 attributes 与 properties,自动选择正确路径;自定义事件可以通过 onMyEvent 风格的 prop 监听;ref 自动转发到底层 element。这让 Web Components 库(如 Lit 写的组件)可以无缝嵌入 React 应用。
Vue 对 Custom Elements 一直支持良好——template 里直接写 my-element 即可,Vue 编译器识别注册的标签并跳过解析。Vue 3 的 defineCustomElement 还能反向把 Vue 组件包装成 Web Component。
反过来,React 组件需要包装成 Custom Element 才能被原生 HTML 使用,常用工具有 react-to-webcomponent。这种用法常见于「React 团队希望分发给 Vue/Angular 团队复用」的场景,但产物体积通常较大(必须包含 React 运行时)。
4. Lit、Stencil 与其他生态
Lit 是 Google 维护的轻量级 Web Components 框架,约 6KB(gzip)、API 简洁、TypeScript 推导优秀。它提供 LitElement 基类、装饰器(customElement、property、state)、html 模板字符串、reactive properties 等。Lit 是 Polymer 的精神继承者,但摒弃了 Polymer 早期的 HTML imports、双向绑定等争议设计。
Stencil 由 Ionic 团队开发,思路独特:编译期把 TypeScript JSX 风格的组件代码生成为标准 Web Components,同时自动输出 React/Vue/Angular 适配器。这让组件库作者「写一次、跨四个框架分发」。代价是构建工具链较重,dev 体验不如 Lit 直接。
其他选手:Lit 的兄弟项目 Atomico 提供 Hooks 风格 API;Solid Element 把 Solid 组件编译为 Web Components;FAST 是微软的方案;Hybrids 提供函数式 API。但 Lit 与 Stencil 是 2026 年商业项目最稳妥的两个选择。
5. 大厂使用案例
Apple Music 网页版几乎全部用 Web Components 构建。Apple 的 Spectrum-style design system 内部基于 Lit,跨多个产品线(Music、TV、Podcasts)复用。这种规模采用证明了 Web Components 在复杂应用上的成熟度。
GitHub 是 Web Components 最知名的拥趸之一。GitHub Primer 设计系统提供大量 Custom Elements,例如 details-menu、include-fragment-element、relative-time,这些组件用原生 Web Components 实现,与 React、Rails ERB 模板共存,跨团队分发简单。
Adobe Spectrum Web Components 是 Adobe 全产品线(Creative Cloud、Document Cloud、Experience Cloud)共享的设计系统。基于 Lit 实现,跨 React、Vue、Angular 产品复用,避免了 Adobe 内部前端框架割裂导致的设计系统重复实现。
其他案例:Salesforce Lightning Web Components、Microsoft FAST 在 Office 部分模块、SAP UI5 Web Components、Ionic Framework 整体已用 Stencil 重写。这些都是「跨技术栈大型组织」的典型场景。
6. Declarative Shadow DOM 与 SSR
Shadow DOM 最大的历史痛点是 SSR。传统 Shadow DOM 必须通过 attachShadow JavaScript API 创建,意味着服务端渲染的 HTML 无法包含 shadow tree,必须等 JS 执行后才能补齐——首屏看到「未样式化的 light DOM」、SEO 抓取也是空内容。这一缺陷长期阻碍 Web Components 进入内容站点与 SEO 敏感场景。
Declarative Shadow DOM 通过新的 HTML 语法解决:直接写 template shadowrootmode 等于 open,浏览器解析 HTML 时就构建 shadow tree。Safari 16.4(2023 年 3 月)后全面支持,2026 年已可放心用于 SSR。
这意味着 Web Components 终于具备了与 React/Vue 同级别的 SSR 能力。配合 Lit SSR 包,可以实现真正的「服务端渲染 + 浏览器 hydrate」全流程。Astro 等元框架也在适配,未来可以混用 Web Components 与其他岛屿框架。
7. 优势与局限
Web Components 的核心优势:1)原生标准,不依赖框架版本,长期稳定(即使十年后浏览器升级也大概率工作);2)样式封装天然,跨团队组件库无 CSS 污染;3)跨框架分发,一份组件库给 React/Vue/Angular/Astro/原生 HTML 都能用;4)适合设计系统、跨产品复用、企业级共享组件。
核心局限:1)API 比 React/Vue 更底层,没有 reactive 默认(需要自己写或用 Lit);2)DX 相比成熟 SPA 框架略冗长(生命周期回调、attribute 与 property 转换的样板代码);3)社区生态远不如 React/Vue(hooks 库、UI 库、模板项目);4)小团队单一应用项目用原生 Web Components 经常显得过重。
结论:Web Components 不是「替代 React/Vue」的东西,而是「弥补 React/Vue 不擅长的跨技术栈分发场景」的标准方案。
8. 在中国生态中的位置与未来
中国前端生态对 Web Components 关注度长期较低。原因:国内招聘市场以 React/Vue 为主、大厂内部基本用 Vue 生态(饿了么 Element、字节 Arco、腾讯 TDesign)解决跨产品组件复用、设计系统跨框架分发的需求在国内大厂内不那么强烈(同公司前端框架相对统一)。
但 2026 年情况在变化:阿里 EleUI Web Components 版本已发布、字节 Arco 也提供 Web Components 适配、百度部分产品采用、华为 OpenHarmony Web 应用使用 Web Components。独立开发者社区也开始讨论 Lit 与 Stencil。掘金、知乎已有更多深度文章。
判断标准:如果你的项目是「单一团队、单一前端框架、单一产品」,原生 Web Components 价值不大,继续用 React/Vue 即可。如果你是「跨技术栈分发组件库、设计系统跨多产品复用、希望长期稳定不依赖框架」的场景,Web Components 是 2026 年最务实的标准方案。日常开发可借助 代码格式化工具、JSON 格式化 加速调试。完整的简历项目展示可以用 在线简历生成器 输出 PDF。
原生组件的春天来了吗?答案不是「Web Components 取代 React」的简单胜利,而是「Web Components 找到了自己合适的位置」的悄然成熟。
常见问题
Web Components 包含哪三大规范?
Custom Elements 让你定义自己的 HTML 标签(例如 my-button),通过 customElements.define 注册类;Shadow DOM 提供样式与 DOM 封装,外部 CSS 不会泄漏进 shadow tree、内部样式也不会影响外部;HTML Templates(template 与 slot 元素)提供可复用的 DOM 模板与内容投影。三者组合形成完整的原生组件模型,浏览器原生支持、无需框架。
2026 年浏览器对 Web Components 的支持如何?
Custom Elements、Shadow DOM、HTML Templates 在所有主流浏览器(Chrome、Edge、Firefox、Safari)支持已超过 5 年。Declarative Shadow DOM 在 Safari 16.4 后全面支持,2026 年已可放心用于 SSR。CSS Shadow Parts、Form-Associated Custom Elements 等增强能力也已稳定。剩余兼容问题主要在十年前的旧浏览器,企业应用可以用 polyfill 处理。
Web Components 和 React 怎么互操作?
React 19 改进了对 Custom Elements 的支持:自定义元素的属性(attributes)可直接传递、自定义事件可通过 onClick 风格的 prop 监听、ref 自动转发到底层 element。这让 Web Components 库可以无缝嵌入 React 应用。反过来,React 组件需要包装成 Custom Element 才能被原生 HTML 使用,常用工具有 react-to-webcomponent。
Lit 和 Stencil 哪个更适合 2026 年新项目?
Lit 由 Google 维护,是 Polymer 的精神继承者,约 6KB、API 简洁、TypeScript 推导优秀,适合任何规模的 Web Components 项目。Stencil 由 Ionic 团队开发,编译期生成 Web Components 同时输出 React/Vue/Angular 适配器,适合需要跨框架分发组件库的团队。轻量项目用 Lit,多框架分发用 Stencil。
Declarative Shadow DOM 解决了什么问题?
传统 Shadow DOM 通过 attachShadow API 在 JavaScript 中创建,导致 SSR 渲染的 HTML 无法包含 Shadow DOM 内容,必须等 JS 执行后才能补齐,影响首屏与 SEO。Declarative Shadow DOM 在 HTML 里直接用 template shadowrootmode 等于 open 声明 shadow root,浏览器解析时直接构建 shadow tree。这让 Web Components 终于具备了与 React/Vue 同级别的 SSR 能力。