利用现有JavaScript框架还是自主开发?
最近,在知名问答网站 知乎上,国内社区的开发人员们讨论了如何在利用现有JavaScript框架还是自己开发工具库中做出正确的选择。
起初,有开发人员在知乎上提出了一个 问题——在掌握了JavaScript基础知识和了解了类似jQuery等框架之后,JavaScript 开发人员在哪些情况下,应该选择开发自己的框架(库),而不去使用现有的工具?
随后,社区的开发者分别给出了自己的看法和观点。
李国新引用了常用的说法“不要重复发明轮子”,并指出其背后的含义:
在已经有某种轮子满足你需求的情况下,你不需要再写一个。所以,使不使用某框架(库),在于它是不是满足了你所有的需求。满足了,它就成为了你的轮子,否则,不管它多强大,都不足以成为你的目标轮子。
他以自己在实际开发中遇到的例子现身说法:
我们的产品需要一个手机登陆页,这个页面会有一些交互逻辑,如表单验证,还有一些简单的动画......在非手机产品中,我们大量使用了jQuery,但是在这个小任务中,我不能用jQuery,只能自己再写个简单的小工具库,自行实现如getElementsByClassName、tween动画等功能。为什么呢?我想大家都考虑到流量问题。在这个场景中,jQuery库的体积已经远远超过了要求。所以,不管它的其他功能有多好用,都满足不了对文件体积的要求,那么它在此时就不是目标轮子,你只能自行实现(或者寻找其他更理想的轮子)。
新颖的JavaScript框架(工具库)总是层出不穷的,从最早的DOM兼容性工具函数,到早几年的Prototype、YUI、jQuery等,到现风头正劲的CommonJS(我指的是实现了CommonJS规范相关的框架)等,从来就没有停歇过。如果哪门语言再也没有新东西出来,那应该是它已经被开发者抛弃了。所以JavaScript框架(库)仍然会不断的冒出来。
写不写重复的轮子?我的答案是,如果是为了提高技能,非常建议你去写。写重复的轮子是提高技能的不二法门。如果不想动手,那去了解已存在的轮子是如何实现的也会受益匪浅。
陈计节指出了自建框架时需要考虑的一些问题:
对于框架的选用,合适就是好用的。DOM和基础Ajax方面,jQuery、YUI和Moon Tools都不失为很好的选择。但是我们遇到的问题总是错综复杂形式多样的,一个项目往往不能凭借单独的某个框架或者类库去解决。
为何选用已有框架?因为其在对应领域形成了独特而高效的生产力,收到广泛的肯定与认可,使用它们可以大大地缩短开发周期,有许多人在共同研究和使用,有完善的社区支持体系。
何时使用自己的框架,或者说为何要自行构建框架或者类库?当不满足使用已有类库的条件,或者有新的问题出现,已有的框架或者第三方类库无法满足需求时考虑拓展、改进其设计或者自建新的体系。自建时要面对一些基本问题:要解决哪些还未解决的问题?为什么现有类库不能满足需求?能否真正的提高生产力?能否很好地解决浏览器兼容性问题?如何在有限的成本范围内保证代码的优质性?能否提供升级与维护?
对于正处于学习阶段的开发者来说,尝试学习类库的组织方式、编写思路并试图编写自己的类库与框架能够快速而有效的训练开发者对设计模式的理解,显著提高综合编码能力,更全面的认识所面对的问题,更容易促使新的思路出现。
米粽认为jQuery和原生代码有不同的应用场景:
我原先也很喜欢用jQuery,随着自身JavaScript水平的提高,在jQuery和原生JavaScript代码之间我越来越偏向后者,可以按自己的习惯更灵活的编码,不必受jQuery代码风格的限制。另一方面,我的工作逐渐向移动设备转移,在只考虑Webkit系的情况下,选择器、兼容性等都不再是问题,jQuery提供的便利已不明显,性能上又没有针对移动设备的优化,自然不在候选。但事情不是绝对的,去年我和一个JavaScript能力欠佳的同事合作,为了保证开发顺利进行,也使用了jQuery(这个同事现在已经基本可以丢掉jQuery了......)。
其实不管是JavaScript/jQuery,所有开发工具的选择上,我觉得至少可以参考两个因素:能满足开发质量的要求,团队成员学习的成本不影响开发进度。
天祁指出性能问题可能是现有框架的通病:
......之前也写过,后来发现更多是在锻炼自己的代码组织能力和技术能力。当然,有些高手写出来的框架还是很给力的。写个框架给别人用是一件很不容易的事,少有人做得好。
最近准备开发一个Web App,嵌在PhoneGap里面,性能问题很头疼,试了几个框架,反应都很慢,满足不了需求。所以就想自己写,不一定是一个通用框架,至少要满足性能和维护问题。框架为了实现通用和扩展性,通常对性能都做了一些牺牲。
程劭非则针对jQuery的缺陷提出了自己的看法:
确信你不符合以下三点的话,用jQuery不会被鄙视:
- 用jQuery的人不是因为喜欢jQuery,而是因为自己根本写不出那样的东西。
- 从来没有用过jQuery之外的框架,说jQuery好是因为自己只懂jQuery。
- 为了jQuery插件而用jQuery,觉得插件省了不少事。
再谈谈我自己为什么不用jQuery:
- 我不认同jQuery的设计理念:Write less, Do more。我认为一个框架应该解决的问题有:封装性、复用性、可维护性,少写代码不在此列。
- jQuery插件定制性非常差,基本很难定制到符合设计。
- jQuery的大部分插件做了错误的抽象,把对象变成了函数。
- jQuery的$不是一个好命名,名称没有体现函数功能,而且把选择器、对象包装、Domload事件几个完全不相干的功能变成了一个函数,这是对函数重载的滥用。
感兴趣的读者可以在知乎的 问题中查看更加详细的讨论内容,也欢迎开发人员在此发表自己的看法。
崔康 热情的技术探索者,资深软件工程师,InfoQ编辑,从事企业级Web应用的相关工作,关注性能优化、Web技术、浏览器等领域。