Menghentikan penggunaan dan menghapus Web SQL

Web SQL Database API, yang memungkinkan Anda menyimpan data secara terstruktur di komputer pengguna (secara internal berdasarkan mesin database SQLite), diperkenalkan pada April 2009 dan diabaikan pada November 2010. Meskipun diimplementasikan di WebKit (yang mendukung Safari) dan tetap aktif di mesin Blink (yang mendukung Chrome), Gecko (yang mendukung Firefox) tidak pernah menerapkan fitur ini dan WebKit menghapusnya pada tahun 2019.

World Wide Web Consortium (W3C) menyarankan mereka yang membutuhkan database web untuk mengadopsi teknologi Web Storage API seperti localStorage dan sessionStorage, atau IndexedDB. Teknologi ini menunjukkan kekuatannya dalam hal penyimpanan kunci/nilai dan data terstruktur, tetapi nyatanya juga memiliki kelemahan seperti kurangnya bahasa kueri yang kuat. Orang-orang menginginkan SQL di web karena suatu alasan.

Langkah-langkah penghapusan dan penghentian penggunaan SQL Web

  • [ Selesai.] Web SQL tidak digunakan lagi dan dihapus untuk konteks pihak ketiga di Chromium 97 ( 4 Januari 2022).
  • [ Selesai.] Akses Web SQL dalam konteks yang tidak aman tidak digunakan lagi mulai Chromium 105 ( 4 Januari 2022) saat pesan peringatan ditampilkan di panel Masalah Chrome DevTools.

Panel Masalah Chrome DevTools dengan peringatan yang membaca Web SQL dalam konteks yang tidak aman tidak digunakan lagi.

  • [ Selesai.] Akses SQL Web dalam konteks yang tidak aman tidak lagi tersedia mulai Chromium 110 ( 4 Januari 2022). Kebijakan perusahaan agar tetap dapat menggunakan fitur ini tersedia mulai dari Chromium 110 ( 4 Januari 2022) hingga Chromium 123 ( 4 Januari 2022).
  • [ Selesai.] Akses Web SQL di semua konteks tidak digunakan lagi mulai Chromium 115 ( 4 Januari 2022) dan pesan peringatan ditampilkan di panel Masalah Chrome DevTools.
  • [ Selesai.] Uji coba penghentian penggunaan untuk tetap menggunakan Web SQL tersedia dari Chromium 117 ( 4 Januari 2022) hingga Chromium 123 ( 4 Januari 2022). Untuk mempelajari uji coba penghentian penggunaan lebih lanjut, lihat Memulai uji coba origin.
  • [ Selesai.] Akses SQL Web di semua konteks tidak lagi tersedia dari Chromium 119.

Langkah berikutnya

Seperti yang ditunjukkan dalam pengantar, teknologi Web Storage API seperti localStorage dan sessionStorage, atau standar IndexedDB adalah alternatif yang bagus dalam banyak kasus, tetapi sejauh ini tidak semua kasus.

Alasan menyerahkan penyimpanan kepada developer web

Dengan hadirnya solusi Wasm, SQL atau NoSQL dapat hadir di web. Salah satu contohnya adalah DuckDB-Wasm, contoh lainnya adalah absurd-sql. Berdasarkan kreasi ini, kami merasa bahwa komunitas developer dapat melakukan iterasi dan membuat solusi penyimpanan baru dengan lebih cepat dan lebih baik daripada vendor browser.

Kita tidak berencana menghapus Web SQL. Bahkan, kami menggantinya dengan sesuatu yang akan dikelola oleh komunitas open source, yang berfungsi sebagai paket yang dapat diupdate sesuai keinginan—tanpa beban untuk memperkenalkan perbaikan dan fitur baru secara langsung ke browser. Tujuan kami sebenarnya adalah membiarkan pengembang membawa database mereka sendiri ke web.

Terlebih lagi, kami berharap contoh ini akan membantu ekosistem baru database open source berkembang. Rilis penangan akses sistem file akhirnya menyediakan primitif baru yang dapat digunakan untuk membangun solusi penyimpanan kustom.

Alasan penghentian penggunaan Web SQL

Masalah keberlanjutan dan keamanan

Spesifikasi Web SQL tidak dapat diterapkan secara berkelanjutan, sehingga membatasi inovasi dan fitur baru. Versi terakhir standar ini secara harfiah menyatakan "Agen pengguna harus mengimplementasikan dialek SQL yang didukung oleh Sqlite 3.6.19".

SQLite awalnya tidak dirancang untuk menjalankan pernyataan SQL berbahaya, tetapi menerapkan Web SQL berarti browser harus melakukan hal ini. Kebutuhan untuk mengikuti perbaikan keamanan dan stabilitas menentukan update SQLite di Chromium. Hal ini bertentangan langsung dengan persyaratan Web SQL untuk berperilaku sama persis seperti SQLite 3.6.19.

Bentuk API

Web SQL juga merupakan API yang menunjukkan usianya. Sebagai turunan dari akhir 2000-an, ini adalah contoh yang bagus dari "callback hell", seperti yang ditunjukkan oleh contoh kode berikut (courtesy of Nolan Lawson). Seperti yang dapat Anda lihat, pernyataan SQL (menggunakan dialek SQL SQLite) diteruskan sebagai string ke metode database.

openDatabase(
  // Name
  'mydatabase',
  // Version
  1,
  // Display name
  'mydatabase',
  // Estimated size
  5000000,
  // Creation callback
  function (db) {
    db.transaction(
      // Transaction callback
      function (tx) {
        // Execute SQL statement
        tx.executeSql(
          // SQL statement
          'create table rainstorms (mood text, severity int)',
          // Arguments
          [],
          // Success callback
          function () {
            // Execute SQL statement
            tx.executeSql(
              // SQL statement
              'insert into rainstorms values (?, ?)',
              // Arguments
              ['somber', 6],
              // Success callback
              function () {
                // Execute SQL statement
                tx.executeSql(
                  // SQL statement
                  'select * from rainstorms where mood = ?',
                  // Arguments
                  ['somber'],
                  // Success callback
                  function (tx, res) {
                    // Do something with the result
                    var row = res.rows.item(0);
                    console.log(
                      'rainstorm severity: ' +
                        row.severity +
                        ',  my mood: ' +
                        row.mood,
                    );
                  },
                );
              },
            );
          },
        );
      },
      // Error callback
      function (err) {
        console.log('Transaction failed!: ' + err);
      },
      // Success callback);
      function () {
        console.log('Transaction succeeded!');
      },
    );
  },
);

Jika Anda menjalankan kode ini dan memeriksa tabel yang dibuat dengan Chrome DevTools, inilah hasilnya:

Memeriksa bagian Web SQL di Chrome DevTools menunjukkan {i>database<i} bernama mydatabase yang berisi tabel yang disebut {i>rainstorms<i} dengan kolom mood (texttual) dan tingkat keparahan (integer) yang memiliki satu entri dengan mood yang suram dan tingkat keparahannya enam.

Kurangnya dukungan pelaksana

Selain bentuk API misterius (setidaknya dari sudut pandang saat ini), Mozilla memiliki banyak kekhawatiran tentang Web SQL yang dibangun di atas SQLite:

"Menurut kami, [SQLite] bukanlah dasar yang tepat untuk API yang diekspos ke konten web umum, dan tidak kalah penting, karena tidak ada standar kredibel yang diterima secara luas yang mengelompokkan SQL dengan cara yang berguna. Selain itu, kami tidak ingin perubahan pada SQLite memengaruhi web di kemudian hari, dan penggunaan rilis browser utama (dan standar web) untuk SQLite bukanlah tindakan yang tepat."

Anda dapat membaca tentang kekhawatiran Mozilla di postingan blog mantan Mozillan Vladimir Vukiçevi mengubah. Untuk mengetahui sejarah lainnya, lihat menit W3C Web Applications Working Group (dan, jika Anda benar-benar ingin mengetahui detailnya, baca Log IRC) dan arsip milis). Selain itu, postingan blog Nolan Lawson memberikan ringkasan yang bagus tentang apa yang terjadi.

Masukan

Jika ada masalah tentang langkah-langkah penghentian penggunaan yang disampaikan dalam postingan ini, beri tahu kami di milis blink-dev. Keanggotaan dalam grup ini terbuka untuk siapa saja dan siapa saja diizinkan untuk memposting.

Ucapan terima kasih

Artikel ini ditinjau oleh Joe Medley, Ben Morss, dan Joshua Bell.