JavaScriptコミュニティのライブラリによる「smooshゲート」イベントはいったいどうなっているのでしょうか.
5500 ワード
原文:#SmooshGate FAQ
作者:Mathias Bynens
smoosh?!何があったの?!
JavaScript機能という提案
この提案は筆者が冗談を言って
しかし、誰もが冗談だと知っているわけではありません.この新しい名前が確定し、急速にアップグレードされたと勘違いし始めた人もいます.
同様の提案には、
MooToolsはどんな問題を引き起こしましたか?
MooToolsは、独自の非標準バージョン
MooToolsの
残念なことに、他のことが起こった.MooToolsは、そのすべてのカスタム配列メソッドを
現在、
オリジナル
ここでもっと大きな問題は、組み込みオブジェクトを修正することです.現在、ローカルプロトタイプを拡張することは、他のライブラリやサードパーティコードとうまく結合できないため、一般的にはよくない方法とされています.あなたの対象ではないオブジェクトを修正しないでください.
既存の名前を保持し、ネットワークを破壊しないのはなぜですか?
1996年、CSSが広まる前に「HTML 5」以前からSpace Jamサイトが稼働していた.今日、このサイトは22年間順調に運営されています.
どうやって?ここ数年、ブラウザベンダーが新しい機能を発表するたびに更新するWebサイトを維持している人はいますか?
事実は証明して、“ネットを破らないでください”はHTML、CSS、JavaScriptとWebのいかなる標準の上ですべて広範に使うナンバーワンの設計の原則です.新しいブラウザ機能を公開して既存のWebサイトが停止した場合、誰もが不利になります.影響を受けたウェブサイトの訪問者は突然破壊されたユーザー体験を得た. サイトの所有者は完璧なサイトから機能のないサイトに変わったが、サイトの所有者は何も変わっていない. ユーザーは「XXXブラウザのみサポート」を見てブラウザを切り替えたため、新機能を発売したブラウザベンダーは市場シェアを失った. 互換性の問題が判明すると、他のブラウザベンダーはこの機能の実装を拒否します.ある特性の規範が実際の実現状況と一致しない(「架空の作品にすぎない」)ことを招き、標準化の過程に不利である.
もちろん、MooToolsが間違っていたことを思い出します.しかし、ネットワークを破るのはそれら(MooTools)を罰するのではなく、ユーザーを罰します.これらのユーザーはMooToolsが何なのか分かりません.
あるいは、ユーザーがネットワークを引き続き使用できる別のソリューションを見つけることができます.
これは、Webプラットフォームから悪いAPIを削除できないことを意味しますか?
ごく少数の場合、ネットワークから不良な機能を削除することができます.1つの機能を削除できるかどうかを明らかにするだけでも非常に難しい作業であり、どれだけのページが彼らの行動を変えるかを量子化するために多くの遠隔測定が必要である.ただし、機能が十分に安全ではなく、ユーザーに有害であるか、少ない場合は、この操作を完了できます.
作者:Mathias Bynens
smoosh?!何があったの?!
JavaScript機能という提案
Array.prototype.flatten
は、Webと互換性がないことを証明しています.Firefox Nightlyでこの機能を公開すると、少なくとも1つの人気サイトが中断します.問題のあるコードが広く使われている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はオリジナルインプリメンテーションを上書きします.これにより、原生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サイトが停止した場合、誰もが不利になります.
もちろん、MooToolsが間違っていたことを思い出します.しかし、ネットワークを破るのはそれら(MooTools)を罰するのではなく、ユーザーを罰します.これらのユーザーはMooToolsが何なのか分かりません.
あるいは、ユーザーがネットワークを引き続き使用できる別のソリューションを見つけることができます.
これは、Webプラットフォームから悪いAPIを削除できないことを意味しますか?
ごく少数の場合、ネットワークから不良な機能を削除することができます.1つの機能を削除できるかどうかを明らかにするだけでも非常に難しい作業であり、どれだけのページが彼らの行動を変えるかを量子化するために多くの遠隔測定が必要である.ただし、機能が十分に安全ではなく、ユーザーに有害であるか、少ない場合は、この操作を完了できます.