问题

前端拿到后端的数据,不能直接用,还要再处理,这样合理吗?

回答
前端拿到后端数据后,进行二次处理,这在实际开发中是非常常见且合理的。 实际上,这几乎是必须的。下面我将详细解释为什么会这样,以及其中涉及的一些具体原因和常见场景。

核心原因:职责分离与关注点分离

最根本的原因在于“职责分离”和“关注点分离”这两个软件工程中的基本原则。

后端(Serverside): 后端的首要职责是 数据管理、业务逻辑处理、安全控制和与数据库的交互。它负责从数据源(如数据库)获取原始数据,进行必要的计算、验证、聚合,并以一种统一的、结构化的格式(通常是JSON)提供给客户端。后端的数据往往是“原始的”、“面向数据库的”或者“面向业务流程的”。

前端(Clientside): 前端的首要职责是 用户界面(UI)的展示和用户交互的处理。它负责将数据转化为用户能够理解和操作的视觉元素,并响应用户的各种操作(点击、输入、滚动等)。前端的数据处理是为了 满足UI展示的特定需求。

这两者职责不同,关注点也不同。后端关心的是数据的准确性、一致性和安全性,以及如何高效地执行业务逻辑。而前端关心的是如何将这些数据以最用户友好、最直观的方式呈现出来,以及如何通过这些数据驱动用户体验。

为什么前端需要处理后端数据?常见场景与原因:

1. 数据格式的适配与转换:
日期/时间格式: 后端可能存储的是 Unix 时间戳(如 `1678886400000`)或 ISO 格式的字符串(如 `"20230315T10:00:00.000Z"`)。前端需要将其转换为用户习惯的可读格式,如 `"2023年3月15日 10:00"`、`"今天 10:00"`、或者根据用户时区调整显示。
数值格式: 后端可能返回纯数字(如 `12345.67`),前端可能需要格式化为带千位分隔符的货币格式(如 `¥12,345.67`)或带有特定单位(如 `12.35KB`)。
布尔值: 后端可能返回 0/1, true/false, "true"/"false", 或者其他表示形式。前端需要将其转换为 UI 中易于理解的布尔类型(如 true/false)来控制元素的显隐或状态。
枚举值/状态码: 后端可能返回一个数字(如 `status: 1`)代表某个状态,前端需要将其映射到对应的中文描述(如 `"待处理"`)、颜色类名(如 `statuspending`)或图标。

2. 数据结构/模型的调整:
扁平化与嵌套: 后端为了减少请求次数,可能将关联数据一起返回,形成嵌套结构(如用户对象中包含其地址对象)。前端在展示时,可能需要将这些数据扁平化,或者根据 UI 的需要进行二次组织。反之亦然,后端可能返回扁平列表,前端需要根据 ID 将其重构成树形结构或嵌套结构。
数据字段的增减/重命名: 后端提供的字段可能不完全符合前端 UI 的命名习惯,或者包含了一些前端不需要的冗余字段。前端可以进行筛选、重命名,使其更符合前端组件的使用。
合并/拆分数据: 可能需要将来自不同接口的数据合并到一起,或者将一个大的数据对象拆分成几个小的、易于管理的部分。

3. 业务逻辑的客户端实现:
数据校验(客户端预校验): 虽然后端是数据校验的最终关卡,但前端也常常会做一些“友好性”的预校验,例如在用户提交表单前,检查必填项是否填写、数字是否在范围内等,以便即时反馈给用户,提升用户体验。
状态管理与计算: 前端可能需要根据拿到的数据计算出新的状态,例如一个列表的总数、某个选项是否被选中、某个按钮是否可点击等,这些计算结果会直接影响到 UI 的动态变化。
分页和排序(前端侧): 对于数据量不大的列表,或者对实时性要求不高的场景,前端可以一次性获取所有数据,然后在客户端进行分页、排序、过滤等操作,这样可以减少后端压力和请求次数(但要注意数据量大的情况下不适用)。

4. API 设计的约束与演进:
API 并非为 UI 而生: 后端 API 的设计往往是服务于整个应用生态,可能需要考虑多个客户端(Web、Mobile App 等)的通用性,而不一定能完全满足某个特定前端页面的所有细节需求。
API 的稳定性与迭代: 后端 API 的迭代可能较慢,或者出于历史原因保留了不理想的数据格式或字段。前端作为最贴近用户体验的层,需要灵活地适应这些变化,通过自身的处理层来桥接。
微服务架构: 在微服务架构中,一个前端页面可能需要调用多个后端服务,这些服务返回的数据格式、字段名称都可能不一致。前端需要负责将这些零散的数据整合、清洗、统一后,再传递给 UI 层。

5. 性能优化与用户体验:
减少 HTTP 请求: 有时后端会将一些零散但常用的数据(如配置项、枚举字典)一同返回,前端拿到后可以在内存中缓存起来,避免重复请求。
数据懒加载与预加载: 根据用户的交互行为,前端可以动态地处理和准备下一批数据,以提升页面的响应速度和流畅度。

这种处理方式是否合理?

绝对合理,而且是优秀实践。

解耦: 它很好地实现了前端和后端之间的解耦。后端不需要知道前端具体如何展示数据,前端也不必关心后端数据的底层存储和复杂计算过程。这种清晰的职责划分使得双方可以独立开发和迭代。
灵活性: 前端可以根据产品的迭代需求、设计风格的变化,快速调整数据的呈现方式,而无需修改后端代码。如果后端 API 发生变化,前端只需调整相应的数据处理逻辑,影响范围相对可控。
专注性: 后端可以专注于数据管理和核心业务逻辑,前端可以专注于用户体验和界面交互,各自发挥优势。

潜在的缺点(需要权衡):

当然,前端处理数据也带来了一些需要注意的点:

增加了前端的复杂度: 前端需要编写更多的数据处理逻辑,可能导致代码量增加,维护成本提高。
潜在的性能开销: 过度复杂或低效的数据处理逻辑可能会影响前端的渲染性能。
数据同步问题: 如果前端处理了数据,但后端的数据发生了变化,前端需要有机制来重新获取和处理,否则可能出现数据不一致的情况。

总结

前端拿到后端数据后进行二次处理,是软件工程中职责分离、关注点分离原则的自然体现,也是为了满足 UI 展示、用户交互和产品迭代灵活性的必然要求。它不是一种“无奈之举”,而是为了构建更健壮、更灵活、更易于维护的 Web 应用的必要手段。关键在于如何平衡前端数据处理的复杂性与后端 API 的设计,以及如何写出高效、清晰的数据处理代码。

所以,当你的前端同事告诉你,拿到后端数据后还需要加工一下才能用时,这几乎是一个标准操作,而且是值得肯定的开发模式。

网友意见

user avatar

前端要求后端传来的数据格式能够直接用于渲染是不合理的

同样,后端直接从数据库里扒下来的数据格式就丢给前端也是不合适的。

—————————————————————————————

前端和后端对于数据的需求是不一样的。

前端的数据是用于展示的,展示的形式有很多样,数据的形式也很多样,将这一部分数据的逻辑抛给后台,会带来不必要的耦合。前端更改下显示效果还需要修改后台代码,显然不合适。

后端的数据需要通过关系型数据库进行持久化存储,自然要受到数据库表/行的格式的束缚。如果后端交付的接口是基于数据库的形式而非业务模型的形式,那么每个调用者都要进行数据库格式到业务模型之间的转换,这同样不合适。

这个接口和程序语言里面的接口思想上是类似的,都是一种对业务/功能行为的抽象。

—————————————————————————————

然,知道这个并没有什么用。前端和后端在接口数据格式上还是该撕逼撕逼。

—————————————————————————————

看了其他答者的答案,更新下。

前端要求后端传来的数据格式能够直接用于渲染,是什么一个情况呢?举个例子,后端提供一个接口获取某单位所有人员的接口。前端则需要根据用户的职级分类显示,那么前端的数据显然是要根据不同职级进行合并,这合并的数据操作能放到后端的接口中么,显然是不行的。假如需求改了,或者其他入口需要根据年龄段分类显示所有人员,本来这只是跟前端显示有关系的需求变更反而还需要改后台代码。

后端直接从数据库里扒下来的数据格式就丢给前端,又是个什么情况?一个更为常见的例子就是树格式。数据库的格式是基于行和表的,并不存在嵌套,是不可能的存在一个children 属性里面包含子节点的格式。所以一般数据库存一个树格式的数据是通过 _parent 标识当前节点的父结点的方式。然而前端这边是不可能需要这种格式渲染一个树的,于是每一个调用接口的地方都会写这么一套转换逻辑。当然前端可以抽离一个通用的函数进行统一转换,但是不同的平台仍要都要写一套转换逻辑。仅仅是多些几次也就罢了,但是通过 _parent 这种方式描述一个树是不准确的,万一某个节点的父结点不存集合中是应该直接舍弃还是当作根节点?_parent 存在循环引用怎么办?这种业务逻辑和错误本应该在后端做处理,然而现在则上浮到前端才被发现。

前后端分离的场景下,大家都知道要做到前后端职责的分离。前端的职责是通过调用后台提供的接口,构造用户界面。前端需要感知到数据库结构吗?并不需要,数据库是后端用于数据持久化的工具罢了,后端用什么方式做数据持久化跟我如何构造用户界面并无关系。反之,后台需要感知到用户界面是什么样子吗?同样不需要,后端只需要提供符合业务模型的接口罢了,如何构造用户界面是前端的事。

为啥又说知道这个没卵用,该撕逼还是撕逼呢?以上所说的都是理想情况,然而实际开发往往并非能够很好落实。我知道什么是"正确"的做法,如何去抽象,我可以用这一套约束我的代码,但是当我开始约束别人的时候往往会遇到问题。抽象和规范是有成本的,我来付这成本当然没人有意见,当要求别人付出别人难免会有意见,特别是项目工期紧张/跨工种/架构不合理/人员素质良莠不齐的情况下。很多答者所认为“前端能处理就放到前端处理”“前端做比较方便”,其实都是这种思路。而很多人提到的性能问题,做一些数据格式转换和数据校验说实话我并不觉得会对服务器产生多大的性能瓶颈,相比服务端渲染,这点性能消耗只能算小巫见大巫。当然这也不是针对后端同学,像很多答者没提到的问题比如浏览器对并行的请求数量有限制要求后端对提供的接口进行合并,其实也就是前端不愿付出 BFF 层的成本罢了。

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有