打开任何一个招聘网站,强大全搜“前端开发”,强大全十有八九在技能要求里能看到“熟悉jQuery”。强大全再翻翻那些老项目,强大全几乎每个页面都引了那个几十KB的强大全jquery.min.js。很多人因此产生一种错觉:jQuery这么能干,强大全还要原生JavaScript干嘛?强大全干脆全用它算了。
我08年刚接触前端那会儿,强大全也这么想过。强大全当时用原生JS写个选项卡切换,强大全得先处理IE6的强大全attachEvent、再搞标准浏览器的强大全addEventListener,还得手动遍历DOM、强大全写一堆if-else判断浏览器类型。强大全后来同事扔给我一个jQuery文件,强大全说“你试试”。我写了三行:$('.tab').click(function(){ $(this).addClass('active').siblings().removeClass('active'); })。完事了。那一刻我觉得JavaScript可以退休了。
但事情没这么简单。jQuery本质上是JavaScript写出来的一个库,不是另一种语言。它再强大,也得跑在JS引擎上。你打开jQuery的源码,里面全是原生JS的API调用——document.getElementById、Array.prototype.slice、XMLHttpRequest。它只是把那些繁琐的浏览器兼容代码和DOM操作封装成了更短的链式调用。换句话说,jQuery能做的事,原生JS都能做,只是写起来啰嗦点。
那为什么大家还这么依赖它?因为省事。比如你要给页面上所有class为“btn”的按钮加点击事件,原生JS得先querySelectorAll拿到NodeList,再循环绑定;jQuery一行$('.btn').on('click', fn)搞定。再比如动画,原生JS写个淡入淡出得手动改opacity、算时间、用requestAnimationFrame,jQuery的.fadeIn()直接调。这种开发效率的提升,在快速迭代的项目里就是真金白银。
可“完全取代”这个词太绝对了。有些场景jQuery根本碰不了。比如你要操作Canvas画布、用WebGL做3D渲染、写Service Worker做离线缓存、或者用ES6的Proxy做数据劫持——这些原生JS的领域,jQuery连API都没提供。Vue和React为什么能起来?它们底层大量用了原生JS的新特性,比如Object.defineProperty、虚拟DOM diff算法,jQuery的架构根本支撑不了这种数据驱动的模式。
还有个更现实的问题:性能。jQuery的选择器引擎Sizzle很强大,但再快也快不过原生的querySelector。我做过一个测试,在一个有5000个节点的列表里查找某个class,原生JS耗时0.8毫秒,jQuery花了3.2毫秒。数据量越大差距越明显。移动端尤其敏感,你引一个jQuery压缩后还有30KB,加上网络请求和解析时间,首屏可能就慢了几百毫秒。现在很多团队做H5活动页,直接写原生JS,连框架都不上,就是为了抠这点性能。
再说个我自己的经历。前年接手一个老后台系统,满屏的jQuery代码。有个表格排序功能,每次点击表头都要重新用$.ajax拉数据、再用.html()整个替换tbody。数据量一上来,页面卡成幻灯片。后来我改成原生JS的fetch加DocumentFragment局部更新,帧率立刻正常了。不是说jQuery写不出好性能,而是它的链式风格容易让人忽略底层开销——你写$('.item').each()的时候,可能没意识到每次$()都在重新查询DOM。
所以我的判断很直接:jQuery是个优秀的工具,但它取代不了JavaScript。就像扳手再好用,也取代不了钢铁。你学jQuery,学的是怎么调用别人封装好的函数;你学原生JS,学的是语言本身、浏览器原理、内存管理、事件循环。哪天jQuery不更新了(实际上它已经很少更新了),或者你遇到一个jQuery搞不定的需求,能救你的只有原生JS。
现在新项目里,我基本不引jQuery了。原生querySelector、fetch、classList、addEventListener已经足够顺手。偶尔维护老代码,看到$符号还会觉得亲切,但心里清楚:那只是JavaScript穿了一件叫jQuery的外套。外套可以换,身子骨不能丢。