跳到主要内容

这个 Angular 查询库很干净,但干净不是护城河

算账先生
算账先生

· 阅读约 5 分钟

先把这个结论撂这:ngx-signal-query 是这半年 Angular 生态里我看过的、代码写得最干净的一块补丁——但补丁做到头,也只是补丁。真正的问题不在它补了什么,在它为谁在补、又要补到哪一天为止。官方不给的,个人来给;个人给的,官方将来收不收?这笔账,得拆开算。

说句扫兴的,Angular 19.2 把 httpResource 和 resource 端出来那会儿,我第一反应是:Angular 可算把数据获取也 signal 化了,方向没毛病。但再往深一看,官方给的是原语。原语是什么意思?就是"给你两根轴,自己造轮子去"。共享缓存?没有。跨组件请求去重?没有。跨组件失效?没有。突变生命周期?没有。重试、轮询、staleTime?统统没有。Hutaryan 在 dev.to 那篇文章里把这些缺的东西一条条列出来,不是抱怨,是动手补了。这一点我认,不阴阳怪气。

他补出来的这个库,1.0.0 也发了,MIT 也挂了,要求 Angular 19+,queryFn 原生吃 Observable 和 Promise,不用再去翻 firstValueFrom 那种啰嗦语法。完全基于 Angular Signals 构建——注意,是"完全",没有框架无关的核心引擎。这件事两面看。代码体积小、易读易分叉是真的,你花一个下午就能把它整条数据流看明白。但它本质上就是为 Angular 信号生态量身写的,不打算吃跨框架那碗饭。这不算缺点,算定位。

但真正要我算的账,不在它写了什么,在它没写什么。作者自己在评论里也列了:refetchOnWindowFocus、无限/分页查询、开发者工具、SSR/水合、缓存持久化、select/placeholderData/structural sharing——这些还没有。听起来只是一串待办事项,但内行都知道,这串"待办"才是生产级查询库的真门槛。query 核心那部分,一个靠谱的工程师两三个星期能写完,剩下的边角功能每一样都是时间黑洞。TanStack Query 从四十版本到五十三版本,花了多少年才把这些补齐?一个个人开发者,在业余时间,凭什么填完这张账单?

他自己也清楚,所以 GC 机制那边给的方案是观察者引用计数加可配置的 gcTime 定时器,默认五分钟。这个设计思路跟 TanStack Query 走得挺近,说明他是懂行的人,不是拿个 demo 就敢发文那种。但懂行归懂行,单人维护的结构性尴尬不因为懂行就消失。如果他这个库半年后还是 1.0.0,或者停在 1.1、1.2 不再动了,谁接?Angular 生态里这种事不是没发生过——一个人做了个好库,用的人渐渐多了,然后人不见了。库还活着,地基已经是松的。

所以这地方藏着一笔认知税。使用者在生产项目里引了它,前面几个月会很好用,signals 原生、查询键响应式、乐观更新不乱来,这些体验确实不错。但当你开始需要 SSR 支持——angular universal 那边应用越来越多——或者需要 dev tools 排查缓存命中率的时候,你会发现它是没有的。这时候你已经把项目里十几二十个地方都接上了它的 injectQuery,切回去?成本实打实。不切?你就只能等一个不确定的人在不确定的未来,把那些功能补上。你等的这段时间里,没人是欠你的。这笔账,是你当初没看清楚就进的场。

那这个库值不值得用?我的判断分场景,不搞一刀切。中小项目、组件树不深、查询逻辑不复杂、半年内不上 SSR——用完就赚,代码比官方原语裸奔强太多,也比在信号环境里硬塞别的方案自然。大项目、重度依赖共享缓存和复杂失效链、或者你清楚自己年底之前要上 angular universal 的——先别上这条船。不是这船不好开,是这船现在连水密舱都还没焊全,等你发现漏了再跳,比你一开始就站在岸上看狼狈多了。真忍不住,找个边缘模块试一版,别把核心链路押上去。

那怎么办?作者的路我说三条,哪条最实在得他自己挑。往深里做,趁 Angular 生态里这个位子还空着,把生产级那摊账一点点啃下来,吃第一波成熟红利。往官方靠,看看能不能被 Angular 团队吸纳进官方生态,或者至少借着这个库的口碑拿到更高溢价的活儿——写代码的人走这条路不丢人。第三条,保持小而美,但必须在文档里把"不适合大项目"五个字明明白白写上,别让用户自己踩了一遍才反应过来。前两条都得花时间,第三条最省事,但恰恰是大多数人放不下的——谁愿意亲自承认自己做出来的东西天花板就这么高呢。

最后这笔账我反过来算给 Angular 团队听。你们给原语,这个没毛病,原语是好的。但查询缓存这种基础能力,不是"高级需求",是现代前端框架数据层的标配。你们把用户甩给个人开发者去兜底,一次两次是社区活力,常年如此就是产品债务。等哪天官方想起来要做第一方查询缓存了,ngx-signal-query 这类库的生态位瞬间尴尬——不是它们不好,是官方下场了。而这事会不会发生,我不下死话,再看看。但账本上可以记一句:一个框架的长期依赖不能建立在"某个好人刚好有空"上面。

算账先生
算账先生

用算账视角看 AI 工具这门生意——红利、认知差、护城河,泼完冷水给一条窄路。

查看主页 →