已經(jīng)過(guò)時(shí)了。
略做點(diǎn)補(bǔ)充:
Zepto也是過(guò)時(shí)貨了。還有Underscore/Lodash等,也是過(guò)時(shí)了。
但是過(guò)時(shí)不代表你就一定不可以再用,或者要從現(xiàn)有項(xiàng)目中清除拋棄掉。項(xiàng)目維護(hù)和管理本身是另一回事情,并不是完全由技術(shù)因素決定的。
下面稍微講下為什么已經(jīng)過(guò)時(shí)。說(shuō)這個(gè)你得知道jQuery提供的核心價(jià)值是什么。
我總結(jié)有幾點(diǎn):
1. 發(fā)揚(yáng)光大了$和CSS選擇器的天才idea(盡管都不是發(fā)明者)
2. 處理瀏覽器的兼容性問(wèn)題和各種bug
3. 鏈?zhǔn)秸{(diào)用為核心的DSL(此為jQuery獨(dú)創(chuàng))
4. 基于jQuery的生態(tài)(大量插件,各種工具如IDE也對(duì)其有良好支持)
看一下前兩點(diǎn),
1. 新的DOM標(biāo)準(zhǔn)(借鑒jQuery)加入了許多新的方法,覆蓋了絕大部分use cases;
2. 目前主流瀏覽器的兼容性已經(jīng)大幅提高,且因?yàn)槎际荅vergreen browsers了,所以以后也不太會(huì)出現(xiàn)嚴(yán)重的兼容性問(wèn)題了;此外新標(biāo)準(zhǔn)比以往要更詳盡清晰,出現(xiàn)不一致和bug的機(jī)率也小了;
實(shí)際上這前兩點(diǎn)也不是一蹴而就的,而是一直在改進(jìn)。比如原生querySelector API普及之后,才出現(xiàn)了Zepto。只不過(guò)這兩年發(fā)展加速,以至于Zepto還沒(méi)取代jQuery,就要一起過(guò)時(shí)了。
當(dāng)然,現(xiàn)在仍然有兼容性問(wèn)題,比如老瀏覽器不支持那些新的DOM方法,還有bug問(wèn)題始終會(huì)有的。怎么辦?我四年前寫的《關(guān)于國(guó)內(nèi)前端和JS技術(shù)發(fā)展的亂想》就給出了答案:
另外一個(gè)我認(rèn)為非常廣闊的領(lǐng)域是dom。是的,始終是。
盡管我之前說(shuō)過(guò)了,大框架沒(méi)有機(jī)會(huì)。但是注意到一點(diǎn),jQuery等仍然是建立在前ES5前HTML5時(shí)代的。因此那些庫(kù)其實(shí)都干了大量重復(fù)的事情。真正有益的是把這些事情做一次,做好它,怎么做好?不是發(fā)明各種自己的api,而是大家努力按照html5的規(guī)范,去盡量實(shí)現(xiàn)一套一致的符合html5語(yǔ)義的底層dom api。
……
以html5規(guī)范和語(yǔ)義為準(zhǔn)。時(shí)刻記得避免夾帶私貨。此庫(kù)的最高境界是只作為給瀏覽器打patch用,也就是一個(gè)patch框架加patch實(shí)現(xiàn)。
2011年時(shí)polyfill這個(gè)詞還沒(méi)怎么流行,但是你們可以看到我講的就是polyfill。不同的是,當(dāng)時(shí)可能還比較前衛(wèi)的理念,4年后的今天,幾乎所有新API都有polyfill/shim實(shí)現(xiàn),所以不再僅僅是理念,而已經(jīng)有大量非常成熟的實(shí)踐了。
但直到去年,我一直沒(méi)說(shuō)可以拋棄jQuery,那就是因?yàn)榈谌c(diǎn)(基于鏈?zhǔn)秸{(diào)用的DSL)。即使新的query接口已經(jīng)直接返回Element數(shù)組,因此可鏈?zhǔn)秸{(diào)用forEach/map之類的方法,但總體上,標(biāo)準(zhǔn)DOM API體系仍然無(wú)法像jQuery一樣提供一致且(插件)可擴(kuò)展的鏈?zhǔn)秸{(diào)用DSL。