架构 | 到底该不该使用JavaScript框架

2019-03-28 11:17:28 浏览数 (1)

作者:Tod Hansmann 翻译:疯狂的技术宅 原标题:When not to use a JavaScript framework 来源:https://opensource.com/article/17/6/javascript-frameworks 分类:翻译,架构 难度:★★☆

Image by : opensource.com

随着互联网的发展,网络发展已经远远超出了预期——不管是好的还是坏的方面。为了打磨粗糙的细节,web开发人员发明了大量的框架,既有小巧又的也有不那么小巧的。这对开发人员来说是一件好事,因为浏览器的碎片化和标准问题比比皆是,特别是对于那些想要新的API功能和更多统一语法的用户而言。此外大多数框架都是开源的,这对每个人都是有好处的。

现在可以看到这些粗糙的细节已经随着时间被逐渐打磨掉掉,不再像以前那么尖锐了,所以我们应该适当的减少一些框架的使用。在其他方面,我们只需要考虑针对特定任务时所使用框架的成本。

一些事情可以自己来做

考虑一下简单的HTTP请求,曾经是一段50行的函数,就可以在 Firefox 和 Internet Explorer 中完成简单的GET搞作。举个例子,这里有一个简单的函数可以完成POST操作;我们曾经在网站 Phone Janitor(网址:https://phonejanitor.com/ )的生产环境下使用它超过一年,并把它作为React的主用数据泵:

代码语言:javascript复制
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请求引擎,也会有很多选择。不过它们都是有代价的。它们有多大?我该怎样在自己的代码中包含它们,以及它是如何影响我的工作流程的?他们还做了哪些不必要的事情消耗了时间?如果我花了一个小时(这是我们花在代码和测试上的时间)来实现这个功能以满足我所有的需求,那么与集成一个库来来实现同样的功能相比,会节省很多时间吗?对此我们每个人都会有不同的答案。

所有人的一切问题

我们使用服务(services)来满足各种不同的需求。这才是问题的症结所在。为了社区利益而统一API是一件好事,因为有些事情很微妙,很难单独完成。jQuery之所以被编写出来,是因为浏览器的差异性非常大,而 JavaScript API 对此能做的事情太少了。有一段时间,几乎每个Web开发人员都在使用 jQuery ,这样他们可以使用文档对象模型(DOM)来处理简单的innerHTML元素,但是这对页面加载时间产生了明显的影响。现在思考一下下面的案例:

代码语言:javascript复制
// 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主题)。不要随意相信我说的话,你可以自己去看看到底是不是这样。如果没有它们,我们几乎什么也做不了。

即使我们使用框架

这不仅仅是我们如何以及何时使用框架的问题;它还涉及到我们如何处理特性和附加组件。例如,例如,将 Google Visualization 集成到 Angular 框架中。在 MobilSense ,我们严重依赖图表向管理团队提供报告——但我们也使用Angular 1.5。那么怎样做才能把新功能集成到我们的应用程序的图表中呢?

我们可以选择 angular-google-chart 或开发自己的解决方案库。虽然 angular-google-chart是一个很棒的库,我在其他地方也使用过它,同时很感激作者贡献他的免费项目——但是由于一些显而易见的原因,我们自己实现了相关的功能库——以下是他们的特征对比:

Angular-Google-Charts

我们自己的库

20个源码文件

1个源码文件

平均每个文件约40行代码

包括注释在内的81行代码(遗憾的是,没有太多的注释)

被npm集成到angular中

不是一个包,不依赖任何东西,它只是另一个指令

我们自己的解决方案并不处理所有情况,也并不需要处理这些情况,如果一旦需要,我们可以很容易地扩充它们,并且以某种方式移植到我们的工作流和其他框架中。这是我们每个人都需要根据自己的具体需求做出的权衡。这两种选择都不丢人。

当我们必须使用或不应该使用框架时

我强烈主张要了解编写某个工具的目的。如果我们的目标是一种暂时的、需要快速拼凑的东西,那么可能并不需要将其工程化。但是如果是需要被长久使用的东西,我认为使用框架工具是更合适的。一个框架一经使用便很难摆脱,特别是假如我们添加了一些库,这将进一步把我们和这个框架绑定在一起。

如果只有要一两天的时间来编写自己的解决方案,我就会倾向于这样做。如果有一周或更长的时间,我也许会改变自己的主意。

另外一个自己编写的库的理由是,使自己的项目依赖一个可能不适合你的项目生命周期的框架,代价是很昂贵的。但是,如果你要做的是一件非常复杂的事情,比如集成PDF支持,那么您可能完全不愿意考虑自己编写,因为这会把你逼疯。

与任何类型的软件工程一样,把您的工作看作是在修建一栋建筑。假如你是在造一个狗窝,实际上无论怎样都可能很好。但是如果你正在修建摩天大楼,那么就必须做更多的规划。我们应该在哪里画一条线?框架的作用与你正在使用建筑材料和建筑风格的作用是一样的。它是否适合环境,以后可以在需要时替换材料吗?虽然怎样做出决定是你自己的事情,但是我希望这些信息和例子能够帮到你。


关于作者:

Tod Hansmann - 托德·汉斯曼(Tod Hansmann)是一名技术专家,他是一名程序员,并指导新人,关注着常常被当今技术爱好者忽视的旧的开发方式。同时也是一名软件架构师,整天都在解决问题。在他看来,开源是解决问题的最佳工具。他目前在Phonejanitor.com工作。

0 人点赞