摘要:提案及其任何重大變更包括方法更新在會議期間進行討論,并且需要整個委員會批準后方可正式提交。在下次會議達成共識之前,沒有任何一個人可以代表所有發言。接下來發生什么下一次會議將于本周舉行。議程中有一項討論及其網絡兼容性問題。
原文: #SmooshGate FAQsmoosh?!發生了什么?!
作者:Mathias Bynens
一項名為 JavaScript 功能的提案 Array.prototype.flatten 證明與 Web 不兼容。在 Firefox Nightly 中發布該功能會導致至少一個受歡迎的網站中斷。鑒于有問題的代碼是廣泛使用的 MooTools 庫的一部分,很可能會有更多網站受到影響。(盡管 MooTools 在 2018 年并不常用于新網站,但它曾經非常流行,并且仍然存在于許多已經正在運行的網站上。)
該提案筆者開玩笑地建議把 flatten 重命名為 smoosh,以避免兼容性問題。
但是,并非所有人都知道這是一個笑話,有些人開始錯誤地認為這個新名字已經被確定,并且事情迅速升級。
Array.prototype.flatten 是什么?Array.prototype.flatten 遞歸地將數組展按照指定的 depth 進行展平,depth 的默認值為 1。
// Flatten one level: const array = [1, [2, [3]]]; array.flatten(); // → [1, 2, [3]] // Flatten recursively until the array contains no more nested arrays: array.flatten(Infinity); // → [1, 2, 3]
同樣的提議還包括 Array.prototype.flatMap,如同 Array.prototype.map 一樣,可以在參數里面傳遞一個回調函數。
[2, 3, 4].flatMap((x) => [x, x * 2]); // → [2, 4, 3, 6, 4, 8]MooTools 導致了什么問題?
MooTools 定義了他們自己的非標準版本 Array.prototype.flatten:
Array.prototype.flatten = /* non-standard implementation */;
MooTools 的 flatten 實現與建議的標準不同。但是,這并不是問題!當瀏覽器提供了原生的 Array.prototype.flatten 時,MooTools 會覆蓋原生實現。這可確保依賴 MooTools 的代碼按預期運行,無論原生 flatten 是否可用。到現在為止還挺好!
不幸的是,發生了其他事情。MooTools 將其所有自定義數組方法復制到 Elements.prototype(Elements 是 MooTools 特定的 API):
for (var key in Array.prototype) { Elements.prototype[key] = Array.prototype[key]; }
for-in 遍歷“可枚舉”屬性,其中不包括像原生方法 Array.prototype.sort,而是包括自定義的屬性Array.prototype.foo = whatever。但是 - 背鍋開始了 - 如果你覆蓋了一個非枚舉屬性,例如 Array.prototype.sort = whatever,那么這個屬性仍然是不可枚舉的。
目前,Array.prototype.flatten = mooToolsFlattenImplementation 創建一個枚舉 flatten 屬性,所以它以后會被復制到 Elements。但是,如果我們發布原生版本的 flatten,它將變得不可枚舉,并且不會被復制到 Elements。現在,任何使用 MooTools 并依賴于 Elements.prototype.flatten 的代碼都被破壞了。
盡管將原生 Array.prototype.flatten 變為可枚舉可能會解決問題,但它可能會導致更多的兼容性問題。每個依賴于 for-in 遍歷數組(這是一個糟糕的做法,但它經常被使用)的網站會突然得到該 flatten 屬性的循環迭代。
這里更大的底層問題是修改內置對象?,F在擴展本地原型通常被認為是一種不好的做法,因為它不能很好地與其他庫和第三方代碼結合。不要修改不屬于你的對象!
我們為什么不保留現有名稱并打破網絡?1996 年,在 CSS 廣泛傳播之前,早在“HTML5”之前,Space Jam 網站就已經開始運行了。今天,該網站已經順利運行 22年了。
這是怎么做到的呢?這些年有沒有人維護該網站,每次瀏覽器供應商發布新功能時都會更新它?
事實證明,“不要打破網絡”是 HTML,CSS,JavaScript 和 Web 任何標準上都廣泛使用的頭號設計原則。如果發布新的瀏覽器功能導致現有網站停止工作,那對每個人都不利:
受影響網站的訪問者突然得到一個破壞的用戶體驗;
網站所有者從一個完美的網站變成了一個沒有功能的網站,而網站所有者卻并沒有改變任何東西;
用戶看到“只支持 XXX 瀏覽器”之后切換瀏覽器,因此推出新功能的瀏覽器供應商失去了市場份額。
一旦知道兼容性問題,其他瀏覽器供應商拒絕實現此特性。導致某特性的規范與實際實現情況不符(“只是虛構的作品”),這對標準化過程不利。
當然,回想起來 MooTools 做錯了一件事 - 但是打破網絡并不懲罰它們(MooTools),而是會懲罰用戶。這些用戶不知道 MooTools 是什么。
或者,我們可以找到另一種解決方案,用戶可以繼續使用網絡。
這是否意味著無法從 Web 平臺中刪除不好的 API?在極少數情況下,可以從網絡中刪除不良的功能。即使僅僅弄清楚是否可以刪除一個功能也是非常棘手的工作,需要大量的遙測來量化有多少網頁會改變他們的行為。但是,如果功能足夠不安全,對用戶有害,或者很少使用,則可以完成此操作。
,
修補 MooTools 以便它不再擴展內置對象是個不錯的主意。但是,它并沒有解決手頭的問題。即使 MooTools 發布補丁版本,所有使用它的現有網站也必須更新,這樣兼容性問題才能消失。
能不能只更新網站中使用的 MooTools 副本?在理想情況下 MooTools 會發布一個補丁,每個使用 MooTools 的網站都會在第二天神奇地更新。問題解決了,對吧?!
不幸的是,這是不現實的。即使有人以某種方式識別了整套受影響的網站,也可以設法找到每一個網站的聯系信息,成功地與所有網站所有者聯系并說服他們全部執行更新(這可能意味著重構他們的網站完整的代碼庫),整個過程最多需要幾年的時間。
請記住,這些網站很多都是舊的,可??能無法維護。即使維護人員仍然在身邊,也可能他們不是像您一樣的高技能 Web 開發人員。由于網絡兼容性問題,我們不能指望每個人都去改變他們已經運行了七八年的網站。
TC39 的工作流程是什么樣的?JavaScript 語言基于 ECMAScript 標準,TC39 是負責 JavaScript 語言更新發展的委員會
“Smoosh門”事件使得一些人誤認為“TC39 想要把 flatten 重新命名為 smoosh”,但這是一個沒有很好溝通的笑話。重命名提案等重大決策不會被輕視,不會被單個人采納,并且絕對不會在 GitHub 的評論上完成。
TC39 對于功能提案有著清晰得分級過程。ECMAScript 提案及其任何重大變更(包括方法更新)在 TC39 會議期間進行討論,并且需要整個委員會批準后方可正式提交。在這種情況下 Array.prototype.flatten 提案已經經歷了好幾個階段的討論,一直到 Stage 3,表明該功能已準備好在 Web 瀏覽器中實現。實施過程中出現其他規范問題很常見。在這種情況下,最重要的反饋意見是在試圖發布它之后才有的:該特性在當前狀態下打破了 Web。即使瀏覽器發布新功能后 TC39 的流程并沒有結束,就是因為這些難以預測的問題。
TC39 以協商一致的方式運作,這意味著委員會必須就任何新的變化達成一致。即使 smoosh 是一個嚴肅的建議,委員會成員似乎也可能會反對,而是贊成使用更常見的名稱,例如 compact 或 chain。
把 flatten 重命名為 smoosh(即使它不是一個笑話)從未在 TC39 會議上討論。因此,關于這個問題的官方 TC39 立場目前是未知的。在下次會議達成共識之前,沒有任何一個人可以代表所有 TC39 發言。
TC39 會議通常由具有高度多樣化背景的人士出席:一些人擁有多年的編程語言設計經驗,另一些人使用瀏覽器或 JavaScript 引擎工作,越來越多的 JavaScript 開發人員社區參與者。
接下來發生什么?下一次 TC39 會議將于本周舉行。議程中有一項討論 flatten 及其網絡兼容性問題。希望在會議結束后我們會更多地了解下一步。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/93549.html
摘要:具體調用鏈路如圖函數主要是解析啟動參數,并過濾選項傳給引擎。查閱文檔之后發現,通過指定參數可以設置線程池大小。原來的字節碼編譯優化還有都是通過多線程完成又繼續深入調查,發現環境變量會影響的線程池大小。執行過程如下調用執行。 作者:正龍 (滬江Web前端開發工程師)本文原創,轉載請注明作者及出處。 隨著Node.js的普及,越來越多的開發者使用Node.js來搭建環境,也有很多公司開始把...
摘要:具體調用鏈路如圖函數主要是解析啟動參數,并過濾選項傳給引擎。查閱文檔之后發現,通過指定參數可以設置線程池大小。原來的字節碼編譯優化還有都是通過多線程完成又繼續深入調查,發現環境變量會影響的線程池大小。執行過程如下調用執行。 作者:正龍 (滬江Web前端開發工程師)本文原創,轉載請注明作者及出處。 隨著Node.js的普及,越來越多的開發者使用Node.js來搭建環境,也有很多公司開始把...
摘要:在中,組件基本由三個部分組成屬性狀態以及生命周期方法。在生命周期中是必須的,是渲染組件用的。返回就是緊接著以下的生命周期函數返回表示組件不需要重新渲染,不再執行任何生命周期函數包括。生命周期流程圖原文地址 盡量全面詳細的整理一下React的生命周期中的知識點。 組件 組件是獨立的封裝的可以復用的一個小部件,它是React的核心思想之一。通過劃分組件,可以將一個頁面劃分成獨立的多個可復用...
摘要:目標階段真正點擊的元素的事件發生了兩次,因為在上面的代碼中,既在捕獲階段綁定了事件,又在冒泡階段綁定了事件,所以發生了兩次。所以很明顯用直接綁定的事件發生在了冒泡階段。 如果對事件大概了解,可能知道有事件冒泡這回事,但是冒泡、捕獲、傳播這些機制可能還沒有深入的研究實踐一下,我抽時間整理了一下相關的知識。 本文主要對事件機制一些細節進行討論,過于基礎的事件綁定知識方法沒有介紹。 特別少...
閱讀 854·2023-04-26 00:11
閱讀 2655·2021-11-04 16:13
閱讀 2101·2021-09-09 09:33
閱讀 1472·2021-08-20 09:35
閱讀 3817·2021-08-09 13:42
閱讀 3604·2019-08-30 15:55
閱讀 1039·2019-08-30 15:55
閱讀 2218·2019-08-30 13:55