何时不应使用 JavaScript 框架

关于框架在何处有意义以及在何处没有意义的实用提示。
508 位读者喜欢这篇文章。
A community raising a barn

Opensource.com

随着互联网的发展,Web 开发已经远远超出了其最初的预期能力——有好也有坏。为了消除粗糙的边缘,Web 开发人员发明了大量的框架,有小的,也有不小的。这对开发人员来说是好事,因为浏览器碎片化和标准问题比比皆是,特别是对于那些希望在 API 中使用新功能并为这些功能提供更统一语法的人来说。此外,在很大程度上,这些框架都是开源的,这对每个人都很好。

现在,看到那些粗糙的边缘已经被时间磨平,不再像以前那样尖锐,我们可能应该减少使用我们创建的一些框架。在其他方面,我们只需要考虑为给定任务使用框架的成本。

我们可以自己做的事情

考虑一下简单的 HTTP 请求,曾经对于在 Firefox 和 Internet Explorer 中都能工作的简单 GET 请求来说,这是一个很好的 50 行函数。例如,这是一个执行 POST 的简单函数;我们在 Phone Janitor 中将其用于生产环境超过一年,作为我们主要的 React 数据泵

function postMe(name, data, callback, onError) {
    var request = new XMLHttpRequest();
    request.onreadystatechange = function() {
        if (request.readyState != 4 || request.status != 200) { return; }
        var body = JSON.parse(request.responseText);
        if (body.error) {
            onError(body.error);
        }
        else {
            callback.(body);
        }
    };
    request.open("POST", '/api/' + name, true);
    request.setRequestHeader("Content-type", "application/json");
    request.send(JSON.stringify(data));
}

这段不使用框架的代码可以很容易地重写以与 Promise 一起工作,适应请求类型,或支持任何对您的应用程序至关重要的功能。它是否经过精心设计?也许不是。它是否健壮?对于我们当时的需求来说是这样的。重点不是它是什么或不是什么,而是我为什么要使用其他任何东西。

如果我不想编写自己的 HTTP 请求引擎,那么有很多选择。但是,它们都有成本。它们有多大?我如何将它们包含在我的代码中,以及它如何影响我的工作流程?它们还在执行哪些不必要的事情,从而浪费执行时间?如果我花了一个小时(这大约是我们花在代码和测试上的时间)来实现这个函数以满足我的所有需求,那么与集成一个库来做同样的事情相比,这会节省大量时间吗?我们每个人都会有不同的答案。

满足所有人的需求

我们消费的服务试图满足各种用例的多种需求。这实际上是问题的关键。统一社区的 API 是一件好事,因为有些事情很微妙,而且很难独自完成。jQuery 的发明是因为浏览器的工作方式截然不同,而 JavaScript API 没有太多内容。曾经有一段时间,每个 Web 开发人员都包含 jQuery,只是为了选择文档对象模型 (DOM) 元素进行简单的 innerHTML 操作,这会对页面加载时间产生明显的影响。考虑一下现在的用例

// Author's note, this is mostly for example, don't manipulate DOM unless you know what that means for your app

var el1 = document.getElementById(id_Name);
var el2 = document.getElementsByClass(class_Name); // returns array
var el3 = document.querySelector("div.user-panel.main input[name='login']");

// Want it in a jquery style function name?

var $ = document.querySelector; // Or get fancier if you wish
var el4 = $("div.user-panel.main input[name='login']");

在很多地方我们仍然包含 jQuery 来做这件事(例如,普通的 WordPress 主题)。不要只听我的一面之词;请随意查看它是否包含在内。现在,没有 jQuery 我们也能做很多事情。

即使我们使用框架

但这不仅仅是我们如何以及何时使用框架的问题;也关系到我们如何处理功能和附加组件。例如,考虑将 Google Visualization 集成到 Angular 框架中。在 MobilSense,我们严重依赖图表向管理团队报告——但我们也使用 Angular 1.5。那么,我们如何将更新功能集成到我们应用程序的图表中呢?

我们的选择是使用 angular-google-chart 或开发我们自己的解决方案。虽然 angular-google-chart 是一个出色的库——我在其他地方使用过它,并且我感谢作者免费支持他的项目——但我们决定自己做,原因现在很明显。以下是它们的比较

Angular-Google-Charts 我们自己的
20 个 src 文件 1 个 src 文件
平均每个文件约 40 行代码 81 行代码,包括注释(可悲的是注释不多)
npm 包包含所有 angular 不是一个包,不依赖于任何东西,它只是另一个指令

我们自己的解决方案不能处理库处理的所有情况。我们不需要这些情况,如果我们需要,我们可能会很容易地添加它们,并以一种可移植到我们的工作流程和其他框架的方式添加它们。这是我们需要根据我们自己的特定需求来决定的权衡类型。任何一种选择都没有什么可耻的。

我们何时应该以及不应该使用框架

我强烈主张了解编写给定工具的目的。如果我们的目标是快速拼凑一个临时存在的东西,那么对其进行良好的工程设计可能并不重要。如果我们追求长久性,我认为我们需要更认真地权衡使用框架工具。框架很难摆脱,特别是如果我们添加进一步将我们束缚在框架中的库时。

如果编写您自己的解决方案只需要一两天,我倾向于这样做。如果需要一周或更长时间,那么考虑因素可能会改变。

编写您自己的解决方案的另一个好理由是,如果将自己与一个可能不会在您的项目生命周期内存在的框架耦合起来会付出高昂的代价。但是,如果这是一件非常复杂的事情,例如集成 PDF 支持,您可能不想考虑自己编写,因为那样会陷入疯狂。

与任何类型的软件工程一样,将您的工作视为建筑。如果您正在建造狗窝,那么您做的任何事情都可能没问题。如果您正在建造摩天大楼,您需要做更多的规划。我们如何划分它们之间的界限?框架的作用与您正在建造的建筑的材料和风格的作用相同。它是否适合环境,我们以后需要时可以获得替换材料吗?虽然您的决定是您自己的,但我希望这些信息和示例能帮助您做出指导。

Tod Hansmann 将在 2017 年 7 月 12 日至 15 日在盐湖城举行的 OpenWest 大会上发表题为 JavaScript:何时不应使用框架 的演讲。

User profile image.
Tod Hansmann 是一位技术专家,碰巧经常担任程序员,并指导新人,他关注当今技术爱好者经常忽略的旧方法。白天是软件架构师,一直都是问题解决者。在他看来,开源是所有这些活动的最佳工具包。

3 条评论

太棒了!这篇文章反映了对象编程提供完全可重用代码的未实现承诺。我不是想挑刺,但这个梦想从未真正实现——原因正如本文所讨论的。

如果我要补充什么,那就是安全地使用框架确实需要拥有它,并投入所有必要的成本。显然,我们使用它们是为了节省编码工作,但我们也必须考虑错误假设的隐藏成本。

一个关于深思熟虑的设计的令人信服的论点。我在一个组织工作,该组织经常使用框架来编写应用程序,以完成一些微不足道的事情。我们有很多这样的应用程序,它们对很少更改且没有做太多有趣事情的流程使用了 ORM。首先是对使用另一个 ORM 进行的全面检查(公司不想支付持续的许可费用)。然后是那些没有进行全面检查的应用程序的语言不兼容性。近两年来,我们的开发人员除了生命周期(读作:无聊的维护)工作之外什么也没做,以稳定多年前选择的框架。

当然。对于小提琴,您不需要库。

问题是大多数时候您需要这些库提供的许多功能。您的请求示例 - 您很可能需要 SSL,或超时限制,或知道获得响应所花费的时间。这些不是晦涩难懂的罕见选项。大多数应用程序都有它们。

更重要的是,对于除最简单的任务之外的所有任务,您自己的实现通常都很幼稚。一个人无法与一个社区相比。

我担心这些类型的帖子可能会鼓励初级开发人员相信他们可以通过阅读一些关于 HTTP 的知识来编写请求 npm 包。这就是您最终得到包含 2000 行文件的噩梦项目的原因。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.