FAQ tentang SmooshGate

Apa yang terjadi smoosh?!

Proposal untuk fitur bahasa JavaScript yang disebut Array.prototype.flatten ternyata tidak kompatibel dengan Web. Mengirim fitur di Firefox Nightly menyebabkan setidaknya satu situs populer rusak. Mengingat kode yang bermasalah adalah bagian dari library MooTools yang tersebar luas, kemungkinan lebih banyak situs yang terpengaruh. (Meskipun MooTools tidak biasa digunakan untuk situs baru pada tahun 2018, MooTools sebelumnya sangat populer dan masih ada di banyak situs produksi.)

Penulis proposal dengan bercanda menyarankan untuk mengganti nama flatten menjadi smoosh untuk menghindari masalah kompatibilitas. Lelucon tidak jelas bagi semua orang, beberapa orang mulai salah percaya bahwa nama baru telah diputuskan, dan situasinya berubah dengan cepat.

Apa fungsi Array.prototype.flatten?

Array.prototype.flat, awalnya diusulkan sebagai Array.prototype.flatten, meratakan array secara rekursif hingga depth yang ditentukan, yang default-nya adalah 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 menyertakan Array.prototype.flatMap, yang seperti 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 */;

Penerapan flatten MooTools berbeda dengan standar yang diusulkan. Namun, hal ini bukanlah masalahnya. Saat browser mengirim Array.prototype.flatten secara native, MooTools akan mengganti implementasi native. 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 semua metode array kustomnya 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 menyertakan metode native seperti Array.prototype.sort, tetapi menyertakan properti yang ditetapkan secara rutin seperti Array.prototype.foo = whatever. Namun, dan inilah kalimat utamanya, jika Anda menimpa properti yang tidak dapat dihitung, misalnya Array.prototype.sort = whatever, properti 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 akan disalin ke Elements. Kode apa pun yang mengandalkan Elements.prototype.flatten MooTools kini rusak.

Meskipun tampaknya mengubah Array.prototype.flatten native menjadi enumerable akan memperbaiki masalah, hal ini kemungkinan akan menyebabkan lebih banyak masalah kompatibilitas. Setiap situs yang mengandalkan for-in untuk melakukan iterasi pada array (ini merupakan praktik yang buruk, tetapi terjadi) akan tiba-tiba mendapatkan iterasi loop tambahan untuk properti flatten.

Masalah pokok yang lebih besar di sini adalah memodifikasi objek bawaan. Memperluas prototipe native secara umum diterima sebagai praktik yang buruk saat ini, karena tidak dapat disusun dengan baik dengan library lain dan kode pihak ketiga. Jangan memodifikasi objek yang tidak Anda miliki!

Mengapa kita tidak menyimpan nama yang ada saja dan menghancurkan Web saja?

Pada tahun 1996, sebelum CSS menyebar luas, dan jauh sebelum “HTML5” menjadi populer, situs Space Jam mulai ditayangkan. Saat ini, situs web ini masih berfungsi seperti 22 tahun yang lalu.

Apa penyebabnya? Apakah seseorang mengelola 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 lainnya yang banyak digunakan di Web. Jika pengiriman fitur browser baru menyebabkan situs yang ada berhenti berfungsi, hal ini akan berdampak buruk bagi semua orang:

  • pengunjung situs web yang terpengaruh tiba-tiba mengalami pengalaman pengguna yang buruk;
  • pemilik {i>website<i} beralih dari memiliki situs web yang berfungsi sempurna menjadi situs web yang tidak berfungsi tanpa mereka mengubah apa pun;
  • vendor browser yang mengirimkan fitur baru kehilangan pangsa pasar, karena pengguna beralih browser setelah melihat “fitur ini berfungsi di browser X”;
  • setelah masalah kompatibilitas diketahui, vendor browser lain menolak untuk mengirimkannya. Spesifikasi fitur tidak sesuai dengan kenyataan (“tidak ada kecuali karya fiksi”), yang buruk untuk proses standardisasi.

Tentu saja, dalam retrospeksi, MooTools melakukan hal yang salah. Namun, merusak web tidak akan menghukum mereka, melainkan menghukum pengguna. Pengguna ini tidak tahu apa itu alat moo. Selain itu, kami dapat menemukan solusi lain, dan pengguna dapat terus menggunakan web. Pilihannya mudah dibuat.

Apakah itu berarti API yang buruk tidak akan dapat dihapus dari Platform Web?

Tergantung. Dalam kasus yang jarang terjadi, fitur buruk dapat dihapus dari Web. Bahkan hanya mencari tahu apakah mungkin untuk menghapus fitur adalah upaya yang sangat rumit, memerlukan telemetri yang ekstensif untuk mengukur berapa banyak halaman web yang perilakunya akan berubah. Namun, jika fitur tersebut cukup tidak aman, berbahaya bagi pengguna, atau sangat jarang digunakan, hal ini dapat dilakukan.

<applet>, <keygen>, dan showModalDialog() adalah contoh API buruk yang berhasil dihapus dari Platform Web.

Mengapa kita tidak memperbaiki MooTools saja?

Menambahkan patch pada MooTools agar tidak lagi memperluas objek bawaan adalah ide yang bagus. Namun, hal itu tidak menyelesaikan masalah saat ini. Meskipun MooTools merilis versi yang di-patch, semua situs yang ada yang menggunakannya harus diupdate agar masalah kompatibilitas dapat dihilangkan.

Tidak dapatkah pelanggan memperbarui salinan MooTools?

MooTools akan merilis patch, dan setiap situs yang menggunakan MooTools secara ajaib akan diupdate keesokan harinya. Masalahnya selesai, benar kan?!

Sayangnya, ini tidak realistis. Meskipun seseorang entah bagaimana mengidentifikasi kumpulan lengkap situs yang terpengaruh, berhasil menemukan informasi kontak untuk masing-masing situs, berhasil menghubungi semua pemilik situs, dan meyakinkan mereka semua untuk melakukan pembaruan (yang mungkin berarti memfaktorkan ulang seluruh code base mereka), keseluruhan proses akan memakan waktu bertahun-tahun.

Perlu diingat bahwa banyak dari situs-situs ini telah lama dan kemungkinan tidak terawat. Meskipun pengelolanya masih ada, mungkin mereka bukan pengembang web yang sangat terampil seperti Anda. Kami tidak bisa berharap 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 lelucon tersebut tidak dikomunikasikan dengan baik secara eksternal. Keputusan besar seperti mengganti nama proposal tidak dianggap sepele, tidak diambil oleh satu orang, dan pasti tidak diambil dalam semalam berdasarkan satu komentar GitHub.

TC39 beroperasi pada proses staging yang jelas untuk proposal fitur. Proposal ECMAScript dan segala perubahan besar pada proposal tersebut (termasuk penggantian nama metode) dibahas dalam pertemuan TC39 dan perlu disetujui oleh seluruh komite sebelum menjadi resmi. Dalam kasus Array.prototype.flatten, proposal telah melewati beberapa tahap kesepakatan, hingga Tahap 3, yang menunjukkan bahwa fitur tersebut siap diterapkan di browser Web. Masalah spesifikasi tambahan biasanya muncul saat implementasi. Dalam kasus ini, masukan yang paling penting diterima setelah mencoba mengirimkannya: fitur, dalam kondisinya saat ini, merusak Web. Masalah yang sulit diprediksi seperti ini adalah bagian dari alasan mengapa proses TC39 tidak begitu saja berakhir setelah browser mengirimkan fitur.

TC39 beroperasi berdasarkan konsensus, yang berarti komite harus menyetujui setiap perubahan baru. Meskipun smoosh merupakan saran serius, kemungkinan anggota komite akan menolak saran tersebut demi nama yang lebih umum seperti compact atau chain.

Penggantian nama dari flatten menjadi smoosh (meskipun bukan lelucon) belum pernah dibahas dalam rapat TC39. Oleh karena itu, pendirian resmi TC39 mengenai topik ini saat ini belum diketahui. Tidak ada satu orang pun yang dapat berbicara atas nama seluruh TC39 hingga konsensus tercapai pada pertemuan berikutnya.

Rapat TC39 umumnya dihadiri oleh orang-orang dengan latar belakang yang sangat beragam: beberapa di antaranya memiliki pengalaman desain bahasa pemrograman bertahun-tahun, yang lainnya bekerja di browser atau mesin JavaScript, dan jumlah peserta yang lebih banyak mewakili komunitas developer JavaScript.

Bagaimana SmooshGate pada akhirnya diselesaikan?

Selama pertemuan TC39 Mei 2018, #SmooshGate secara resmi diselesaikan dengan mengganti nama flatten menjadi flat.

Array.prototype.flat dan Array.prototype.flatMap dikirimkan dalam V8 v6.9 dan Chrome 69.