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.