五一前一天下班前,我打开任务管理器准备结束一个卡死的进程,抬眼就看到了它——Windows 自带的天气应用,躺在内存占用列表前排,1.2GB。
我当时以为自己没睡醒。一个天气预报,显示今天23度、明天有雨的那种,凭什么吃掉1.2GB内存?刷新了一下,还是1.2GB。别问,问就是我盯着那个数字看了五分钟,心里在算这台16GB内存的机器还剩多少余粮。
后来我又观察了几天,那数字还会自己波动:最小化之后能降到五六百MB,但只要你去缩放一下地图、切个城市,瞬间冲回1.5GB。在8GB内存的机器上,这一个应用就能吃掉可用内存的五分之一。我不确定那些只有8GB内存的用户打开这个应用时风扇转得有多响,但我猜应该是挺响的。
为了确认不是我机器的问题,我顺手对比了一下手边那台装着macOS的本子——系统自带的天气应用,同条件下不到250MB。五倍的差距。同一个功能,几乎一样的界面,一个吃掉你内存的十二分之一,一个吃不到六十四分之一。我说这个不为了证明哪个系统更好,我主力机器一直是Windows,但五倍就是五倍,这个差距没法用"平台习惯"解释,只能归到工程头上。
然后我去查了原因。答案比我想象的简单得多,也无奈得多:Windows 11的天气应用压根不是一个"应用",它是一个网页。基于WebView2,把微软自家的MSN天气站点拉到Chromium里渲染。说人话就是——你每次打开天气预报,都相当于后台悄悄启动了一个Chrome。
我当时用PowerShell确认了一下,看到的进程列表长这样:
Get-Process | Where-Object { $_.ProcessName -match 'msedgewebview2' } |
Sort-Object WorkingSet64 -Descending | Select-Object -First 5 `
Name, @{l='MB';e={[math]::Round($_.WorkingSet64/1MB)}}
一排msedgewebview2进程,每个单看都不大,加起来轻松破1G。这不是在显示天气,这是在裸奔一个完整的浏览器运行时。你看到的不是一个天气预报,是一个正在运行的浏览器实例,顺便显示了一下气温。
画外音:用WebView2做桌面应用,能省掉一个原生UI团队,代价是每台8GB内存的电脑上挂着一个隐形的浏览器,这个交换划不划算,微软自己心里有数。
扯远一句,我以前觉得"套壳"这个词太糙,不体面。但看到这个应用的时候,我真想不出更准确的描述了。我不是说微软是独一份——现在多少挂着"原生"名字的桌面应用,实际都是网页套壳,能用就行。可问题是,你用网页技术做一个本地逻辑可能只有几百KB的天气应用,内存代价就摆在那儿,藏都藏不住。更无语的是,应用里还内置了赞助内容,预报和广告混在同一个feed里滚动——所以这1.2GB根本不是天气预报的成本,是"天气预报+程序化广告渲染+用户停留时长优化"的综合成本。你以为你打开的是一个系统应用,人家当你是广告流量。
这让我想起的还真不是Mac——是我自己用AI编程工具踩的那些坑。上个月,我让Claude Code帮我写一个内部监控工具的前端模块。它跑起来了,测试过了,diff我也看了,逻辑干净,注释齐全,一切都很完美。三天后同事不经意提了一句"这工具怎么内存吃这么大",我去检查,好家伙,那个模块常驻1.5GB。原因是我让它用了Electron的壳,它把整个监控历史都给我缓存进内存了。当时我的开发机内存有64GB,跑起来毫无感觉;用这工具的同事,机器只有8GB。
我还真说不出"这是AI的错"这种话。因为我回头看自己写的prompt——里面根本没提内存约束。我的任务是"把这个监控面板跑起来",AI的目标是在这个模糊指令下选一条最有把握的路:Electron,什么都有,万无一失。它不知道用户的机器是8GB还是128GB,不知道这是一个常驻工具而不是一次性脚本,甚至不知道"常驻工具"意味着什么。这就像微软的工程师在32GB内存的开发机上review天气应用——一切都很快、很流畅,于是没有人觉得有问题。工具不知道历史,这不是它的错,是我没把约束交代清楚。
这里我得承认一个判断失误。我一开始觉得,反正AI帮我省下了写UI的时间,后面加个优化也不难。后来想明白,不对——框架一旦选定了,后面的优化全是补救。Electron套壳的通行证是开发效率,债主是运行时内存。你以为你欠的是技术债,但技术债会还,用户的内存不会等。
WebView2版本的天气应用,大概率是同一个逻辑:用Web技术栈,一套代码能复用网页端的迭代速度,广告SDK现成,UI更新不用等系统版本发布。开发效率拉满,用户体验垫底。微软不是做不出原生天气应用——他们不是说了嘛,未来要开发更多彻底原生的Windows应用。这话听着耳熟,十多年前好像也有人这么说过。我不打算讽刺这一次的表态,万一他们真做呢。但我不打算等了。
为一个五天的天气预报,我已经换回了自己写的一个抓取脚本——几十行,拉API数据,渲染成文本,放到桌面上。没有动画,没有广告,界面丑得像上个世纪,但内存占用不到30MB。我不需要1.2GB来告诉我明天会不会下雨。
最后留一条规则给自己:凡是要交付给普通用户跑的常驻工具,prompt里必须写明内存预算和运行环境;代码review必须真的打开任务管理器看一眼——不看内存就等于没review。这条规则,是1.2GB的天气预报教给我的。
