alitrack

不用微服务、不用Redis、不用AI——这个热榜聚合器拿了21K stars

你有多久没打开微博热搜了? 不是因为不关心热点,而是因为 打开一个 App 只看热榜太麻烦 。微博、知乎、百度、B站、36氪、华尔街见闻……每个平台都有一套热榜,每个都想让你留在自己的 App 里。结果就是:想看全平台热点,得跳来跳去至少 10 个 App。 有个人受够了这件事。他用了一种最笨的办法解决了它。 而且这个办法拿了 GitHub 上 21,000 个 star。 ● ● ●

5000 行 TypeScript,没有微服务

NewsNow 是一个开源热榜聚合器,GitHub 地址 github.com/ourongxing/newsnow。它把 46 个平台的热榜汇总到一个网页上,按"国内""国际""科技""财经""体育"分栏显示,每 2-30 分钟自动更新一次。 它的架构呢? 说出来你可能不信: 没有微服务。没有 Redis。没有消息队列。没有 AI。 就是一个 React 前端 + 一个 SQLite 数据库 + 45 个 cheerio 爬虫文件。 每个爬虫大概长这样——用 cheerio 解析网页 HTML,提取热榜标题和链接:
// 微博热搜爬虫(53 行) const html = await fetch("https://s.weibo.com/top/summary?cate=realtimehot") const $ = cheerio.load(html) $("#pl_top_realtimehot table tbody tr").each((_, row) => {   // 提取标题、链接、热度标记 })
就这。53 行 TypeScript 实现一个微博热搜爬虫。没有用 Puppeteer 渲染页面(太重),没有用官方 API(大部分平台不提供),甚至没有做任何反爬对抗——就是最简单的 HTTP 请求 + DOM 解析。 问题来了: 这种方案不是分分钟被平台改版搞挂吗? 是的。NewsNow 的 153 个 open issue 里,大量是"XX 平台的 CSS selector 变了,挂了"。 但这不是 bug,这是 feature——至少对于 NewsNow 的目标用户来说是这样。 ● ● ●

两层的缓存策略,比你想的聪明

NewsNow 有一个容易被忽略的亮点:它的缓存设计。 NewsNow 的缓存设计用了两层: 第一层:interval(源级别,2-60 分钟)。 每个源有自己的更新频率。微博热搜变化快,2 分钟刷一次。参考消息一天才更新几次,60 分钟刷一次就够了。在这个间隔内,直接返回缓存,完全不请求源站。 第二层:TTL(全局缓存窗口,10 分钟)。 缓存过期后,普通用户继续用旧缓存。只有登录用户(GitHub OAuth)才能触发 force-refresh。 这个设计的妙处在于: 它让一个免费部署在 Cloudflare Pages 上的服务,扛住了 21K star 带来的访问量。 没有写分布式缓存,没有上 CDN purge,没有做消息队列排队。就是两层 SQLite,解决了 99% 的场景。 Redis 当然更好,但 Cloudflare Pages 不提供 Redis。SQLite 在单机场景下完全够用,better-sqlite3 的同步 API 性能极高。 这里有一个更深的原则: 用你当前环境里最好的工具,而不是用架构博客里最酷的工具。 NewsNow 的部署目标就是 Cloudflare Pages——免费、零运维。在这个约束下,SQLite > Redis,cheerio > Puppeteer,两层缓存 > 消息队列。 ● ● ●

21K stars 到底在 star 什么?

回看这个数字:21,000 stars,5,800 forks,40 个 release,22 个月持续迭代。 如果只看代码质量——单作者、无测试、爬虫脆弱——这不应该是一个 21K 的项目。 但 star 的多寡和代码质量的关系,就像票房和导演水平的关系:有关联,但不是主要因素。 NewsNow 赢在三件事上: 1. 产品完整。 不是一个 API,不是一个爬虫,不是一套组件。而是一个打开浏览器就能用的热榜聚合器,有 UI、有分类、有搜索、能登录、能自定义——而且支持 PWA,安装后像原生 App。 2. 零成本部署。 Cloudflare Pages 免费 + D1 数据库免费。fork 项目 → 填 3 个环境变量 → 部署。全过程 5 分钟。 3. 刚好够用。 没有做个性化推荐(太重),没有做全文检索(太重),没有做 AI 摘要(太重)。就是把热榜做好。用户要的就是这个,不多不少。 这三件事的背后,是一条反常识的产品设计原则: 用户不关心你的架构,只关心你的产品好不好用。 你用微服务还是单体,用 Redis 还是 SQLite,用 AI 还是正则——用户不在乎。用户只在乎:打开快不快、好不好看、信息全不全。 NewsNow 在这三个维度上都做到了"够好"。 ● ● ●

对 AI 从业者意味着什么

NewsNow 还有一个容易被忽略的动作:它提供了 MCP Server。
{   "mcpServers": {     "newsnow": {       "command": "npx",       "args": ["-y", "newsnow-mcp-server"]     }   } }
这意味着任何接入 MCP 协议的 AI agent(包括 Claude Desktop、Cursor、Hermes)都可以直接查询热榜数据——不需要爬虫、不需要 API key、不需要自己部署。 这是一个重要的趋势: 信息聚合类工具的价值,正在从"给人看"转向"给 agent 看"。 把热榜数据呈现给 AI agent,但方向是对的——未来最有价值的热榜聚合器,可能不是给人用的前端,而是给 agent 用的标准化数据入口。 有人已经在做这件事。sorrycc(云谦,umi/dva 作者)把 NewsNow 的爬虫部分提取出来,做成了一个 CLI 工具: npx newsnow hackernews 直接输出 JSON,可以用 jq 管道处理,也可以被 agent 消费。 这个方向的价值远大于做一个更好看的前端。 ● ● ●

最后

NewsNow 不值得从工程上学习——爬虫脆弱、单作者风险、无测试。它目前只有中文源,"multi-language support"在 Roadmap 里写了两年还没实现。 但它值得从产品上学习。 这件事说明: 解决一个足够小的刚需 + 做到"刚好够用" + 让用户零成本试用 = 在信息过载时代依然有效的产品公式。 不需要微服务。不需要 Redis。甚至不需要 AI。一个好看的网页、45 个爬虫、一层 SQLite 缓存,就够了。 下次有人跟你说"这个项目太简单了,没有什么技术含量"——告诉他,NewsNow 也没有,但它有 21,000 个 star。 NewsNow: github.com/ourongxing/newsnow CLI 版本(sorrycc): github.com/sorrycc/newsnow 你习惯在哪个平台追热点?有没有考虑过自己部署一个热榜聚合器?评论区聊聊。