多个小接口能不能合并成一个来减少请求?
最近在做商品详情页,页面要同时拉取商品信息、库存、评论数和用户收藏状态,现在是分开四个请求发的。听说接口合并能优化性能,但不确定怎么搞才合理?
我试过让后端加一个聚合接口,但前端调用时参数不好统一,而且有些数据其实不一定每次都需要。比如评论数可能缓存就行,收藏状态又依赖用户登录态……这样硬合在一起会不会反而更乱?
现在代码大概是这样的:
useEffect(() => {
fetch('/api/product/detail?id=123');
fetch('/api/product/stock?id=123');
fetch('/api/product/comments/count?id=123');
if (user) fetch(<code>/api/user/favorite?product_id=123</code>);
}, []);
有没有什么经验可以分享?合并接口到底值不值得做?
你担心的问题很实际。硬把四个接口捏成一个,确实会引入复杂度:
- 参数组合爆炸,有些数据不需要还得传
- 缓存策略互相影响
- 登录态不确定的时候接口返回什么?
更合理的做法是按需获取,而不是硬合并。
如果你们用的是WordPress REST API,可以利用它的嵌入机制,一个请求搞定关联数据:
如果评论数是评论插件提供的,可以看看那个插件有没有类似的嵌入支持。
前端那边其实可以换个思路,别在useEffect里堆四个请求,用一个自定义hook封装一下:
这样至少代码清晰,调用方不用关心具体几个请求。
如果后端能配合,弄一个BFF层统一聚合是最好的,但参数设计要灵活,比如支持可选字段:
后端根据fields参数动态组装返回数据,这样既减少请求,又保持灵活性。
总结一下:不要为了合并而合并,关键是看后端配合程度和业务复杂度。Promise.all并行请求其实延迟没你想的那么大,真正该优化的是减少不必要的请求和字段冗余。