【问题标题】:Is it advisable to perform additional logic on data in the front-end?是否建议在前端对数据执行额外的逻辑?
【发布时间】:2018-06-29 16:48:04
【问题描述】:

当接收到要在前端显示的数据时,建议在前端对该数据执行额外的逻辑 - 例如检查列是否包含特定值,然后隐藏列,还是应该在后端完成,它应该只返回一个布尔值?

我担心的是,当数据增长时,它会极大地影响应用在浏览器中的性能。如果是,在与不同意/不想找时间做的人讨论时应该使用什么论据?

我正在使用 Angular ngFor 来显示数据,但显然我需要在构建 DOM 之前执行该逻辑。

【问题讨论】:

    标签: angular loops architecture


    【解决方案1】:

    是的,建议这样做。但需要考虑的情况很少:

    场景 1:有约百万客户,每个客户持有约 1000 行数据。 在这种情况下,我们最好在客户端进行大部分过滤,从而减少服务器的负载并且它可以服务更多的请求。

    场景 2:任意数量的客户,每个客户拥有约 10000 或约 10 万行数据。在这种情况下,我们必须进行服务器端分页,因为我们不应该传输整个数据。在客户端应用的每个过滤器都可能触发服务器调用以获取数据。

    一般而言,客户端过滤不应影响应用性能,因为现在笔记本电脑/PC/框架可以轻松处理负载。但是,我们不应该考虑发送大约百万行的数据并尝试在客户端执行操作。它会影响客户端和服务器的性能。

    【讨论】:

    • 感谢您的回答
    【解决方案2】:

    对此有几种不同的方法。我始终建议的第一件事是将您的后端视为某种公共 API,它对您的前端视图一无所知。对于很多用例,这种答案已经解决了。如果您的 API 构建正确(并且不会执行奇怪/混合/不一致的返回),则返回“所有内容”通常没问题。

    您需要记住的第二件事是您正在谈论的数据量。好吧,如果它是一个包含 20 个属性的对象的 1000 个数组条目的数据集,请不要担心 - Angular(和 JS)非常快,您甚至不会注意到具有 10 个条目或 1.000 或 10.000 的数组之间的区别(请求大小可能是一个因素。但是对于常规的文本返回,我们仍然只讨论 kB 并且以今天的互联网速度这不是问题)。

    接下来重要的是在 JS 和 DOM 中处理大型数组/对象之间存在差异。有一个常规的 ngFor 并一次显示 10.000 个条目肯定会减慢/滞后您的浏览器。但是对于这种情况,您可以使用某种虚拟重复,仅呈现 10-50 个条目(当前在 DOM 中可见),并且当您滚动时,它们只是被重用而不是创建新条目。

    最后一点是尝试编写性能检查。您说过要根据结果隐藏/显示列。好吧,如果它只需要评估一次,请尝试将其放入变量/“一次性绑定”中,而不是在每个摘要循环中检查相同的条件。如果检查由于非常复杂而需要很长时间,请尝试对可能更改值的事件做出反应,而不是检查每个摘要周期。

    那么从这篇简短的文章中可以得到什么:

    • 检查您的样本量并确定是否值得付出努力(这有助于对业务逻辑进行一些基准测试,例如迭代/解析数据)
    • 尽可能多地使用 JS 本身。它比稍后在 DOM 中执行的速度更快。如果模板“愚蠢”并且只显示数据而不是包含业务逻辑,它还有助于保持代码的清洁/可读性
    • 如果您的数据太大而无法在浏览器中处理,请考虑如何改进您的 API,例如引入分页
    • 最后但同样重要的是,进行基准测试和性能检查。在很多情况下,您只需要提高性能并编写更好/更快的代码,而不是更改整个数据结构

    【讨论】:

    • 绝妙的答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    相关资源
    最近更新 更多