成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

GitHub:我們?yōu)槭裁磿?huì)棄用jQuery?

開(kāi)發(fā) 前端
這篇文章將介紹過(guò)去我們是如何依賴上 jQuery 的,隨著時(shí)間地推移,我們意識(shí)到不再需要它,但到最后我們并沒(méi)有使用另一個(gè)庫(kù)或框架取代它,而是使用標(biāo)準(zhǔn)的瀏覽器 API 實(shí)現(xiàn)了我們所需要的一切。

[[243149]]

最近,我們將 jQuery 完全從 GitHub.com 的前端代碼中移除了,這標(biāo)志著我們數(shù)年來(lái)逐步移除 jQuery 這個(gè)漸進(jìn)式的過(guò)程終于結(jié)束了,這對(duì)我們來(lái)說(shuō)是一件里程碑式的事件。這篇文章將介紹過(guò)去我們是如何依賴上 jQuery 的,隨著時(shí)間地推移,我們意識(shí)到不再需要它,但到***我們并沒(méi)有使用另一個(gè)庫(kù)或框架取代它,而是使用標(biāo)準(zhǔn)的瀏覽器 API 實(shí)現(xiàn)了我們所需要的一切。

早期,jQuery 對(duì)我們意義重大

GitHub.com 在 2007 年底開(kāi)始使用 jQuery 1.2.1,那是谷歌發(fā)布 Chrome 瀏覽器的前一年。當(dāng)時(shí)還沒(méi)有通過(guò) CSS 選擇器來(lái)查詢 DOM 元素的標(biāo)準(zhǔn)方法,也沒(méi)有動(dòng)態(tài)渲染元素的樣式的標(biāo)準(zhǔn)方法,而 Internet Explorer 的 XMLHttpRequest 接口與其他很多 API 一樣,在瀏覽器之間存在不一致性問(wèn)題。

jQuery 讓 DOM 操作、創(chuàng)建動(dòng)畫(huà)和“AJAX”請(qǐng)求變得相當(dāng)簡(jiǎn)單,基本上,它讓 Web 開(kāi)發(fā)人員能夠創(chuàng)建更加現(xiàn)代化的動(dòng)態(tài) Web 體驗(yàn)。最重要的是,使用 jQuery 為一個(gè)瀏覽器開(kāi)發(fā)的代碼也適用于其他瀏覽器。在 GitHub 的早期階段,jQuery 讓小型的開(kāi)發(fā)團(tuán)隊(duì)能夠快速進(jìn)行原型設(shè)計(jì)并開(kāi)發(fā)出新功能,而無(wú)需專門(mén)針對(duì)每個(gè) Web 瀏覽器調(diào)整代碼。

基于 jQuery 簡(jiǎn)單的接口所構(gòu)建的擴(kuò)展庫(kù)也成為 GitHub.com 前端的基礎(chǔ)構(gòu)建塊:pjaxfacebox

我們將永遠(yuǎn)不會(huì)忘記 John Resig 和 jQuery 貢獻(xiàn)者創(chuàng)建和維護(hù)的這樣一個(gè)有用的基本庫(kù)。

后來(lái)的 Web 標(biāo)準(zhǔn)

多年來(lái),GitHub 成長(zhǎng)為一家擁有數(shù)百名工程師的公司,并逐漸成立了一個(gè)專門(mén)的團(tuán)隊(duì),負(fù)責(zé) JavaScript 代碼的規(guī)模和質(zhì)量。我們一直在排除技術(shù)債務(wù),有時(shí)技術(shù)債務(wù)會(huì)隨著依賴項(xiàng)的增多而增長(zhǎng),這些依賴項(xiàng)在一開(kāi)始會(huì)為我們帶來(lái)一定的價(jià)值,但這些價(jià)值也隨著時(shí)間的推移而下降。

我們可以將 jQuery 與現(xiàn)代瀏覽器支持的 Web 標(biāo)準(zhǔn)的快速演化進(jìn)行比較:

  •  $(selector) 模式可以使用 querySelectorAll() 來(lái)替換;
  •  現(xiàn)在可以使用 Element.classList 來(lái)實(shí)現(xiàn) CSS 類(lèi)名切換;
  •  CSS 現(xiàn)在支持在樣式表中而不是在 JavaScript 中定義可視動(dòng)畫(huà);
  •  現(xiàn)在可以使用 Fetch Standard 執(zhí)行 $.ajax 請(qǐng)求;
  •  addEventListener() 接口已經(jīng)足夠穩(wěn)定,可以跨平臺(tái)使用;
  •  我們可以使用輕量級(jí)的庫(kù)來(lái)封裝事件委托模式;
  •  隨著 JavaScript 語(yǔ)言的發(fā)展,jQuery 提供的一些語(yǔ)法糖已經(jīng)變得多余。

另外,鏈?zhǔn)秸Z(yǔ)法不能滿足我們想要的編寫(xiě)代碼的方式。例如: 

  1. $('.js-widget')  
  2.   .addClass('is-loading')  
  3.   .show() 

這種語(yǔ)法寫(xiě)起來(lái)很簡(jiǎn)單,但是根據(jù)我們的標(biāo)準(zhǔn),它并不能很好地傳達(dá)我們的意圖。作者是否期望在當(dāng)前頁(yè)面上有一個(gè)或多個(gè) js-widget 元素?另外,如果我們更新頁(yè)面標(biāo)記并意外遺漏了 js-widget 類(lèi)名,瀏覽器是否會(huì)拋出異常會(huì)告訴我們出了什么問(wèn)題?默認(rèn)情況下,當(dāng)沒(méi)有任何內(nèi)容與選擇器匹配時(shí),jQuery 會(huì)跳過(guò)整個(gè)表達(dá)式,但對(duì)我們來(lái)說(shuō),這是一個(gè) bug。

***,我們開(kāi)始使用 Flow 來(lái)注解類(lèi)型,以便在構(gòu)建時(shí)執(zhí)行靜態(tài)類(lèi)型檢查,并且我們發(fā)現(xiàn),鏈?zhǔn)秸Z(yǔ)法不適合做靜態(tài)分析,因?yàn)閹缀跛?jQuery 方法返回的結(jié)果都是相同的類(lèi)型。我們當(dāng)時(shí)之所以選擇 Flow,是因?yàn)?@flow weak 模式等功能可以讓我們逐步將類(lèi)型應(yīng)用于無(wú)類(lèi)型的代碼庫(kù)上。

總而言之,移除 jQuery 意味著我們可以更多地依賴 Web 標(biāo)準(zhǔn),讓 MDN Web 文檔成為前端開(kāi)發(fā)人員事實(shí)上的默認(rèn)文檔,在將來(lái)可以維護(hù)更具彈性的代碼,并且可以將 30KB 的依賴從我們的捆綁包中移除,加快頁(yè)面的加載速度和 JavaScript 的執(zhí)行速度。

逐步解耦

雖然定下了最終目標(biāo),但我們也知道,分配所有資源一次性移除 jQuery 是不可行的。這種匆匆忙忙的做法可能會(huì)導(dǎo)致網(wǎng)站功能出現(xiàn)回歸。相反,我們采取了以下的策略:

1. 設(shè)定指標(biāo),跟蹤整一行代碼調(diào)用 jQuery 的比率,并監(jiān)控指標(biāo)走勢(shì)隨時(shí)間變化的情況,確保它保持不變或下降,而不是上升。

2. 我們不鼓勵(lì)在任何新代碼中導(dǎo)入 jQuery。為了方便自動(dòng)化,我們創(chuàng)建了 eslint-plugin-jquery(https://github.com/dgraham/eslint-plugin-jquery),如果有人試圖使用 jQuery 功能,例如 $.ajax,CI 檢查將會(huì)失敗。

3. 舊代碼中存在大量違反 eslint 規(guī)則的情況,我們?cè)诖a注釋中使用特定的 eslint-disable 規(guī)則進(jìn)行了注解。看到這些代碼的讀者,他們都該知道,這些代碼不符合我們當(dāng)前的編碼實(shí)踐。

4. 我們創(chuàng)建了一個(gè)拉請(qǐng)求機(jī)器人,當(dāng)有人試圖添加新的 eslint-disable 規(guī)則時(shí),會(huì)對(duì)拉取請(qǐng)求留下評(píng)論。這樣我們就可以盡早參與代碼評(píng)審,并提出替代方案。

5. 很多舊代碼使用了 pjax 和 facebox 插件,所以我們?cè)诒3炙鼈兊慕涌趲缀醪蛔兊耐瑫r(shí),在內(nèi)部使用 JS 重新實(shí)現(xiàn)它們的邏輯。靜態(tài)類(lèi)型檢查有助于提升我們進(jìn)行重構(gòu)的信心。

6. 很多舊代碼與 rails-behavior 發(fā)生交互,我們的 Ruby on Rails 適配器幾乎是“不顯眼的”JS,它們將 AJAX 生命周期處理器附加到某些表單上: 

  1. // 舊方法  
  2.   $(document).on('ajaxSuccess', 'form.js-widget', function(event, xhr, settings, data) {  
  3.     // 將響應(yīng)數(shù)據(jù)插入到 DOM 中  
  4.   }) 

7. 我們選擇觸發(fā)假的 ajax* 生命周期事件,并保持這些表單像以前一樣異步提交內(nèi)容,而不是立即重寫(xiě)所有調(diào)用,只是會(huì)在內(nèi)部使用 fetch()。

8. 我們自己維護(hù)了 jQuery 的一個(gè)版本,每當(dāng)發(fā)現(xiàn)我們不再需要 jQuery 的某個(gè)模塊的時(shí)候,就會(huì)將它從自定義版本中刪除,并發(fā)布更輕量的版本。例如,在移除了 jQuery 的 CSS 偽選擇器之后(如:visible 或:checkbox)我們就可以移除 Sizzle 模塊了,當(dāng)所有的 $.ajax 調(diào)用都被 fetch() 替換時(shí),就可以移除 AJAX 模塊。

這樣做有兩個(gè)目的:加快 JavaScript 執(zhí)行速度,同時(shí)確保不會(huì)有新代碼試圖使用已移除的功能。

9. 我們根據(jù)網(wǎng)站的分析結(jié)果盡快放棄對(duì)舊版本 Internet Explorer 的支持。每當(dāng)某個(gè) IE 版本的使用率低于某個(gè)閾值時(shí),我們就會(huì)停止向它提供 JavaScript 支持,并專注支持更現(xiàn)代的瀏覽器。盡早放棄對(duì) IE 8 和 IE 9 的支持對(duì)于我們來(lái)說(shuō)意味著可以采用很多原生的瀏覽器功能,否則的話有些功能很難通過(guò) polyfill 來(lái)實(shí)現(xiàn)。

10. 作為 GitHub.com 前端功能開(kāi)發(fā)新方法的一部分,我們專注于盡可能多地使用常規(guī) HTML,并且逐步添加 JavaScript 行為作為漸進(jìn)式增強(qiáng)。因此,那些使用 JS 增強(qiáng)的 Web 表單和其他 UI 元素通常也可以在禁用 JavaScript 的瀏覽器上正常運(yùn)行。在某些情況下,我們可以完全刪除某些遺留的代碼,而不需要使用 JS 重寫(xiě)它們。

經(jīng)過(guò)多年的努力,我們逐漸減少對(duì) jQuery 的依賴,直到?jīng)]有一行代碼引用它為止。

自定義元素

近年來(lái)一直在炒作一項(xiàng)新技術(shù),即自定義元素——瀏覽器原生的組件庫(kù),這意味著用戶無(wú)需下載、解析和編譯額外的字節(jié)。

從 2014 年開(kāi)始,我們已經(jīng)基于 v0 規(guī)范創(chuàng)建了一些自定義元素。然而,由于標(biāo)準(zhǔn)仍然在不斷變化,我們并沒(méi)有投入太多精力。直到 2017 年,Web Components v1 規(guī)范發(fā)布,并且 Chrome 和 Safari 實(shí)現(xiàn)了這一規(guī)范,我們才開(kāi)始更廣泛地采用自定義元素。

在移除 jQuery 期間,我們也在尋找用于提取自定義元素的模式。例如,我們將用于顯示模態(tài)對(duì)話框的 facebox 轉(zhuǎn)換為<details-dialog>元素(https://github.com/github/details-dialog-element)。

我們的漸進(jìn)式增強(qiáng)理念也延伸到了自定義元素上。這意味著我們將盡可能多地保留標(biāo)記內(nèi)容,然后再標(biāo)記上添加行為。例如,<local-time>默認(rèn)顯示原始時(shí)間戳,它被升級(jí)成可以將時(shí)間轉(zhuǎn)換為本地時(shí)區(qū),而對(duì)于<details-dialog>,當(dāng)它被嵌在 <details>元素中時(shí),可以在不使用 JavaScript 的情況下具備交互性,它被升級(jí)成具有輔助增強(qiáng)功能。

以下是實(shí)現(xiàn)<local-time>自定義元素的示例: 

  1. // local-time 根據(jù)用戶的當(dāng)前時(shí)區(qū)顯示時(shí)間。  
  2. //  
  3. // 例如:  
  4. //   <local-time datetime="2018-09-06T08:22:49Z">Sep 6, 2018</local-time>  
  5. //  
  6. class LocalTimeElement extends HTMLElement {  
  7.   static get observedAttributes() {  
  8.     return ['datetime']  
  9.   }  
  10.   attributeChangedCallback(attrName, oldValue, newValue) {  
  11.     if (attrName === 'datetime') {  
  12.       const date = new Date(newValue)  
  13.       this.textContent = date.toLocaleString()  
  14.     }  
  15.   }  
  16.  
  17. if (!window.customElements.get('local-time')) {  
  18.   window.LocalTimeElement = LocalTimeElement  
  19.   window.customElements.define('local-time', LocalTimeElement)  

我們很期待 Web 組件的 Shadow DOM。Shadow DOM 的強(qiáng)大功能為 Web 帶來(lái)了很多可能性,但也讓 polyfill 變得更加困難。因?yàn)槭褂?polyfill 會(huì)導(dǎo)致性能損失,因此在生產(chǎn)環(huán)境中使用它們是不可行的。

 

責(zé)任編輯:龐桂玉 來(lái)源: 前端之巔
相關(guān)推薦

2024-06-27 13:45:21

2021-06-04 05:21:19

KubernetesDocker容器

2013-03-12 10:05:08

Node.jsGitHub開(kāi)源

2020-05-15 08:30:25

前端開(kāi)發(fā)工具

2011-12-26 09:38:24

諾基亞SymbianBelle

2023-11-27 07:53:44

2016-12-27 15:13:12

系統(tǒng)

2015-06-10 10:50:29

程序員感覺(jué)到累

2012-02-22 15:32:11

海量數(shù)據(jù)

2025-05-12 08:28:23

2020-06-19 14:55:11

Kubernetes容器技術(shù)

2025-02-24 10:36:15

2024-07-04 08:56:35

Vue3項(xiàng)目Pinia

2021-10-20 14:29:44

layuijQuery前端

2011-06-08 10:30:08

MongoDB

2017-04-05 16:40:45

2020-06-10 09:06:48

MongoDB架構(gòu)高可用

2022-12-01 14:43:56

物聯(lián)網(wǎng)智慧城市

2020-04-06 14:45:22

云計(jì)算邊緣計(jì)算網(wǎng)絡(luò)

2025-06-24 02:00:00

5G-A運(yùn)營(yíng)商基站
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 完全免费在线视频 | 亚洲综合免费 | 国产精品亚洲一区 | a视频在线观看 | 男人的天堂在线视频 | 日韩一区二区在线播放 | 久久久xxx| 欧美日韩国产精品 | 一级毛片视频免费观看 | 91综合网| 99re热精品视频 | 精品欧美乱码久久久久久 | 三级免费毛片 | 亚洲视频一区在线观看 | 在线观看视频一区 | www精品美女久久久tv | 日韩人体视频 | 亚洲欧美日韩在线 | 国产视频中文字幕在线观看 | 欧美一区2区三区3区公司 | 日韩精品久久一区 | 日韩一级在线 | 久草网在线视频 | 午夜天堂精品久久久久 | 日韩精品久久久 | 欧美精品在线一区二区三区 | 欧美偷偷操 | 国产欧美一区二区三区在线播放 | 九色 在线 | 国产一区二区三区免费 | 91电影在线| 成人免费在线视频 | 久久大陆| 国产高清在线 | 国产亚洲一区二区在线观看 | 国产精品国产三级国产aⅴ无密码 | 欧美日韩一区精品 | 国产精品国产a级 | 久久一区二区免费视频 | 亚洲影视在线 | 国产精品视频二区三区 |