SmooshGate Hakkında SSS

Sorun neydi?

JavaScript için teklif Array.prototype.flatten adlı dil özelliğinin Web ile uyumlu değil. Özelliğin Firefox Gecelik'te gönderilmesi en az bir popüler web sitesinin sağlanmasına neden oldu kırmaktır. Sorunlu kodun yaygın Moo Tools'un bir parçası olduğu düşünüldüğünde, büyük olasılıkla çok daha fazla web sitesi etkilenecektir. (MooAraçları 2018'de yeni web siteleri için yaygın olarak kullanılmasa da eskiden çok popülerdi ve üretime yönelik web sitelerinin çoğunda hâlâ mevcuttur.)

Teklif yazarı, şaka yoluyla flatten adlı kullanıcının smoosh olarak yeniden adlandırılmasını şu şekilde önerdi: uyumluluk sorunundan kaçının. Espriyi herkes anlayamadı. Bazı kişiler insanlar yeni adın zaten yanlış bir şekilde karar verdi ve işler hızla iyileşti.

Array.prototype.flatten ne işe yarar?

Array.prototype.flat, ilk olarak Array.prototype.flatten olarak önerildi, dizileri, varsayılan olarak belirtilen depth değerine kadar yinelemeli olarak düzleştirir. Hedef: 1.

// Flatten one level:
const array = [1, [2, [3]]];
array.flat();
// → [1, 2, [3]]

// Flatten recursively until the array contains no more nested arrays:
array.flat(Infinity);
// → [1, 2, 3]

Aynı teklif Array.prototype.flatMap içerir. Bu da aşağıdaki gibidir: Array.prototype.map ise sonucu yeni bir dizi olarak düzeltir.

[2, 3, 4].flatMap((x) => [x, x * 2]);
// → [2, 4, 3, 6, 4, 8]

MooTools bu soruna neden olan ne yapıyor?

MooTools kendi standart olmayan Array.prototype.flatten sürümünü tanımlar:

Array.prototype.flatten = /* non-standard implementation */;

MooAraçlar'ın flatten uygulaması, önerilen standarttan farklı. Yine de sorun bu değil. Tarayıcılar yayınlandığında Yerel olarak Array.prototype.flatten, MooTools yerel olarak geçersiz kılar hakkında bilgi edindiniz. Böylece, Moo Tools'un davranışına dayalı olan kod, yerel flatten kullanılabilir olsa da olmasa da amaçlandığı gibi çalışır. Şu ana kadar her şey yolunda!

Maalesef bundan sonra farklı bir durum söz konusu. MooTools, tüm araçlarını özel dizi yöntemlerini Elements.prototype değerine ayarlayın (burada Elements, MooAraçlara özel API):

for (var key in Array.prototype) {
  Elements.prototype[key] = Array.prototype[key];
}

for-in, aşağıdakileri içermeyen "enumerable" özellikler üzerinde yineleniyor Array.prototype.sort gibi yerel yöntemler içeriyor, ancak Array.prototype.foo = whatever gibi düzenli olarak atanan mülklerdir. Ancak— ve önemli olan şudur: Numaralandırılamayan bir özelliğin üzerine yazarsanız (ör. Array.prototype.sort = whatever ise numaralandırılamaz.

Şu anda Array.prototype.flatten = mooToolsFlattenImplementation şunları oluşturuyor: bir flatten özelliği olarak tanımlar; böylece bu özellik daha sonra Elements içine kopyalanır. Ancak tarayıcılar flatten sürümünün yerel sürümünü gönderdiğinden numaralandırılamaz hale gelir ve Elements adlı cihaza kopyalanmaz. Moo Tools'u kullanan tüm kodlar Elements.prototype.flatten artık çalışmıyor.

Yerel Array.prototype.flatten, sorunu çözer ancak büyük olasılıkla daha da fazla uyumluluk sorunları olabilir. Yineleme için for-in kullanan her web sitesi bir dizi (bu kötü bir uygulamadır, ancak olur) aniden flatten özelliği için ek bir döngü yinelemesi.

Buradaki en büyük sorun, yerleşik nesnelerin değiştirilmesidir. Uzatılıyor yerel prototipler günümüzde genellikle kötü bir uygulama olarak kabul görmektedir çünkü diğer kitaplıklarla ve üçüncü taraf kodlarıyla uyumlu değilse. Değiştirme size ait olmayan nesneler bulun.

Neden sadece mevcut adı koruyarak İnternet'i yıkmıyoruz?

1996'da CSS yaygınlaşmadan ve "HTML5" haline gelmeden çok önce Space Jam web sitesi yayınlandı. Bugün web sitesi hâlâ çalışıyor. tıpkı 22 yıl önce olduğu gibi.

Peki bu nasıl oldu? Birisi bu web sitesini yıllarca işletti mi? tarayıcı tedarikçi firmaları yeni özellik gönderdiğinde de güncelliyor mu?

Görünüşe göre, bir numaralı tasarım ilkesi "Web'i kırmayın" JavaScript'e ve web üzerinde yaygın olarak kullanılan diğer tüm standartlara Web. Yeni bir tarayıcı özelliğinin gönderilmesi mevcut web sitelerinin durdurulmasına neden oluyorsa Bu, herkes için kötü bir durumdur:

  • Etkilenen web sitelerinin ziyaretçileri aniden kötü bir kullanıcı deneyimi yaşıyor;
  • web sitesi sahipleri kusursuz biçimde çalışan bir web sitesinden hiçbir şeyi değiştirmeden, işlevsel olmayan,
  • yeni özelliği gönderen tarayıcı tedarikçilerinin, kullanıcılar sebebiyle pazar payını kaybetmesi “X tarayıcısında çalışıyor” olduğunu fark ettikten sonra tarayıcılar arasında geçiş yapma;
  • uyumluluk sorunu bilindikten sonra, diğer tarayıcı tedarikçi firmaları ürünleri veya somut olarak ortaya koyar. Özellik spesifikasyonu gerçeklikle eşleşmiyor ("kurmacadan başka bir şey değil"), Bu da standartlaştırma süreci açısından kötü bir durumdur.

Elbette, geriye dönük olarak MooTools yanlış bir şey yaptı. Ancak web'i çökertti cezalandırmıyor. Bu kullanıcılar, ne moo'nun ne olduğunu bilmiyorlar. yardımcı olur. Alternatif olarak başka bir çözüm bulabiliriz. Bu durumda kullanıcılar devam edebilir. Google'dan bahsetmek istiyorum. Bu seçimi yapmak kolaydır.

Bu, hatalı API'lerin Web Platformu'ndan hiçbir zaman kaldırılamayacağı anlamına mı geliyor?

Duruma göre değişir. Nadir durumlarda, kötü özellikler web'den kaldırılabilir. Sadece ne olduğunu özelliği kaldırmanın mümkün olup olmadığını anlamak isteyebilirsiniz. kaç web sayfasının düzgün şekilde yürütüleceğini belirlemek için ve davranış değişti. Ancak bu özellik yeterince güvensiz olduğunda, veya çok nadir kullanılırsa bu yapılabilir.

<applet>, <keygen> ve showModalDialog() tanesinin tümü Web Platformu'ndan başarıyla kaldırılan hatalı API'lere ilişkin örnekler.

MooAraçlar'ı düzeltmeye ne dersiniz?

MooAraçlar'a artık yerleşik nesneleri genişletmeyecek şekilde yama uygulamak fikir edinmiş oldunuz. Yine de bu, mevcut sorunu çözmez. MooTools daha önce bunu yama uygulanmış bir sürüm yayınlamak için kullanan mevcut tüm web sitelerinin uyumluluk sorununu düzeltmeye çalışın.

Kullanıcılar MooAraçlar'ın kopyalarını güncelleyemez mi?

MooTools mükemmel bir dünyada bir yama yayınlar ve otomatik olarak güncellenir. Sorun çözüldü, değil mi?!

Maalesef bu gerçekçi değil. Bir kişi bir şekilde kendini tanımlayıp Etkilenen web sitelerinin tamamından tüm web sitesi sahiplerine başarılı bir şekilde ulaşması, ve hepsini güncellemeyi yapmaya ikna edin (bu durumda, uygulamanızı tüm işlem için bir istek geliyorsa, tüm süreç en iyisi yıllar sürer.

Bu web sitelerinin çoğunun eski olduğunu ve muhtemelen bakımsız olduğunu unutmayın. Bakımı yapan kişi şu an yanınızda olsa bile, bir bakıma sizin gibi çok yetenekli web geliştiricisi var. Herkesin gitmesini bekleyemeyiz. ve web uyumluluğu sorunu nedeniyle 8 yıllık web sitesini değiştirmeleri.

TC39 süreci nasıl işler?

TC39, TC39 tarafından sağlanan JavaScript dilini standardına uygun olmalıdır.

#SmooshGate, bazı kullanıcıların "TC39"un flatten adını şu şekilde yeniden adlandırmak istediğini düşünmesine neden oldu: smoosh" diyordu, ancak şirket dışındakilerle iyi iletişim kurulamayan bir şakaydı. Bir teklifi yeniden adlandırmak gibi büyük kararlar hafife alınmaz ve alınmaz. tek bir kullanıcı tarafından görüntüler ve kesinlikle tek bir GitHub yorumu'na dokunun.

TC39, özellik teklifleri için net bir hazırlık süreci üzerinde çalışmaktadır. ECMAScript teklifleri ve bu tekliflerde yapılan büyük değişiklikler (yöntem dahil) yeniden adlandırma) TC39 toplantıları sırasında tartışılır ve TC39 tarafından tüm komiteyi yönetmesi gerekir. Projede Array.prototype.flatten, teklif şu ana kadar Bu da 3. aşamaya kadar devam eder. Bu aşamada, özelliğin web tarayıcılarında uygulanmaya hazır hale getirilebilir. Ek spesifikasyonlar için ortaya çıkabilecek pek çok sorunu vardır. Bu durumda en önemli geri bildirim, ürünü sunmaya çalıştıktan sonra geldi: özellik, mevcut haliyle, web'i bozar. Bunlar gibi tahmin edilmesi zor sorunlar bu durumun nedenlerinden biri TC39 süreci sadece tarayıcılar bir özellik gönderdiğinde sona ermiyor.

TC39 fikir birliği üzerine çalışır, yani komitenin yeni olası anlamına gelir. smoosh ciddi bir öneri olsa da muhtemelen bir komite üyesi ise daha genel bir ad için buna itiraz eder; compact veya chain.

flatten olan yeniden adlandırma işleminin smoosh (şaka değil olsa bile) olarak değiştirilmesi TC39 toplantısında hiçbir zaman gündeme gelmemiş olabilir. Bu nedenle, TC39'un bu konu şu anda bilinmiyor. Tek bir şahıs adına konuşamaz bir sonraki toplantıda fikir birliğine varılana kadar

TC39 toplantılarına genellikle çok farklı yönleri olan ve bazıları uzun yıllardır programlama dili tasarım deneyimine sahiptir. bir tarayıcıda veya JavaScript motorunda çalışır ve bu sırada çalışan JavaScript geliştirici topluluğunu temsil edecek kadrosu vardır.

SmooshGate sonuçta nasıl çözüldü?

Mayıs 2018'deki TC39 toplantısında, #SmooshGate flatten, flat olarak yeniden adlandırılarak resmi olarak çözüldü.

Array.prototype.flat ve Array.prototype.flatMap, V8 v6.9 ve Chrome 69.