Niwa:一方安静的新标签页
我给自己写的浏览器新标签页扩展:随节气和时辰变化的山水,快捷方式和小组件自由摆放。没有服务器,数据只存在自己的浏览器里。已上架 Edge 扩展商店,MIT 开源。
原创WXT / React / TypeScript / Remotion约 2 分钟
Niwa(庭)是我写的浏览器新标签页扩展,Edge 和 Chrome 都能用。
之前用的新标签页扩展一更新就被浏览器停用,每次都得手动重新打开;想在新标签页看课程表做不到,天气也换不成自己信得过的接口。于是自己写了一个。打开新标签页是一片随季节和时辰变化的山水,深色模式叫「夜庭」,月亮按当天真实的月相画。


它有什么
时间旁边写着今天的节气和七十二候,下面一行小字是这一候在元代吴澄《月令七十二候集解》里的原文。原文取自维基文库,繁体转简体时出错的几个字逐一校对过。
快捷方式和小组件放在同一张网格里,可以拖到任意位置、留空、竖着叠,快捷方式还能收进文件夹。拖动参照手机桌面:指针停稳了,别的格子才让位,划过去的格子不会动。小组件有 10 种:日程(订阅 iCal 地址,或者直接把课程表的 .ics 文件拖进去)、天气、便签、世界时钟、计时器、热榜、RSS、收藏夹、历史,还有一方小小的「庭」,你打开的天数越多,里面长出的石头、青苔、树和灯笼就越多。Codex 生成的宠物也能导入进来,浮在页面上。
它没有服务器,不收集、不上传任何数据。打开新标签页本身不联网,只有在你用到订阅日历、查天气这类功能时,才直接请求对应的网站;安装时不申请敏感权限,用到时再问。
宣传片
下面这段 21 秒的视频也是写代码做出来的:用 Remotion(用 React 写视频)把扩展的截图分层做成动画,庭那一段直接用了扩展里的组件。配乐是用代码合成的五声音阶,每个格子弹出、庭每长一次,都对着一个音。
怎么做的
用 WXT、React 和 TypeScript 写,约 1.1 万行。拖放规则写成纯函数,单元测试用字母画出网格,每条都写明期望的摆放;页面测试用无头 Edge 跑真实的构建产物,21 组测试覆盖文件夹、备份恢复、日历导入、计时器等。
导入 Codex 宠物时,图片格式怎么处理、动画怎么省内存,以及每个标签页实测多占多少内存,写在博客里:把 Codex 宠物放进新标签页:格式、动画和内存实测。