0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Web框架的替代方案分享(中)

jf_78858299 来源: 前端之巅 作者:Noam Rosenthal 2023-03-20 14:51 次阅读

CHACHA 和 HTML 模板

框架提供了它们自己表达可观察列表的方式。现在很多开发者也依赖提供这种功能的非框架库,如 MobX。

通用的可观察列表的主要问题在于它们是通用的。这以性能为代价增加了便利性,而且还需要特殊的开发者工具来调试那些库在后台做的复杂动作。

使用这些库并理解它们的作用是可以的,无论选择什么样的 UI 框架,它们都是有用的,但使用替代方案可能不会更复杂,而且可以避免一些在你试图推出自己的模型时产生的陷阱。

变化通道(或 CHACHA)

CHACHA——也被称为变化通道(Changes Channel)——是一个双向流,其目的是通知意图方向和观察方向的变化。

  • 在意图方向上,UI 将用户意图的变化通知给模型。
  • 在观察方向上,模型将对模型所做的改变通知给 UI,而这些改变需要显示给用户。

这也许是一个有趣的名字,但它不是一个复杂或新颖的模式。双向流在 Web 和软件中随处可见(例如,MessagePort)。在这种情况下,我们正在创建一个双向流,它有一个特殊的目的:向 UI 报告实际的模型变化,并向模型报告意图。

CHACHA 的接口通常可以从应用的规范中导出,而不需要任何 UI 代码。

例如,一个允许你添加和删除联系人并从服务器加载初始列表的应用程序(带有刷新选项)可以有一个 CHACHA,它看起来像这样:

interface Contact {
  id: string;
  name: string;
  email: string;
}
// "Observe" Direction
interface ContactListModelObserver {
  onAdd(contact: Contact);
  onRemove(contact: Contact);
  onUpdate(contact: Contact);
}
// "Intent" Direction
interface ContactListModel {
  add(contact: Contact);
  remove(contact: Contact);
  reloadFromServer();  
}

请注意,这两个接口中的所有函数都是无效的,只接收普通对象。这是故意的。CHACHA 被构建成一个通道,有两个端口来发送消息,这使得它可以在 EventSource、HTML MessageChannel、服务工作者或任何其他协议中工作。

CHACHA 的好处是,它们很容易测试。你发送动作并期待对观察者的特定调用作为回报。

列表项的 HTML 模板元素

HTML 模板是存在于 DOM 中的特殊元素,但不会被显示。它们的目的是生成动态元素。

当我们使用 template 元素时,我们可以避免在 JavaScript 中创建元素和填充它们的所有模板代码。

下面将使用 template 为列表添加名称:

<ul id="names">
  <template>
   <li><label class="name" /><span class="hljs-name"li>
  <span class="hljs-name"template>
<span class="hljs-name"ul>
<script>
  function addName(name) {
    const list = document.querySelector('#names');
    const item = list.querySelector('template').content.cloneNode(true).firstElementChild;
    item.querySelector('label').innerText = name;
    list.appendChild(item);
  }
class="hljs-name"script>

通过使用列表项的 template 元素,我们可以在原始 HTML 中看到列表项——它不是用 JSX 或其他语言“渲染”的。你的 HTML 文件现在包含了应用程序的所有 HTML——静态部分是渲染的 DOM 的一部分,而动态部分在模板中表达,准备在时机成熟时被克隆并追加到文档中。

集大成者:TodoMVC

TodoMVC 是一个 TODO 列表的应用规范,用于展示不同的框架。TodoMVC 模板带有现成的 HTML 和 CSS,帮助你专注于框架。

你可以在 GitHub 资源库中使用这个结果,并且可以获得完整的源代码。

从规范派生的 CHACHA 开始

我们将从规范开始,并使用它来构建 CHACHA 接口:

interface Task {
   title: string;
   completed: boolean;
}


interface TaskModelObserver {
   onAdd(key: number, value: Task);
   onUpdate(key: number, value: Task);
   onRemove(key: number);
   onCountChange(count: {active: number, completed: number});
}


interface TaskModel {
   constructor(observer: TaskModelObserver);
   createTask(task: Task): void;
   updateTask(key: number, task: Task): void;
   deleteTask(key: number): void;
   clearCompleted(): void;
   markAll(completed: boolean): void;
}

任务模型中的函数直接来自规范和用户可以做的事情(清除已完成的任务,将所有任务标记为已完成或正在进行,获得正在进行和已完成的计数)。

请注意,它遵循 CHACHA 的准则。

  • 有两个界面,一个是动作的,一个是观察的。
  • 所有的参数类型都是基元或普通对象(很容易翻译成 JSON)。
  • 所有的函数都返回 void。

TodoMVC 的实现使用 localStorage 作为后端。

该模型非常简单,与关于 UI 框架的讨论没有多大关系。它在需要的时候保存到 localStorage,并在某些情况发生变化时向观察者触发回调,这些变化可能是用户操作的结果,也可能是模型第一次从 localStorage 加载的时候。

精简的、面向表单的 HTML

接下来,我将采用 TodoMVC 模板,并将其修改为面向表单的模板:表单的层次结构,输入和输出元素代表可以用 JavaScript 改变的数据。

我怎么知道某个东西是否需要成为表单元素?作为一个经验法则,如果它与模型中的数据绑定,那么它就应该是一个表单元素。

完整的 HTML 文件是可用的,但这里是其主要部分:

class="todoapp"> <header class="header">

todosclass="hljs-name"h1>
name="newTask"> <input name="title" type="text" placeholder="What needs to be done?" autofocus> class="hljs-name"form> class="hljs-name"header>
class="hljs-name"form> <input type="hidden" name="filter" form="main" /> <input type="hidden" name="completedCount" form="main" /> <input type="hidden" name="totalCount" form="main" /> <input name="toggleAll" type="checkbox" form="main" />

  • Web
    Web
    +关注

    关注

    2

    文章

    1262

    浏览量

    69446
  • 框架
    +关注

    关注

    0

    文章

    403

    浏览量

    17477
  • 编程
    +关注

    关注

    88

    文章

    3614

    浏览量

    93698
收藏 人收藏

    评论

    相关推荐

    采用DWR框架和反向AJAX的Web监控系统开发

      采用DWR框架和反向AJAX,结合Java多线程技术和Siemens Simatic S7-400 PLC TCP/IP通讯模块CP243-1 IT,开发了新的Web监控系统,并应用在供热公司供热管路监控系统。其
    发表于 08-04 10:48 1664次阅读
    采用DWR<b class='flag-5'>框架</b>和反向AJAX的<b class='flag-5'>Web</b>监控系统开发

    五大Python Web框架详解

    进行了扩展应用,提升了重用性且将功能分割到独立的模块,而且提供了在线调试器,易于错误跟踪!以上是2018年主流Python框架Web开发人员可能更感兴趣一些,可以了解学习一下!
    发表于 02-06 17:17

    Web框架使用哪些编程语言?

    如果你是做Web开发的,Web框架一定会很熟悉,框架Web架构开发必不可少的工具,不仅可以提
    发表于 03-28 16:53

    主流web前端技术框架

    Web架构是为解决Web开发开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮助快速实现Web开发,并解决开发过程
    发表于 03-28 16:56

    基于Struts和Hibernate框架Web应用的设计与

    基于J2EE 平台的框架技术是目前开发Web 应用的主流技术。其中,Struts 框架基于MVC 设计模式,清晰地划分了控制部分、业务逻辑和视图,实现了各层之间的解耦;而Hibernate 对JDBC 提供
    发表于 09-14 16:21 32次下载

    基于MVC模式的WEB应用框架

    MVC模式是目前WEB应用系统设计较为流行的一种,它在J2EE应用平台上的表现使其成为众多设计者的首选。其中,基于MVC模式的Struts框架使用最为广泛,论文首先讨论了它的内部实
    发表于 12-29 17:13 12次下载

    基于Web的自动化测试框架的研究

    根据web系统测试的特点,为提高软件测试自动化脚本的可重用性,结合在实际项目中软件自动化测试的实践,提出基于Web的自动化测试框架(ACRAT)。分析了软件自动化测试框架的优点
    发表于 11-07 15:58 0次下载
    基于<b class='flag-5'>Web</b>的自动化测试<b class='flag-5'>框架</b>的研究

    SSM框架Web应用开发的设计与实现 pdf下载

    Web 应用的开发过程,开发框架的选择非常重要。一个好的开发框架能够加速 Web 应用的开发速度,降低 开发成本,减少开发人员的工作量
    发表于 01-29 09:47 2次下载

    Web服务组合匹配框架研究

    在现有服务发现方法,单一考虑原子服务或服务组合的方式难以满足用户日益增长的需求。针对该问题,设计一个基于模型转换的Web服务匹配框架。在服务发现过程综合考虑组合
    发表于 03-05 13:35 0次下载
    <b class='flag-5'>Web</b>服务组合匹配<b class='flag-5'>框架</b>研究

    现在流行的Web APP开发框架有哪些

    Web APP框架的开发旨在支持开发人员使用单一编程语言构建交互式应用程序。市场上推出了一系列框架,其框架结构各不相同。开发人员可以通过学习Web
    的头像 发表于 12-29 09:50 1.2w次阅读

    安利5个流畅自如的Python Web框架

    如今,可供选择的Python web框架有不少,能帮助你更快更轻松地创建web应用。本文就将为大家介绍一些更现代、使用更广泛的web框架
    的头像 发表于 07-02 17:15 2365次阅读

    在micropython上搭建web框架web服务——新生代web框架:mpy-urouter

    大家好!之前我给 micropython 开发过一个名为 micro-route 的web框架,在使用的过程中发现这个框架在设计上有很多的缺陷,而且是经过一个星期的时间赶工出来的,代码质量不太
    发表于 12-29 18:56 5次下载
    在micropython上搭建<b class='flag-5'>web</b><b class='flag-5'>框架</b>和<b class='flag-5'>web</b>服务——新生代<b class='flag-5'>web</b><b class='flag-5'>框架</b>:mpy-urouter

    Web框架替代方案分享(上)

    上周,我们从框架试图解决哪些核心问题的角度出发,考察了使用框架的不同好处和代价,重点放在声明性编程、数据绑定、反应性、列表和条件。今天,我们来看看能否在 Web 平台上找到替代
    的头像 发表于 03-20 14:51 488次阅读

    Web框架替代方案分享(下)

    上周,我们从框架试图解决哪些核心问题的角度出发,考察了使用框架的不同好处和代价,重点放在声明性编程、数据绑定、反应性、列表和条件。今天,我们来看看能否在 Web 平台上找到替代
    的头像 发表于 03-20 14:51 560次阅读

    SSM框架在Java开发的应用 如何使用SSM进行web开发

    。以下是对SSM框架在Java开发的应用,以及如何使用SSM进行web开发的介绍: SSM框架的组件及其作用 Spring :Spring是一个开源的Java/Java EE全功能栈
    的头像 发表于 12-16 17:28 441次阅读