Apa yang terjadi smoosh?!
Proposal untuk JavaScript
fitur bahasa yang disebut Array.prototype.flatten
ternyata
Tidak kompatibel dengan web. Pengiriman fitur di Firefox Nightly menyebabkan setidaknya satu situs populer
beristirahat. Mengingat bahwa kode yang bermasalah adalah bagian dari alat MooTools yang meluas
perpustakaan umum, kemungkinan lebih banyak situs web
yang terpengaruh. (Meskipun MooTools
jarang digunakan untuk {i>website<i} baru pada tahun 2018, karena
penggunaannya sangat populer dan
masih ada di banyak situs produksi.)
Penulis proposal dengan bercanda menyarankan untuk mengganti nama flatten
menjadi smoosh
menjadi
menghindari masalah kompatibilitas. Lelucon itu tidak jelas bagi semua orang, beberapa
orang mulai salah meyakini
bahwa nama baru itu telah digunakan
memutuskan, dan segala
sesuatunya menjadi cepat.
Apa yang dilakukan Array.prototype.flatten
?
Array.prototype.flat
, awalnya diusulkan sebagai Array.prototype.flatten
,
meratakan array secara rekursif hingga depth
yang ditentukan, yang secara default
ke 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]
Proposal yang sama mencakup Array.prototype.flatMap
, yang mirip
Array.prototype.map
, tetapi meratakan hasilnya menjadi array baru.
[2, 3, 4].flatMap((x) => [x, x * 2]);
// → [2, 4, 3, 6, 4, 8]
Apa yang dilakukan MooTools yang menyebabkan masalah ini?
MooTools menentukan versi non-standar Array.prototype.flatten
-nya sendiri:
Array.prototype.flatten = /* non-standard implementation */;
Implementasi flatten
MooTools berbeda dari standar yang diusulkan.
Namun, bukan itu masalahnya. Saat browser mengirim
Array.prototype.flatten
secara native, MooTools menggantikan native
terlepas dari implementasi layanan. Hal ini memastikan bahwa kode yang mengandalkan perilaku MooTools
berfungsi sebagaimana mestinya terlepas dari apakah flatten
native tersedia atau tidak.
Sejauh ini, hasilnya bagus.
Sayangnya, hal lain kemudian terjadi. MooTools menyalin seluruh
metode array kustom ke Elements.prototype
(dengan Elements
adalah
API khusus MooTools):
for (var key in Array.prototype) {
Elements.prototype[key] = Array.prototype[key];
}
for
-in
melakukan iterasi pada properti "dapat dihitung", yang tidak mencakup
metode native seperti Array.prototype.sort
, tetapi menyertakan
properti yang ditetapkan secara rutin seperti Array.prototype.foo = whatever
. Tapi —
dan ini contohnya — jika Anda menimpa properti yang tidak dapat dihitung, mis.
Array.prototype.sort = whatever
, nilai tersebut tetap tidak dapat dihitung.
Saat ini, Array.prototype.flatten = mooToolsFlattenImplementation
membuat
properti flatten
yang dapat dihitung, sehingga nantinya disalin ke Elements
. Namun jika
browser mengirimkan versi native flatten
, versi tersebut menjadi tidak dapat dihitung, dan
tidak disalin ke Elements
. Kode apa pun yang mengandalkan MooTools’
Elements.prototype.flatten
sekarang rusak.
Meskipun sepertinya mengubah Array.prototype.flatten
native menjadi
dapat digunakan untuk memperbaiki masalah, kemungkinan akan menyebabkan lebih
masalah kompatibilitas. Setiap situs yang mengandalkan for
-in
untuk melakukan iterasi
sebuah {i>array<i} (yang merupakan praktik yang buruk, tetapi
terjadi) kemudian tiba-tiba akan
iterasi loop tambahan untuk properti flatten
.
Masalah mendasar yang lebih besar di sini adalah memodifikasi objek bawaan. Memperluas prototipe asli umumnya diterima sebagai praktik yang buruk saat ini, karena tidak cocok dengan library dan kode pihak ketiga lainnya. Jangan ubah objek yang bukan milik Anda!
Mengapa kita tidak mempertahankan nama yang ada dan merusak Web?
Pada tahun 1996, sebelum CSS meluas, dan jauh sebelum “HTML5” menjadi , situs Space Jam telah ditayangkan. Saat ini, {i>website<i} tersebut masih berfungsi sama seperti 22 tahun lalu.
Apa penyebabnya? Apakah seseorang memelihara situs web itu selama bertahun-tahun, memperbaruinya setiap kali vendor browser mengirimkan fitur baru?
Ternyata, "jangan merusak Web" adalah prinsip desain nomor satu untuk HTML, CSS, JavaScript, dan standar lain yang banyak digunakan pada Web. Jika pengiriman fitur browser baru akan menyebabkan situs yang ada dihentikan bekerja, ini berdampak buruk bagi semua orang:
- pengunjung situs web yang terpengaruh tiba-tiba mengalami kerusakan pengalaman pengguna;
- pemilik situs web beralih dari memiliki situs web yang berfungsi sempurna menjadi non-fungsional tanpa mengubah apa pun;
- Pengiriman fitur baru oleh vendor browser kehilangan pangsa pasar karena pengguna beralih browser setelah melihat “aplikasi ini berfungsi di browser X”;
- setelah masalah kompatibilitas diketahui, vendor browser lain menolak mengirimkan anotasi. Spesifikasi fitur tidak sesuai dengan kenyataan (“tidak ada apa-apa selain karya fiksi”), yang buruk untuk proses standardisasi.
Tentu saja, secara retrospektif MooTools melakukan hal yang salah — tapi merusak web tidak menghukum mereka, melainkan menghukum pengguna. Para pengguna ini tidak tahu apa itu moo Infrastruktur Cloud. Atau, kita dapat menemukan solusi lain, dan pengguna dapat melanjutkan untuk menggunakan web. Pilihannya mudah dibuat.
Apakah itu berarti API yang buruk tidak pernah dapat dihapus dari Platform Web?
Tergantung. Dalam kasus yang jarang terjadi, fitur yang buruk dapat dihapus dari Web. Bahkan hanya sekedar mencari mengetahui apakah kemungkinan untuk menghapus suatu fitur merupakan upaya yang sangat rumit, yang membutuhkan telemetri ekstensif untuk mengukur berapa banyak halaman web yang akan berubah. Namun, fitur ini cukup tidak aman karena dapat membahayakan pengguna, atau sangat jarang digunakan, hal ini dapat dilakukan.
<applet>
, <keygen>
, dan
showModalDialog()
semuanya
contoh API buruk yang
berhasil dihapus dari Platform Web.
Mengapa kita tidak memperbaiki MooTools saja?
Mem-patch MooTools sehingga tidak lagi memperluas objek bawaan adalah langkah yang bagus ide. Namun, hal tersebut tidak menyelesaikan masalah yang dihadapi. Bahkan jika MooTools adalah merilis versi yang di-patch, semua situs web yang ada harus agar masalah kompatibilitas hilang.
Tidak bisakah orang cukup memperbarui salinan MooTools mereka?
Sebenarnya, MooTools akan merilis {i>patch<i}, dan setiap {i>website<i} menggunakan MooTools secara ajaib akan diperbarui pada hari berikutnya. Masalah terpecahkan, Benar kan?!
Sayangnya, ini tidak realistis. Bahkan jika seseorang entah bagaimana mengidentifikasi seluruh situs web yang terpengaruh, mengelola menemukan informasi kontak untuk satu per satu, berhasil menghubungi semua pemilik situs web, dan meyakinkan mereka semua untuk melakukan pembaruan (yang mungkin berarti seluruh code base mereka), seluruh prosesnya akan memakan waktu bertahun-tahun, paling baik.
Perlu diingat bahwa banyak dari situs web ini sudah usang dan kemungkinan tidak terawat. Meskipun pengelola masih ada, mungkin mereka bukan yang sangat ahli seperti Anda. Kami tidak mengharapkan semua orang pergi dan mengubah situs web mereka yang berusia 8 tahun karena masalah kompatibilitas web.
Bagaimana cara kerja proses TC39?
TC39 adalah komite yang bertanggung jawab mengembangkan bahasa JavaScript melalui standar ECMAScript.
#SmooshGate membuat beberapa orang percaya bahwa “TC39 ingin mengganti nama flatten
menjadi
smoosh
”, tetapi hanya sebagai lelucon yang tidak dikomunikasikan dengan baik kepada pihak eksternal.
Keputusan besar seperti mengganti nama proposal tidak dianggap enteng, tidak diambil
oleh satu orang, dan jelas tidak diambil dalam semalam berdasarkan satu
Komentar GitHub.
TC39 beroperasi pada proses staging yang jelas untuk proposal fitur.
Proposal ECMAScript dan perubahan besar apa pun padanya (termasuk metode
baru) dibahas selama rapat TC39, dan harus disetujui oleh
seluruh komite sebelum
mereka menjadi resmi. Dalam kasus
Array.prototype.flatten
, proposal telah melalui beberapa
perjanjian, hingga Tahap 3, yang menunjukkan bahwa fitur
siap untuk diimplementasikan di {i>browser <i}web. Spesifikasi tambahan ini sudah umum
masalah yang muncul
selama implementasi. Dalam hal ini, yang paling penting
masukan yang diberikan setelah mencoba mengirimkannya: fitur dalam kondisinya saat ini,
merusak Web. Masalah yang sulit diprediksi seperti ini
adalah salah satu alasan mengapa
proses TC39 tidak hanya berakhir setelah {i>browser<i} mengirimkan fitur.
TC39 beroperasi berdasarkan konsensus, yang berarti komite harus menyetujui setiap
perubahan. Meskipun smoosh
adalah saran yang serius, sepertinya
anggota komite akan keberatan
dengan menggunakan nama yang lebih umum seperti
compact
atau chain
.
Penggantian nama dari flatten
menjadi smoosh
(meskipun bukan lelucon)
tidak pernah dibahas dalam
pertemuan TC39. Dengan demikian, sikap TC39 resmi terhadap
topik ini saat ini tidak diketahui. Tidak ada satu orang pun yang dapat berbicara atas nama
seluruh TC39 sampai tercapai konsensus pada pertemuan berikutnya.
Rapat TC39 umumnya dihadiri oleh orang-orang dengan latar belakang beragam latar belakang: beberapa di antaranya memiliki pengalaman desain bahasa pemrograman, yang lain bekerja pada {i>browser<i} atau mesin JavaScript, dan semakin banyak ada untuk mewakili komunitas developer JavaScript.
Bagaimana pada akhirnya SmooshGate terselesaikan?
Selama rapat TC39 Mei 2018, #SmooshGate
diselesaikan secara resmi dengan mengganti nama flatten
menjadi flat
.
Array.prototype.flat
dan Array.prototype.flatMap
dikirim di V8 v6.9 dan
Chrome 69.