JavaScriptコミュニティのライブラリによる「smooshゲート」イベントはいったいどうなっているのでしょうか.


原文:#SmooshGate FAQ
作者:Mathias Bynens
smoosh?!何があったの?!
JavaScript機能という提案Array.prototype.flattenは、Webと互換性がないことを証明しています.Firefox Nightlyでこの機能を公開すると、少なくとも1つの人気サイトが中断します.問題のあるコードが広く使われているMooToolsライブラリの一部であることから、より多くのサイトが影響を受ける可能性が高い.(MooToolsは2018年には新しいサイトではあまり使われていませんが、非常に流行しており、すでに稼働している多くのサイトに存在しています.)
この提案は筆者が冗談を言ってflattensmooshに名前を変更し、互換性の問題を避けることを提案した.
しかし、誰もが冗談だと知っているわけではありません.この新しい名前が確定し、急速にアップグレードされたと勘違いし始めた人もいます.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はオリジナルインプリメンテーションを上書きします.これにより、原生flattenが利用可能であるかどうかにかかわらず、MooToolsに依存するコードが予想通りに実行されることが保証される.今まではよかった!
残念なことに、他のことが起こった.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属性のループ反復を突然得る(これは悪い方法だが、よく使用される).
ここでもっと大きな問題は、組み込みオブジェクトを修正することです.現在、ローカルプロトタイプを拡張することは、他のライブラリやサードパーティコードとうまく結合できないため、一般的にはよくない方法とされています.あなたの対象ではないオブジェクトを修正しないでください.
既存の名前を保持し、ネットワークを破壊しないのはなぜですか?
1996年、CSSが広まる前に「HTML 5」以前からSpace Jamサイトが稼働していた.今日、このサイトは22年間順調に運営されています.
どうやって?ここ数年、ブラウザベンダーが新しい機能を発表するたびに更新するWebサイトを維持している人はいますか?
事実は証明して、“ネットを破らないでください”はHTML、CSS、JavaScriptとWebのいかなる標準の上ですべて広範に使うナンバーワンの設計の原則です.新しいブラウザ機能を公開して既存のWebサイトが停止した場合、誰もが不利になります.
  • 影響を受けたウェブサイトの訪問者は突然破壊されたユーザー体験を得た.
  • サイトの所有者は完璧なサイトから機能のないサイトに変わったが、サイトの所有者は何も変わっていない.
  • ユーザーは「XXXブラウザのみサポート」を見てブラウザを切り替えたため、新機能を発売したブラウザベンダーは市場シェアを失った.
  • 互換性の問題が判明すると、他のブラウザベンダーはこの機能の実装を拒否します.ある特性の規範が実際の実現状況と一致しない(「架空の作品にすぎない」)ことを招き、標準化の過程に不利である.

  • もちろん、MooToolsが間違っていたことを思い出します.しかし、ネットワークを破るのはそれら(MooTools)を罰するのではなく、ユーザーを罰します.これらのユーザーはMooToolsが何なのか分かりません.
    あるいは、ユーザーがネットワークを引き続き使用できる別のソリューションを見つけることができます.
    これは、Webプラットフォームから悪いAPIを削除できないことを意味しますか?
    ごく少数の場合、ネットワークから不良な機能を削除することができます.1つの機能を削除できるかどうかを明らかにするだけでも非常に難しい作業であり、どれだけのページが彼らの行動を変えるかを量子化するために多くの遠隔測定が必要である.ただし、機能が十分に安全ではなく、ユーザーに有害であるか、少ない場合は、この操作を完了できます.およびshowModalDialog()は、いずれも、Webプラットフォームから に されたエラーAPIの である.
    なぜMooToolsを しないのですか?
    MooToolsを して、 み みオブジェクトを しないようにするのは いアイデアです.しかし、それは の を していない.MooToolsがパッチをリリースしても、 のWebサイトをすべて する があります.これにより、 の が されます.
    サイトで しているMooToolsのコピーだけ できますか?
    にはMooToolsはパッチを し、MooToolsを するサイトごとに に に されます. は したでしょう?!
    なことに、これは ではありません. を けたWebサイト を らかの で しても、 Webサイトの を つけて、すべてのWebサイトの に し、 をすべて するように することができます(これは、Webサイトの なコードライブラリを することを する があります)、プロセス に かかります.
    これらのサイトの くは いものですが、 できないことを えておいてください.メンテナンススタッフがそばにいても、あなたのような なWeb ではない があります.ネットワークの の のため、 もが7、8 していたサイトを えることは できません.
    TC 39のワークフローはどのようなものですか?
    JavaScript はECMAScript に づき、TC 39はJavaScript の を する である
    「Smooshゲート」 では、「TC 39はflattensmooshと しようとした」と いする もいるが、これはコミュニケーションがうまくいかないジョークだ. の などの な は されず、 で されず、GitHubのコメントでは に しない.
    TC 39は に して な を っている.ECMAScriptの とその な ( の を む)はTC 39 の に され、 の が で、 に することができます.この 、Array.prototype.flattenの は、Stage 3までいくつかの の を ており、この がWebブラウザで される ができていることを している. に の の が することはよくあります.この 、 も なフィードバックは、 の でWebを った を しようとした にある.ブラウザが をリリースしてもTC 39のプロセスが しないのは、これらの しにくい のためです.
    TC 39は で されており、 が しい について しなければならないことを している.smooshが な であっても、 のメンバーは するかもしれないが、compactchainのようなより な の に する がある.flattensmoosh(ジョークでなくても)に を し、TC 39 で したことがありません.そのため、この に する TC 39の は である. の で に するまで、すべてのTC 39を して できる は もいません.
    TC 39 は 、 に した を つ が します. の は のプログラミング を っています.また、ブラウザやJavaScriptエンジンを って をしている もいます.JavaScript のコミュニティ が えています.
    に が こるの?
    のTC 39 は われます. にはflattenとそのネットワーク の が されている. が わったら、 のステップをもっと りたいです.