0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

jf_78858299 ? 來源: 前端之巔 ? 作者:Noam Rosenthal ? 2023-03-20 14:51 ? 次閱讀

CHACHA 和 HTML 模板

框架提供了它們自己表達(dá)可觀察列表的方式?,F(xiàn)在很多開發(fā)者也依賴提供這種功能的非框架庫(kù),如 MobX。

通用的可觀察列表的主要問題在于它們是通用的。這以性能為代價(jià)增加了便利性,而且還需要特殊的開發(fā)者工具來調(diào)試那些庫(kù)在后臺(tái)做的復(fù)雜動(dòng)作。

使用這些庫(kù)并理解它們的作用是可以的,無論選擇什么樣的 UI 框架,它們都是有用的,但使用替代方案可能不會(huì)更復(fù)雜,而且可以避免一些在你試圖推出自己的模型時(shí)產(chǎn)生的陷阱。

變化通道(或 CHACHA)

CHACHA——也被稱為變化通道(Changes Channel)——是一個(gè)雙向流,其目的是通知意圖方向和觀察方向的變化。

  • 在意圖方向上,UI 將用戶意圖的變化通知給模型。
  • 在觀察方向上,模型將對(duì)模型所做的改變通知給 UI,而這些改變需要顯示給用戶。

這也許是一個(gè)有趣的名字,但它不是一個(gè)復(fù)雜或新穎的模式。雙向流在 Web 和軟件中隨處可見(例如,MessagePort)。在這種情況下,我們正在創(chuàng)建一個(gè)雙向流,它有一個(gè)特殊的目的:向 UI 報(bào)告實(shí)際的模型變化,并向模型報(bào)告意圖。

CHACHA 的接口通??梢詮膽?yīng)用的規(guī)范中導(dǎo)出,而不需要任何 UI 代碼。

例如,一個(gè)允許你添加和刪除聯(lián)系人并從服務(wù)器加載初始列表的應(yīng)用程序(帶有刷新選項(xiàng))可以有一個(gè) 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();  
}

請(qǐng)注意,這兩個(gè)接口中的所有函數(shù)都是無效的,只接收普通對(duì)象。這是故意的。CHACHA 被構(gòu)建成一個(gè)通道,有兩個(gè)端口來發(fā)送消息,這使得它可以在 EventSource、HTML MessageChannel、服務(wù)工作者或任何其他協(xié)議中工作。

CHACHA 的好處是,它們很容易測(cè)試。你發(fā)送動(dòng)作并期待對(duì)觀察者的特定調(diào)用作為回報(bào)。

列表項(xiàng)的 HTML 模板元素

HTML 模板是存在于 DOM 中的特殊元素,但不會(huì)被顯示。它們的目的是生成動(dòng)態(tài)元素。

當(dāng)我們使用 template 元素時(shí),我們可以避免在 JavaScript 中創(chuàng)建元素和填充它們的所有模板代碼。

下面將使用 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>

通過使用列表項(xiàng)的 template 元素,我們可以在原始 HTML 中看到列表項(xiàng)——它不是用 JSX 或其他語言“渲染”的。你的 HTML 文件現(xiàn)在包含了應(yīng)用程序的所有 HTML——靜態(tài)部分是渲染的 DOM 的一部分,而動(dòng)態(tài)部分在模板中表達(dá),準(zhǔn)備在時(shí)機(jī)成熟時(shí)被克隆并追加到文檔中。

集大成者:TodoMVC

TodoMVC 是一個(gè) TODO 列表的應(yīng)用規(guī)范,用于展示不同的框架。TodoMVC 模板帶有現(xiàn)成的 HTML 和 CSS,幫助你專注于框架。

你可以在 GitHub 資源庫(kù)中使用這個(gè)結(jié)果,并且可以獲得完整的源代碼。

從規(guī)范派生的 CHACHA 開始

我們將從規(guī)范開始,并使用它來構(gòu)建 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;
}

任務(wù)模型中的函數(shù)直接來自規(guī)范和用戶可以做的事情(清除已完成的任務(wù),將所有任務(wù)標(biāo)記為已完成或正在進(jìn)行,獲得正在進(jìn)行和已完成的計(jì)數(shù))。

請(qǐng)注意,它遵循 CHACHA 的準(zhǔn)則。

  • 有兩個(gè)界面,一個(gè)是動(dòng)作的,一個(gè)是觀察的。
  • 所有的參數(shù)類型都是基元或普通對(duì)象(很容易翻譯成 JSON)。
  • 所有的函數(shù)都返回 void。

TodoMVC 的實(shí)現(xiàn)使用 localStorage 作為后端。

該模型非常簡(jiǎn)單,與關(guān)于 UI 框架的討論沒有多大關(guān)系。它在需要的時(shí)候保存到 localStorage,并在某些情況發(fā)生變化時(shí)向觀察者觸發(fā)回調(diào),這些變化可能是用戶操作的結(jié)果,也可能是模型第一次從 localStorage 加載的時(shí)候。

精簡(jiǎn)的、面向表單的 HTML

接下來,我將采用 TodoMVC 模板,并將其修改為面向表單的模板:表單的層次結(jié)構(gòu),輸入和輸出元素代表可以用 JavaScript 改變的數(shù)據(jù)。

我怎么知道某個(gè)東西是否需要成為表單元素?作為一個(gè)經(jīng)驗(yàn)法則,如果它與模型中的數(shù)據(jù)綁定,那么它就應(yīng)該是一個(gè)表單元素。

完整的 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
    +關(guān)注

    關(guān)注

    2

    文章

    1265

    瀏覽量

    69526
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    403

    瀏覽量

    17510
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3627

    瀏覽量

    93809
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    采用DWR框架和反向AJAX的Web監(jiān)控系統(tǒng)開發(fā)

      采用DWR框架和反向AJAX,結(jié)合Java多線程技術(shù)和Siemens Simatic S7-400 PLC TCP/IP通訊模塊CP243-1 IT,開發(fā)了新的Web監(jiān)控系統(tǒng),并應(yīng)用在供熱公司供熱管路監(jiān)控系統(tǒng)。其
    發(fā)表于 08-04 10:48 ?1670次閱讀
    采用DWR<b class='flag-5'>框架</b>和反向AJAX的<b class='flag-5'>Web</b>監(jiān)控系統(tǒng)開發(fā)

    五大Python Web框架詳解

    進(jìn)行了擴(kuò)展應(yīng)用,提升了重用性且將功能分割到獨(dú)立的模塊,而且提供了在線調(diào)試器,易于錯(cuò)誤跟蹤!以上是2018年主流Python框架,Web開發(fā)人員可能更感興趣一些,可以了解學(xué)習(xí)一下!
    發(fā)表于 02-06 17:17

    Web框架使用哪些編程語言?

    如果你是做Web開發(fā)的,Web框架一定會(huì)很熟悉,框架Web架構(gòu)開發(fā)必不可少的工具,不僅可以提
    發(fā)表于 03-28 16:53

    主流web前端技術(shù)框架

    Web架構(gòu)是為解決Web開發(fā)開放性問題而設(shè)計(jì)的具有一定約束性的支撐結(jié)構(gòu),使用框架可以幫助快速實(shí)現(xiàn)Web開發(fā),并解決開發(fā)過程
    發(fā)表于 03-28 16:56

    基于Struts和Hibernate框架Web應(yīng)用的設(shè)計(jì)與

    基于J2EE 平臺(tái)的框架技術(shù)是目前開發(fā)Web 應(yīng)用的主流技術(shù)。其中,Struts 框架基于MVC 設(shè)計(jì)模式,清晰地劃分了控制部分、業(yè)務(wù)邏輯和視圖,實(shí)現(xiàn)了各層之間的解耦;而Hibernate 對(duì)JDBC 提供
    發(fā)表于 09-14 16:21 ?32次下載

    基于MVC模式的WEB應(yīng)用框架

    MVC模式是目前WEB應(yīng)用系統(tǒng)設(shè)計(jì)較為流行的一種,它在J2EE應(yīng)用平臺(tái)上的表現(xiàn)使其成為眾多設(shè)計(jì)者的首選。其中,基于MVC模式的Struts框架使用最為廣泛,論文首先討論了它的內(nèi)部實(shí)
    發(fā)表于 12-29 17:13 ?12次下載

    基于Web的自動(dòng)化測(cè)試框架的研究

    根據(jù)web系統(tǒng)測(cè)試的特點(diǎn),為提高軟件測(cè)試自動(dòng)化腳本的可重用性,結(jié)合在實(shí)際項(xiàng)目中軟件自動(dòng)化測(cè)試的實(shí)踐,提出基于Web的自動(dòng)化測(cè)試框架(ACRAT)。分析了軟件自動(dòng)化測(cè)試框架的優(yōu)點(diǎn)
    發(fā)表于 11-07 15:58 ?0次下載
    基于<b class='flag-5'>Web</b>的自動(dòng)化測(cè)試<b class='flag-5'>框架</b>的研究

    SSM框架Web應(yīng)用開發(fā)的設(shè)計(jì)與實(shí)現(xiàn) pdf下載

    Web 應(yīng)用的開發(fā)過程,開發(fā)框架的選擇非常重要。一個(gè)好的開發(fā)框架能夠加速 Web 應(yīng)用的開發(fā)速度,降低 開發(fā)成本,減少開發(fā)人員的工作量
    發(fā)表于 01-29 09:47 ?2次下載

    Web服務(wù)組合匹配框架研究

    在現(xiàn)有服務(wù)發(fā)現(xiàn)方法,單一考慮原子服務(wù)或服務(wù)組合的方式難以滿足用戶日益增長(zhǎng)的需求。針對(duì)該問題,設(shè)計(jì)一個(gè)基于模型轉(zhuǎn)換的Web服務(wù)匹配框架。在服務(wù)發(fā)現(xiàn)過程綜合考慮組合
    發(fā)表于 03-05 13:35 ?0次下載
    <b class='flag-5'>Web</b>服務(wù)組合匹配<b class='flag-5'>框架</b>研究

    現(xiàn)在流行的Web APP開發(fā)框架有哪些

    Web APP框架的開發(fā)旨在支持開發(fā)人員使用單一編程語言構(gòu)建交互式應(yīng)用程序。市場(chǎng)上推出了一系列框架,其框架結(jié)構(gòu)各不相同。開發(fā)人員可以通過學(xué)習(xí)Web
    的頭像 發(fā)表于 12-29 09:50 ?1.2w次閱讀

    安利5個(gè)流暢自如的Python Web框架

    如今,可供選擇的Python web框架有不少,能幫助你更快更輕松地創(chuàng)建web應(yīng)用。本文就將為大家介紹一些更現(xiàn)代、使用更廣泛的web框架。
    的頭像 發(fā)表于 07-02 17:15 ?2379次閱讀

    在micropython上搭建web框架web服務(wù)——新生代web框架:mpy-urouter

    大家好!之前我給 micropython 開發(fā)過一個(gè)名為 micro-route 的web框架,在使用的過程中發(fā)現(xiàn)這個(gè)框架在設(shè)計(jì)上有很多的缺陷,而且是經(jīng)過一個(gè)星期的時(shí)間趕工出來的,代碼質(zhì)量不太
    發(fā)表于 12-29 18:56 ?5次下載
    在micropython上搭建<b class='flag-5'>web</b><b class='flag-5'>框架</b>和<b class='flag-5'>web</b>服務(wù)——新生代<b class='flag-5'>web</b><b class='flag-5'>框架</b>:mpy-urouter

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

    上周,我們從框架試圖解決哪些核心問題的角度出發(fā),考察了使用框架的不同好處和代價(jià),重點(diǎn)放在聲明性編程、數(shù)據(jù)綁定、反應(yīng)性、列表和條件。今天,我們來看看能否在 Web 平臺(tái)上找到替代
    的頭像 發(fā)表于 03-20 14:51 ?498次閱讀

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

    上周,我們從框架試圖解決哪些核心問題的角度出發(fā),考察了使用框架的不同好處和代價(jià),重點(diǎn)放在聲明性編程、數(shù)據(jù)綁定、反應(yīng)性、列表和條件。今天,我們來看看能否在 Web 平臺(tái)上找到替代
    的頭像 發(fā)表于 03-20 14:51 ?574次閱讀

    SSM框架在Java開發(fā)的應(yīng)用 如何使用SSM進(jìn)行web開發(fā)

    。以下是對(duì)SSM框架在Java開發(fā)的應(yīng)用,以及如何使用SSM進(jìn)行web開發(fā)的介紹: SSM框架的組件及其作用 Spring :Spring是一個(gè)開源的Java/Java EE全功能棧
    的頭像 發(fā)表于 12-16 17:28 ?529次閱讀