0

0

如何构建一个无框架、基于原生Web Components的复杂应用?

夢幻星辰

夢幻星辰

发布时间:2025-10-08 18:54:01

|

738人浏览过

|

来源于php中文网

原创

完全可行,通过原生Custom Elements构建组件,结合发布-订阅模式实现状态管理,利用history API实现路由,并通过事件总线完成通信,可构建结构清晰、可维护的大型应用。

如何构建一个无框架、基于原生web components的复杂应用?

构建一个无框架、基于原生 Web Components 的复杂应用是完全可行的,关键在于组织方式、状态管理、路由和组件通信的设计。虽然没有 React 或 Vue 那样的生态支持,但现代浏览器原生能力已经足够强大。以下是实现这类应用的核心思路和步骤。

1. 使用原生 Custom Elements 构建可复用组件

Web Components 的核心是 Custom Elements,它允许你创建自定义 HTML 标签,并封装样式、结构和行为。

定义一个组件非常直接:

class TodoItem extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({ mode: 'open' });
  }

  connectedCallback() {
    const text = this.getAttribute('text') || 'No title';
    this.shadowRoot.innerHTML = `
      <style>
        :host { display: block; padding: 8px; border-bottom: 1px solid #eee; }
      </style>
      <div>${text}</div>
    `;
  }
}

customElements.define('todo-item', TodoItem);

你可以通过属性传递数据,监听事件,甚至暴露方法。组件之间通过 DOM 事件通信,比如 dispatchEvent 触发自定义事件。

2. 实现轻量级状态管理

在没有 Redux 或 Pinia 的情况下,可以使用一个简单的全局状态容器配合事件机制来实现响应式更新。

例如,创建一个基于发布-订阅模式的状态管理器:

class Store {
  constructor(state) {
    this.state = {...state};
    this.listeners = [];
  }

  setState(newState) {
    this.state = {...this.state, ...newState};
    this.notify();
  }

  subscribe(callback) {
    this.listeners.push(callback);
    callback(this.state); // 立即触发一次
    return () => {
      this.listeners = this.listeners.filter(fn => fn !== callback);
    };
  }

  notify() {
    this.listeners.forEach(fn => fn(this.state));
  }
}

组件在 connectedCallback 中订阅状态变化,自动更新自身 UI。disconnectedCallback 中取消订阅避免内存泄漏。

3. 实现客户端路由

复杂应用通常需要多页面视图。可以基于原生 history API 和 URL 监听实现路由系统。

雾象
雾象

WaytoAGI推出的AI动画生成引擎

下载

示例:监听 popstate 并匹配路径

class Router {
  routes = [];

  add(path, component) {
    this.routes.push({ path, component });
    return this;
  }

  start() {
    window.addEventListener('popstate', () => this.navigate(location.pathname));
    this.navigate(location.pathname);
  }

  navigate(path) {
    history.pushState({}, '', path);
    const match = this.routes.find(r => r.path === path);
    if (match) {
      document.querySelector('#app').innerHTML = `
        <${match.component}></${match.component}>`;
    }
  }
}

配合自定义链接元素或 JS 调用 navigate 方法即可实现跳转。

4. 组件间通信与事件总线

父子通信可通过属性和事件完成。跨层级或非父子关系可用全局事件总线。

简单实现:

const EventBus = {
  on(event, handler) {
    document.addEventListener(event, handler);
  },
  off(event, handler) {
    document.removeEventListener(event, handler);
  },
  emit(event, data) {
    document.dispatchEvent(new CustomEvent(event, { detail: data }));
  }
};

任意组件都可以发送或监听消息,比如保存成功后通知顶部提示栏显示 toast。

基本上就这些。通过合理拆分组件、统一状态流、清晰的路由控制和事件机制,完全可以构建出结构清晰、可维护的大型原生 Web Components 应用。不依赖框架意味着更小的体积和更高的可控性,只是需要自己补足一些基础设施。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

119

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

389

2023.10.11

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

267

2025.12.04

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

562

2023.09.20

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

871

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

32

2025.12.06

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

531

2023.06.20

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

37

2026.03.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 9.5万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号