我与 IT 这三十年:1997,那只蝴蝶飞过浏览器战争

发布时间:2026/9/27 14:26:14

我与 IT 这三十年:1997,那只蝴蝶飞过浏览器战争
上一篇写到 1996 年,我说那一年屏幕还很小,世界刚刚变大。文章最后留下了一只蝴蝶:1997 年,我用 JavaScript 写过一个小程序,一只蝴蝶可以在页面上飞舞。现在回头看,这件事小得不能再小。它不是一个系统,不是一个项目,不是一个能上生产的产品,也不是一段值得放进简历的经历。它只是一个网页小动画。鼠标、窗口、脚本、图片、坐标、定时器,凑在一起,让一只蝴蝶在浏览器里飞来飞去。但三十年后再想,我反而觉得那只蝴蝶比很多正式项目更像一个时代的标本。因为它飞起来的时候,Web 还没有今天这么稳。HTML 是页面,JavaScript 是新鲜玩意儿,CSS 刚开始试图给网页一点像样的表现能力。浏览器厂商彼此不服,标准还在追赶现实,程序员写一个小动画,都可能要面对不同浏览器完全不同的脾气。那只蝴蝶不是飞在一个成熟的平台上。它飞在浏览器战争的缝隙里。先让页面动起来今天写一个网页动画很容易。CSS animation、requestAnimationFrame、Canvas、SVG、WebGL、各种框架和组件库,随便拿一个都能做出比当年复杂得多的效果。1997 年不是这样。那时你想让页面动起来,先要相信一件事:浏览器不只是文档阅读器。它可以执行脚本,可以响应用户,可以改变页面内容,可以把原本静止的 HTML 变成一个有行为的东西。这个想法现在理所当然,当年却很新鲜。我写那只蝴蝶,大概就是从最朴素的坐标开始。页面上有一个图片元素,脚本不断改变它的位置。为了让它看起来不是机械地横着走,还要给它一点上下浮动,一点速度变化,一点边界反弹。蝴蝶不是真的会飞,只是坐标不断变化,浏览器不断重绘。可就是这种“假的飞”,让人第一次感到网页有了生命。一只在早期浏览器窗口中飞舞的像素蝴蝶。图为按年代氛围生成的示意图。这件事的技术含量,在今天看当然很低。可是当时真正让人费劲的,不是动画数学,而是浏览器差异。同一段脚本,在一个浏览器里能跑,在另一个浏览器里可能不认。这个对象有,那个对象没有;这个属性这样叫,那个属性换了名字;这个事件能触发,那个事件行为又不一样。你要写判断,要试,要改,要在心里记住不同浏览器的怪癖。很多年后,前端工程发展出一整套工具链:兼容层、构建工具、Polyfill、Babel、框架、测试、打包、组件化。它们看起来很现代,但根子上解决的仍然是同一个问题:Web 是开放的,开放就意味着差异;Web 是开放的,开放也意味着没有谁能彻底控制它。1997 年的程序员还没有这些成熟工具,只能手工对付差异。所以那只蝴蝶飞得并不轻盈。它每飞一下,背后都有一堆 if。DHTML:网页第一次想做应用1997 年,浏览器大战已经不是口号,而是每个网页作者都能直接感受到的现实。

相关新闻

Momentum-Firmware RGB背光控制系统:打造个性化Flipper Zero灯光体验 [特殊字符]

Momentum-Firmware RGB背光控制系统:打造个性化Flipper Zero灯光体验 [特殊字符]

2026/9/2 18:04:35

Momentum-Firmware RGB背光控制系统:打造个性化Flipper Zero灯光体验 🎨 【免费下载链接】Momentum-Firmware 🐬 Feature-rich, stable and customizable Flipper Firmware 项目地址: https://gitcode.com/GitHub_Trending/mo/Momentum-Fir…

3步快速上手MMSegmentation:从零开始掌握语义分割实战

3步快速上手MMSegmentation:从零开始掌握语义分割实战

2026/9/1 13:01:02

3步快速上手MMSegmentation:从零开始掌握语义分割实战 【免费下载链接】mmsegmentation OpenMMLab Semantic Segmentation Toolbox and Benchmark. 项目地址: https://gitcode.com/GitHub_Trending/mm/mmsegmentation 语义分割是计算机视觉领域的核心技术之一…

vLLM加载优化终极指南:从分钟级等待到秒级启动的实战手册

vLLM加载优化终极指南:从分钟级等待到秒级启动的实战手册

2026/9/7 22:50:52

vLLM加载优化终极指南:从分钟级等待到秒级启动的实战手册 【免费下载链接】vllm A high-throughput and memory-efficient inference and serving engine for LLMs 项目地址: https://gitcode.com/GitHub_Trending/vl/vllm 在大语言模型部署的战场上&#xf…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/26 19:14:12

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/27 1:30:29

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/27 1:30:37

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/27 1:30:35

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/27 1:30:34

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/26 16:36:51

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/26 14:29:04

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/26 13:57:22

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/26 23:35:16

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…