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