原文:http://lea.verou.me/2015/04/jquery-considered-harmful/**
(第一次翻译,望大家多批评指正)

jQuery是有害的

  嗨,我总想写一个“X”是有害的帖子。

在开始写前,我想说jquery 很大程度上促进了前端的发展。它让开发人员实现了以前不敢想象的事情,并促使浏览器开发商做他们本来就该做的事。(没有jquery我们估计现在还不可能用到document.querySelectorAll)对于那些不支持现有新技术的IE8及其以下浏览器jQuery依然很有必要。

  但无论怎么说那些低端浏览器毕竟是少数,很多开发人员不需要支持只占很小份额的老版本浏览器。别忘了还有那些非专业开发人员:学生和研究人员,他们不仅不需要支持低版本浏览器,而且只需一个浏览器支持就够了。如您所愿,在学术界人人都津津乐道于使用网络开放平台的新技术,对吧?然而我却从未见过jQuery在业界这么突出。为什么?因为众所周知,他们没有时间或兴趣追随网络开放平台的最新动态。他们不知道他们需要什么样的jquery,导致他们只是单纯的使用jquery。然而这并不是我抛弃jquery的唯一理由。

是的,你可能真的不需要它

  我当然不是第一个指出jQuery的依赖程度影响你原生js的能力,因此我不想浪费时间重复别人之前所写,你只需访问以下链接:

  你可能不需要jquery

  你不需要jquery!

  你真的需要jquery吗?

  脱离jquery编写javascript的10个技巧

...还有很多,你只需谷歌一下“you don’t need jQuery”你将发现更多。我也不再花时间赘述jQuery文件大小以及原生js方法有多高效,这些我之前都讲过。今天,我想说一个不常被提及的要点。

但那并不是放弃它的最大原因

  为了避免扩展本地元素的原型,jquery使用它自己的包装对象,扩展本地对象在过去是一个庞大的 不,不。不仅因为潜在冲突,还有低版本IE浏览器内存泄漏。因此当你运行$(“div”)时返回的并不是一个元素引用或一个节点集合而是一个jQuery对象。这意味着对于,jquery对象的实现方式完全不同于一个DOM元素的引用、一个数组或其他类型的节点列表。然而,对于这些本地对象,就像jquery试图提取出他们一样,你总要不得不处理他们,哪怕他们包装在$()中。例如:当回掉函数通过jQuery的bind()方法调用时上下文就是一个对HTML元素的引用而不是jquery的一组对象。更别提你的代码还是多源的,有些想当然是jQuery代码,有些则不是,最终代码总会混淆着jQuery对象、本地对象、节点列表,而这正是地狱的开始。

  如果开发人员遵循一个命名规则:用变量包裹jQuery对象(我认为在变量名头部添加一个$是常见的一种)和本地元素,这将不再是个问题(但人们总是记不住规则,这里就先假定一个理想世界)然而,现实中并没有那么多规则被遵守,结果就是对于不熟悉代码的人来说代码变得极其难懂。现在每一次编写代码都需要很多尝试和错误(“哦!这不是一个jQuery对象,我要用$()来包裹它”或者“哦!这不是一个元素,我要用[0]来获取其中的元素”) 为了避免混淆,开发人员编码时常防御性的用$()包裹所有东西,因此总览代码,相同的变量经过$()的多重包裹,同样的原因,这会变得很难重构其他jQuery代码,你完全被困住了。

  即使遵循了命名规则,也不能只用在jQuery对象上,你经常需要用到本地DOM方法或调用不属于jQuery而来自其于他脚本中的函数。很快,多次折腾jQuery对象弄得到处都是,把你的代码搞的很乱。

  除此之外,当你往代码库中添加代码的时候,你往往会用$()来包裹每个元素或节点列表。因为你不知道你得到了什么样的输入。所以被困住的不仅仅是你自己,你以后为同一个代码库所写的代码也被困住了。

  获得任何带有jQuery依赖性的随机脚本,你没有自己写并试图重构它,这样它就不需要jQuery。我敢说,你会发现你的主要问题将不会是如何转换功能使用本地APIs, 而是理解这到底是怎么一回事。

一个通往原生JS的可靠途径

  当然,现在许多函数库需要jQuery,就像最近我在推特上所说的那样,如果你回避jQuery那么感觉你像是个数码素食者。当然,这并不意味着你必须要使用它。当好的非jQuery代替品可用的时候,函数库也将会被取代。

  同样的,大多数函数库的写法不需要用$作为jQuery的别名。用jQuery.noConflict()方法可更改默认的$并且你也可改成其他你看着顺眼的符号,例如,受命令行API的启发,我经常定义这些帮助函数:

//返回匹配到expr的第一个元素
//查询范围限制在container的后代中
function $(expr, container) {
return typeof expr === "string"? (container || document).querySelector(expr) : expr || null;
} //以数组的形式返回所有匹配到的expr
//查询范围限制在container的后代中
function $$(expr, container) {
return [].slice.call((container || document).querySelectorAll(expr));
}

  此外,我认为在你每次敲出jQuery来代替$时你会考虑如果真的不需要,是否还要这么过度的使用它,或许我猜错了 。

同时,如果你喜欢jquery API 但又不喜欢他的臃肿,那么你可以考虑使用Zepto

很明显,我们的标题显而易见带有开玩笑的意味,但是,这是互联网,没有什么是显而易见的。所以在这里我很清楚Eric的经典文章会很反对这种标题。

【翻译】jQuery是有害的的更多相关文章

  1. Signs of a poorly written jQuery plugin 翻译 (Jquery插件开发注意事项,Jquey官方推荐)

    原文链接:http://remysharp.com/2010/06/03/signs-of-a-poorly-written-jquery-plugin/ 原文作者:remy sharp So far ...

  2. [翻译]jQuery十周年-John Resig

    10th Anniversary of jQuery Today marks the 10th anniversary of the release of jQuery...[原文] 今天是jQuer ...

  3. jquery/vue/react前端多语言国际化翻译方案指南

    ❝ 本文章共3470字,预计阅读时间5-10分钟. ❞ 国际化-前言 每个开发者能希望编写的程序可以让全世界的用户使用,它要求从产品中抽离所有地域语言,国家/地区和文化相关的元素.换种说法,「应用程序 ...

  4. 从零开始学习jQuery (五) 事件与事件对象

    本系列文章导航 从零开始学习jQuery (五) 事件与事件对象 一.摘要 事件是脚本编程的灵魂. 所以本章内容也是jQuery学习的重点. 本文将对jQuery中的事件处理以及事件对象进行详细的讲解 ...

  5. Golang 网络爬虫框架gocolly/colly 二 jQuery selector

    Golang 网络爬虫框架gocolly/colly 二 jQuery selector colly框架依赖goquery库,goquery将jQuery的语法和特性引入到了go语言中.如果要灵活自如 ...

  6. 基于jQuery.i18n.properties实现前端网站语言多版本

    我是参考播客做了个demo:http://blog.csdn.net/aixiaoyang168/article/details/49336709 jQuery.i18n.properties采用.p ...

  7. [javascript] jQuery系列之目录汇总

    最近一个月写了些关于jQuery的文章,谢谢大家的支持.文章仅我个人观点,也许有不对的地方,请指出.这个系列还在更新中 一:jQuery基础系列: jQuery温习篇---强大的JQuery选择器 j ...

  8. jqu

    1 /*2 * 说明:3 * 本源代码的中文注释乃Auscarlin呕心沥血所作.旨在促进jQuery的传播以及向广大jQuery爱好者提供一个进阶4 *的途径,以让各位更加深入地了解jQuery,学 ...

  9. (翻译)编写属于你的jQuery插件

    Writing Your Own jQuery Plugins 原文地址:http://blog.teamtreehouse.com/writing-your-own-jquery-plugins j ...

随机推荐

  1. $watch $apply and $evalAsync vs $timeout

    $watch $scope对象上的$watch方法会给Angular事件循环内的每个$digest调用装配一个脏值检查. 如果在表达式上检测到变化, Angular总是会返回$digest循环. $w ...

  2. SQL Server DDL触发器运用

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 基础知识(Rudimentary Knowledge) DDL运用场景(DDL Scene) ...

  3. OpenCASCADE View Manipulator

    OpenCASCADE View Manipulator eryar@163.com Abstract. When you finish modeling objects in the scene, ...

  4. Util应用程序框架公共操作类(八):Lambda表达式公共操作类(二)

    前面介绍了查询的基础扩展,下面准备给大家介绍一些有用的查询封装手法,比如对日期范围查询,数值范围查询的封装等,为了支持这些功能,需要增强公共操作类. Lambda表达式公共操作类,我在前面已经简单介绍 ...

  5. 1、NoSQL概述

    最近抽时间把Redis学了一下,所以就在网上找了一些资料.然后找到尚硅谷-周阳老师的视频教程,觉得里面的讲的挺好.所以就把他视频当中的资料教程整理出来. 单机MySQL的美好时代 在90年代,一个网站 ...

  6. 窥探Swift编程之错误处理与异常抛出

    在Swift 2.0版本中,Swift语言对其错误处理进行了新的设计,当然了,重新设计后的结果使得该错误处理系统用起来更爽.今天博客的主题就是系统的搞一下Swift中的错误处理,以及看一下Swift中 ...

  7. php广告图片循环播放 幻灯片效果

    <!DOCTYPE> <html> <head> <meta http-equiv="content-type" content=&quo ...

  8. 设置SharePoint Server 2013 的匿名访问

    默认情况下,SharePoint Server 2013 是关闭匿名访问的,但是某些环境下我们又需要将这个匿名访问对全员开放,怎么操作更加安全与便捷,对于一个崭新的环境我们可以这样操作. 首先在当前需 ...

  9. 去百度API的百度地图准确叠加和坐标转换的解决方案研究

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 目前项目上如果要使用百度地图,得加载百度的开发包,然后通过百 ...

  10. 如何用easyui+JAVA 实现动态拼凑datagrid表格

    先给大家看一看效果,最近一段时间都在研究这个东西. 如果我把日期间隔选宽呢?比如5月日到5月5日?下面给大家看看效果,不用担心哦 看到了吧,哈哈,这个日期都是动态生成的,下面就来跟大家分享一下这个的实 ...