维护 DOM 已成 WebApp 时代最大的挑战。

  • 背景:是从一开始的静态页面,发展到了 WebApp
  • Web Application:WebApp 所遇到的问题和挑战
  • 维护 DOM:是最大的挑战之一
  • 更新 DOM:方案与优劣(接后续)

背景

回顾历史,计算机应用从 CS(Client-Server) 架构往 BS(Browser-Server) 迁移后,应用的开发方式发生了变化。

从 1991 年第一次公开 HTML 以来,再到 1995 年 Netscape 推出客户端脚本 Javascript 之后,再到 2000 年,Gmail 大规模使用 AJAX 来异步更新页面。前端浏览器页面,从无到有,从静态到动态,从动态到复交互形态。

Web 页面从仅仅是静态展示,慢慢变成 Web 应用(即 Web Application)。

  • https://en.wikipedia.org/wiki/Web_application
  • https://en.wikipedia.org/wiki/Ajax_(programming)

Web Application

既然是应用,相比之前的 HTML 静态页面,就变得复杂了。

在原有静态页面的时代,HTML 页面的内容是相对静态的,页面的真实渲染一般也由后端服务器使用模板语言来生成。

比如:Vecolity, JSP, ASP, art-template 等等

像 ASP.NET 的方案,通过 runat=server 可以将 click 事件,都放在服务端处理,并在点击后返回整个 HTML 页面。

  <form id="form1" runat="server">
    <asp:Button id="Button1"
      Text="Submit"
      OnClick="SubmitBtn_Click"
      runat="server"/>
  </form>

原有的模板方案,数据一般都在服务端维护(包括页面路由等),且多以展现为主,并无强烈的页面状态维护等诉求。

一切都被 Gmail 打破了,在使用 AJAX 方案后,大幅减少了服务器流量(从原有的整体页面请求到页面区块的请求),且显著增强了应用程序性能和用户体验。

维护 DOM

一开始的网页,由于偏静态化,所以,一般没有复杂的 DOM 维护操作。

通常情况,HTML DSL 即为 DOM,较少更新 DOM,如果需要更新 DOM。

  • 使用原生 DOM API document.querySelector('p').innerHTML = '<b>hello wrold</b>'
  • jQuery 时代,会使用 $('p').replaceWith('<b>hello world</b>')

后续随着网页往 WebApp 发展,网页趋于动态、复杂化。随着而来的,便是复杂的页面状态,以及复杂的 DOM 更新。

比较典型的还是 Gmail 的例子:

  • 复杂搜索筛选,发件人、收件人、主题、日期范围等等
  • 复杂的操作,选择、删除、标记、移动等等

image

于是 MVVM(Model-View-Viewmodel),MVC(Model-View-Controller),组件化,分层等软件工程概念出现了。

image

我们只需要控制 ViewModel,对应的 View 就会通过 DataBinding 自动更新,Angular、React、Vue 等此类框架的核心工作便是如此。

  • https://en.wikipedia.org/wiki/Document_Object_Model#Manipulating_the_DOM_tree