每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行! 订阅:https://rengongzhineng.io/

浏览器的发展正处于一个奇怪的时期。尽管WebAssembly在服务器端取得了显著成功,但客户端的体验在过去十年间几乎没有根本改变。

不少技术爱好者认为,通过WASM访问原生Web API已经不再是难题,只需极少的JavaScript“胶水”代码即可实现。但关键问题并不是“是否可以”访问DOM,而是“为什么还要”访问它。如今,DOM似乎成了唯一的选择,但实际上,是时候让DOM和它那一系列错综复杂的API“退休”了。

“文档”模型的真实面貌

鲜有人真正意识到DOM有多庞杂。在Chrome中,document.body对象已包含超过350个属性,这还不包括其style属性中660个CSS属性。属性与方法的边界模糊不清,有些属性不过是隐藏的setter方法;一些getter方法甚至会触发即时的页面重排。此外,诸如onloadonmouseover等早期事件处理器仍被保留在API中,尽管几乎无人使用。

DOM并不轻盈,反而愈加臃肿。是否能感知这一点,取决于开发者是在制作网页,还是在开发Web应用。如今多数开发者已尽量避免直接操作DOM,虽然仍有人将“纯DOM”视为优于现代JS组件框架的“正统方式”。而诸如innerHTML这样的声明式功能早已无法满足现代UI开发的需求。DOM存在太多实现方式,却没有一种是令人满意的。

Web Components:错失良机的原生组件方案

Web Components本应成为Web平台上原生组件化的标准,但其出场时机过晚,加之API设计生硬,使其难以流行。其中Shadow DOM的引入更是带来了嵌套与作用域的复杂性,使许多开发者望而却步。其支持者往往语气近似辩解。

DOM的根本性问题,在于其源自SGML/XML的遗产,使得一切都变成了“字符串类型”——即所谓“stringly typed”。而React等框架虽然语法上看似XML,实际上并无此限制。如今开发者早已学会,不应把状态保存在DOM中,因为它无法胜任。

HTML十年如一日的停滞

HTML本身的问题更是根深蒂固。在过去十至十五年中,其结构几乎未曾改变。除了ARIA(无障碍访问)之外,鲜有实质性进展。语义化HTML未能兑现其承诺——比如至今没有 <thread><comment> 标签,即使这些已成为常见内容结构。语义化规范内容模糊,令人困惑。

HTML似乎始终执着于纸质出版物的模型,迟迟不愿拥抱超文本的本质,也未能给予用户清晰且可信的规则。HTML的管理早已从W3C转移至WHATWG,即各大浏览器厂商联盟,但他们迄今未能提供明确的未来愿景,仅在边缘上不断堆砌功能补丁。

CSS:结构混乱的布局系统

CSS的名声也不甚美好,但大多数人并不能准确说出其问题所在。问题的根源在于心智模型的错位——许多人将其视为约束求解器(constraint solver),这是误入歧途。

例如,使用百分比高度时,开发者可能以为设置两个50%高度的子元素,父容器就会被垂直平分。但由于CSS的布局流程是自内而外的(inside-out),在不知道父元素高度的前提下,这样的设置往往会被忽略,或者内容溢出。这是由于CSS并不会像某些布局引擎那样进行回溯或推理,而是“自上而下传约束,再自下而上传尺寸”。

在构建应用框架时需要outside-in的布局,而HTML默认偏向inside-out的文档式布局。这就是为什么垂直对齐在CSS中“很难”。

Flexbox的权衡与代价

使用display: flex确实可以解决上述问题。它允许合理划分空间、定义弹性增长/收缩。但这也引入了额外复杂度:每个子元素需先测量“自然尺寸”,再根据空间调整布局——这相当于布局过程要执行两次。对于嵌套结构甚至可能引发递归的计算爆炸,虽然在现实中很少出现。

为避免递归依赖,开发者需使用如contain: sizewill-change等新CSS属性,以阻断DOM中流动的全局约束。这类机制透露了CSS中潜在的“分层”特性,但这些设计显然不是从头构建的,而更像是补丁堆叠。

DOM和CSS的原罪

在CSS中,继承(inheritance)仅适用于少数文字样式,如字体大小,而大多数属性(如边框)并不会继承。这揭示了CSS其实融合了两种截然不同的系统:一是基于继承的富文本样式系统;二是基于嵌套与包含的布局系统。两者共用一套语法,却行为不一致。将它们合并,注定是错误的。

此外,早期关于相对字体单位(如em)的设计,也已被逻辑像素与设备像素的概念取代,后者更符合用户直觉。

SVG:强大但笨重的图形系统

SVG作为可嵌入的矢量图形语言,提供了强大的图形功能,如路径、渐变、遮罩等,甚至支持多边形命中测试,这些CSS做不到。但SVG并非CSS的子集,也不是其超集。两者存在许多细节差异,例如变换矩阵的处理逻辑不同。SVG拥有自己的“怪癖”,例如必须将所有坐标序列化为字符串。

SVG与CSS的融合,反而造成了API设计的混乱。在许多情况下,开发者需在HTML、CSS与SVG之间权衡取舍,尽管它们本质上都作用于同一图形栈。

遗憾的API设计决策

Web平台中许多功能,都因版本1的设计过于仓促而停滞不前。例如:

  • text-ellipsis 仅能处理单行文本,无法应用于段落;

  • position: sticky 实用但常常出现诡异行为;

  • z-index 缺乏相对层级控制,造成混乱的“+1/-1”战争。

这些问题反映出早期API设计中缺乏对长期演进的思考,而后续也未能通过模块化与可组合的方式解决。

Canvas:一个笨拙的“重绘”出口

近年来出现的“HTML in Canvas”提案,试图将HTML内容绘制到Canvas中,以获得完全的视觉控制。然而,这种方式本质上是将DOM强行嵌入Canvas中,为了保留布局与可访问性,最终反而限制了用途。

例如,若要绘制一个旋转立方体,开发者需手动绑定命中检测区域,并响应绘制事件。这种做法无法支持3D交互,仅能提供2D层面点击检测。更为关键的是:开发者必须接管元素所有交互责任,只为自定义其渲染方式。

这种Canvas方案,看似“可编程”,实则不过是无奈之举。当开发者想要在UI中实现DOM无法提供的功能(如内容虚拟化、定制交互、特殊视觉效果),却又不得不借助笨拙的Canvas与DOM组合,这无疑是对系统架构的一种拷问。

真正的出路:向下开放底层能力

Canvas并非无解,但它缺乏对系统字体、文本排版API与UI工具的原生支持。开发者甚至需自行实现断词、换行与测量功能,仅为实现“包裹文本”。

真正的解决方案,应是开放底层图形系统,而非继续在HTML/CSS/SVG之上堆砌补丁。这种“自上而下”的改造注定难以奏效。取而代之的应是“向下暴露原始能力”,让用户空间与底层逻辑一致,这正是良好内核设计的核心原则。

例如,Use.GPU 项目展示了基于WebGPU构建的HTML-like布局渲染系统,其使用Flex模型实现高效而简洁的UI布局——无DOM、无CSS,仅使用可组合的布局组件与着色器,定位直观、行为明确,甚至实现了垂直居中这种CSS难题。

这一系统展示了:无需HTML/CSS/SVG的沉重历史包袱,仅靠简洁的树状视图与渲染结构,即可完成DOM 90%的任务。

下一步该往哪里走?

从根本上重新设计DOM,去除所有历史遗留,可以为浏览器带来多线程、多来源、异步友好的全新架构。现代浏览器引擎已是多进程架构,但它们的设计仍然受限于1990年代的DOM模式。

另一些实验性浏览器项目,如Servo或Ladybird,也许能提出更清晰的替代方案。它们实现新功能时无需顾及历史兼容性,因此具备探索新范式的空间。

开发者应开始关注这些新兴技术,并对现有HTML/CSS/DOM系统保持警惕。重新思考UI工具链与平台基础设施,是时候了。因为,旧的DOM不再适应现代Web应用的需求——而新一代的Web,不应再背负它的遗产。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/94609.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94609.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/94609.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

客户管理系统的详细项目框架结构

以下是针对客户管理系统的详细项目框架结构&#xff0c;整合了核心业务模块&#xff08;客户信息、合同管理、售前售后等&#xff09;&#xff0c;并补充了实用扩展模块&#xff08;如数据统计、标签管理等&#xff09;&#xff0c;严格遵循Django模块化设计原则&#xff1a; c…

【01】OpenCV C#——C#开发环境OpenCvSharp 环境配置 工程搭建 及代码测试

文章目录一、OpenCV 介绍二、OpenCvSharp 介绍三、OpenCvSharp环境搭建3.1 创建新项目3.2 添加 NuGet组件3.3 代码测试3.4 相较于 C OpenCV不同的之处四、LearnOpenCV有时候&#xff0c;单纯c#做前端时会联合C实现的dll来落地某些功能由于有时候会用C - Opencv实现算法后封装成…

【解决办法】报错Found dtype Long but expected Float

Found dtype Long but expected Float错误通常发生在尝试将一个数据类型为Long的张量传递给一个期望数据类型为Float的函数或操作时。在PyTorch中&#xff0c;Long和Float是两种常见的数据类型&#xff0c;分别对应于64位整数和32位浮点数。某些函数或操作可能只接受特定数据类…

QtC++ 调用 tesseract开源库 搭配 Opencv 实现文字识别:从tesseract库基本介绍到实际应用实现

前言 在当今数字化时代&#xff0c;文字识别&#xff08;OCR&#xff09;技术已经渗透到我们生活和工作的方方面面&#xff0c;从扫描文档的自动排版到车牌识别、票据信息提取等&#xff0c;都离不开 OCR 技术的支持。而在众多 OCR 实现方案中&#xff0c;QtC 结合 tesseract 和…

数据集-目标检测系列- 地球仪 数据集 globe>> DataBall

数据集-目标检测系列- 地球仪 数据集 globe&#xff1e;&#xff1e; DataBall贵在坚持&#xff01;* 相关项目1&#xff09;数据集可视化项目&#xff1a;gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview2&#xff09;数据集训练、推理相关项目&…

[Oracle] DUAL数据表

Oracle中的DUAL数据表是一个特殊的单行单列虚拟表结构&#xff1a;1行1列SELECT * FROM DUAL;输出结果&#xff1a;列名默认DUMMY&#xff0c;值为X常见使用DUAL数据表的场景&#xff1a;1.系统函数调用测试当需要测试Oracle函数但不需要真实表数据时&#xff0c;我们可以考虑使…

第五篇: 深入解析基于 SQLAlchemy 的聊天记录持久化模块:`message_model` 与数据库操作封装

深入解析基于 SQLAlchemy 的聊天记录持久化模块:message_model 与数据库操作封装 作者:zgw 标签:SQLAlchemy、Python、FastAPI、数据库持久化、ORM、聊天系统、AI 应用开发 一、前言 在构建大模型应用(如聊天机器人、知识库问答系统)时,对话记录的持久化 是实现“可追溯…

学习游戏制作记录(将各种属性应用于战斗以及实体的死亡)8.5

1.将各种属性应用于战斗我们希望将上节课的CharactorState脚本作为一个父类&#xff0c;而玩家和敌人的属性状态都是继承自它的创建PlayerStats脚本&#xff1a;public class PlayerStats : CharactorState {private Player player;//获取玩家脚本protected override void Star…

Higgsfield平替,地球转场+动物竖中指AI视频教程

大家好&#xff0c;这里是K姐。 一个帮助你把AI真正用起来的女子。 最近TikTok上的网友已经集体疯魔了——刷到的视频总以高空航拍开场&#xff0c;镜头从地球拉近后&#xff0c;要么是橘猫蹲在白宫草坪比中指&#xff0c;要么是柴犬在富士山顶比中指…… 这种堪比好莱坞运镜…

界面规范的其他框架实现-列表-layui实现

另一个要改造的系统使用了layui&#xff0c;改造方式如下&#xff1a;斑马线&#xff1a;.layui-table[lay-even] tr:nth-child(even) {background-color: #f2f2f2 }鼠标滑过&#xff1a;.layui-table tbody tr:hover{background-color: #8dccff }标题行&#xff1a;.layui-tab…

STM32学习笔记2-GPIO的输出模式

GPIOGPIO&#xff1a;通用输入输出口&#xff1b;可配置8种输入输出模式引脚电平&#xff1a;0V-3.3V&#xff0c;部分引脚可容忍5V也可认为高电平&#xff0c;但是对于输出而言&#xff0c;最大就只能输出3.3V&#xff0c;因为供电就只有3.3V&#xff0c;能容忍5v的在以下的引…

Linux系统学习2之磁盘管理

了解磁盘内容&#xff1a;df&#xff1a;df -a &#xff08;-a是列出所有&#xff0c;-k以kb显示&#xff0c;-h以Gb显示&#xff0c;-m以Mbyte显示&#xff0c;-H为用1000b代替1024b&#xff0c;-t为显示文件类型&#xff0c;-i为用inode显示容量&#xff09;&#xff1a;&a…

北大、蚂蚁三个维度解构高效隐私保护机器学习:前沿进展+发展方向

在数据隐私日益重要的 AI 时代&#xff0c;如何在保护用户数据的同时高效运行机器学习模型&#xff0c;成为了学术界和工业界共同关注的难题。北大团队最新完成的综述《Towards Efficient Privacy-Preserving Machine Learning: A Systematic Review from Protocol, Model, and…

计算机网络:如何在实际网络中进行子网划分

在实际网络中,子网划分是通过“借位”将一个大的IP网络分割为多个小的子网,以提高IP地址利用率、增强网络安全性和简化管理。以下是具体的实施步骤、原理和注意事项: 一、子网划分的核心目的 提高IP利用率:避免大网络中IP地址的浪费(例如一个C类地址默认支持254台主机,若…

《第五篇》基于RapidOCR的图片和PDF文档加载器实现详解

基于RapidOCR的图片和PDF文档加载器实现详解 引言 在构建知识库时,我们经常需要处理包含图片和PDF文档的数据。这些文档中的文本信息通常以图像形式存在,需要通过OCR技术来提取。本文将详细介绍如何使用RapidOCR技术实现图片和PDF文档的文本提取加载器。 核心概念 RapidO…

[硬件电路-122]:模拟电路 - 信号处理电路 - 模拟电路与数字电路、各自的面临的难题对比?

数字电路和模拟电路是电子技术的两大基础分支&#xff0c;它们分别处理不同类型的信号&#xff0c;并在设计方法、元件特性、应用场景等方面存在显著差异。以下是两者的详细定义及异同对比&#xff1a;一、定义与核心概念1. 模拟电路&#xff08;Analog Circuit&#xff09;定义…

Linux多线程——线程控制

目录 1.线程知识补充 1.1 线程私有资源 1.2 线程共享资源 1.3 原生线程库 2、线程控制接口 2.1 线程创建 2.1.1 一批线程 2.2 线程等待 2.3 线程终止 2.4 线程实战 2.5 其他接口 2.5.1 关闭线程pthread_cancel 2.5.2 获取线程 ID pthread_self 2.5.3 线pthread_de…

Python爬虫实战:研究spiderfoot工具,构建网络情报收集系统

1. 引言 1.1 研究背景 在数字化时代,互联网公开信息已成为国家治理、企业决策与学术研究的战略资源。据 Statista 统计,2023 年全球互联网数据总量突破 120ZB,其中可通过公开渠道获取的情报信息占比超 30%。传统人工信息收集方式受限于效率与广度,难以应对海量数据处理需…

在路由器openwrt上安装openclas

在路由器openwrt上安装openclas 名词解释 las: lash 运行效果图 安装 安装教程参考&#xff1a; 官方&#xff1a;github.com 官方2&#xff1a;openclas.net 如果安装完成后菜单上没有&#xff0c;重启路由后在“服务”菜单下 点击运行会提示下载内核&#xff0c;按提示…

HIVE 窗口函数处理重复数据

窗口函数row_number()&#xff0c;结合OVER子句中的PARTITION BY和ORDER BY&#xff0c;为数据分组内的每一行生成一个唯一的序号。具体分析如下&#xff1a;函数作用&#xff1a;row_number()&#xff1a;为每个分组内的行分配一个唯一的连续序号&#xff08;从1开始&#xff…