前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >架构 | 到底该不该使用JavaScript框架

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

作者头像
疯狂的技术宅
发布2019-03-28 11:17:28
4370
发布2019-03-28 11:17:28
举报
文章被收录于专栏:京程一灯京程一灯

作者: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工作。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 京程一灯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一些事情可以自己来做
  • 所有人的一切问题
  • 即使我们使用框架
  • 当我们必须使用或不应该使用框架时
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档