实时通信技术选型:从长轮询到WebTransport的二十年演进
2011年,当一个聊天应用需要显示对方"正在输入"的状态时,开发者不得不让客户端每隔几秒向服务器发一次请求——问一句"有新消息吗?",服务器回答"没有",然后重复。这种愚蠢的对话在HTTP的世界里持续了整整十五年。 ...
2011年,当一个聊天应用需要显示对方"正在输入"的状态时,开发者不得不让客户端每隔几秒向服务器发一次请求——问一句"有新消息吗?",服务器回答"没有",然后重复。这种愚蠢的对话在HTTP的世界里持续了整整十五年。 ...
1994年6月,Netscape的工程师Lou Montulli面临一个棘手的技术问题。MCI公司正在开发一个电子商务应用,他们不想在服务器端维护用户的购物车状态——这会消耗大量服务器资源。Montulli想到了一个解决方案:让浏览器"记住"一些数据。他从Unix系统的"magic cookie"概念中汲取灵感,设计出了HTTP Cookie。 ...
JavaScript从诞生之初就背负着单线程的命运。这个设计决策在1995年看起来理所当然——浏览器只需要处理简单的表单验证和DOM操作。但三十年后,当Web应用需要在浏览器中运行视频编解码、物理模拟、甚至机器学习模型时,单线程的限制就成了一个无法回避的架构瓶颈。 ...
当你按下F12打开开发者工具时,看到的是一套图形化的调试界面:Elements面板展示DOM树,Network面板记录请求,Sources面板支持断点调试。但你是否想过,这些界面是如何与浏览器内核通信的?答案藏在幕后的一个协议中——Chrome DevTools Protocol(CDP)。 ...
你可能在某个午后兴冲冲地将项目中的import _ from 'lodash'改成了import { debounce } from 'lodash-es',期待着构建产物大幅瘦身。然而,当你打开webpack-bundle-analyzer,却发现那个庞大的lodash依然盘踞在bundle中,仿佛对你的优化努力嗤之以鼻。 ...
当你写下 grid-template-columns: 1fr 1fr 1fr 时,你是否真正理解那三个 fr 是如何瓜分容器宽度的?当你发现设置了 minmax(200px, 1fr) 的列在某些情况下却只有100px时,你是否知道浏览器在背后做了什么? ...
1981年,Jon Postel在RFC 793中定义了TCP的核心机制,其中累积确认(Cumulative Acknowledgment)的设计在当时看来简洁而优雅:接收方只需报告"我已经收到序列号N之前的所有数据"。这种设计在单包丢失场景下工作良好,但当网络中出现多个数据包丢失时,它暴露出了根本性的信息缺失问题——发送方根本不知道哪些数据已经成功到达,哪些需要重传。 ...