การเลิกใช้และการนำ Web SQL ออก

Web SQL Database API ซึ่งช่วยให้คุณเก็บข้อมูลในลักษณะที่มีโครงสร้างในคอมพิวเตอร์ของผู้ใช้ (ภายในจะอิงตามเครื่องมือฐานข้อมูล SQLite) ได้เปิดตัวในเดือนเมษายน 2009 และหยุดให้บริการในเดือนพฤศจิกายน 2010 แม้ว่าจะมีการใช้งานใน WebKit (ซึ่งเป็นขุมพลังของ Safari) และยังคงทำงานอยู่ในเครื่องมือกลไก Blink (ซึ่งเป็นขุมพลังของ Chrome) แต่ Gecko (ซึ่งเป็นขุมพลังของ Firefox) ไม่เคยใช้งานฟีเจอร์นี้ และ WebKit ได้นําฟีเจอร์นี้ออกในปี 2019

World Wide Web Consortium (W3C) ขอแนะนำ ผู้ที่ต้องการให้ฐานข้อมูลเว็บนำเทคโนโลยี Web Storage API อย่าง localStorage และ sessionStorage หรือ IndexedDB ไปปรับใช้ เทคโนโลยีเหล่านี้แสดงจุดแข็งเมื่อพูดถึงที่เก็บคีย์/ค่าและ Structured Data แต่ก็มีข้ออ่อนแอด้วยเช่นกัน เช่น ไม่มีภาษาการค้นหาที่มีประสิทธิภาพ ผู้คนต้องการใช้ SQL บนเว็บด้วยเหตุผล

ขั้นตอนการเลิกใช้งานและนํา SQL ในเว็บออก

  • [ เสร็จแล้ว] เราได้เลิกใช้งานและนํา WebSQL ออกจากบริบทของบุคคลที่สามใน Chromium 97 ( 4 มกราคม 2022)
  • [ เสร็จแล้ว] เราเลิกใช้งานการเข้าถึง Web SQL ในบริบทที่ไม่ปลอดภัยแล้วใน Chromium 105 ( 4 มกราคม 2022) ซึ่งข้อความเตือนจะแสดงในแผงปัญหาของเครื่องมือสําหรับนักพัฒนาเว็บใน Chrome

แผงปัญหาเกี่ยวกับ Chrome DevTools ที่มีคำเตือนที่อ่าน SQL ในเว็บในบริบทที่ไม่ปลอดภัยเลิกใช้งานแล้ว

  • [ เสร็จแล้ว] การเข้าถึง Web SQL ในบริบทที่ไม่ปลอดภัยจะใช้งานไม่ได้อีกต่อไปใน Chromium 110 ( 4 มกราคม 2022) นโยบายองค์กรสำหรับใช้ฟีเจอร์นี้ต่อไปใช้ได้ใน Chromium 110 ( 4 มกราคม 2022) ถึง Chromium 123 ( 4 มกราคม 2022)
  • [ เสร็จแล้ว] การเข้าถึง Web SQL ในบริบททั้งหมดเลิกใช้งานแล้วตั้งแต่ Chromium 115 ( 4 มกราคม 2022) และข้อความเตือนจะแสดงในแผงปัญหา Chrome DevTools
  • [ เสร็จแล้ว] ช่วงทดลองการเลิกใช้งานเพื่อใช้ Web SQL ต่อไปมีให้บริการตั้งแต่ Chromium 117 ( 4 มกราคม 2022) ถึง Chromium 123 ( 4 มกราคม 2022) ดูข้อมูลเพิ่มเติมเกี่ยวกับการทดลองเลิกใช้งานได้ที่หัวข้อเริ่มต้นใช้งานการทดลองใช้แหล่งที่มา
  • [ เสร็จแล้ว] การเข้าถึง Web SQL ในบริบททั้งหมดจะใช้ไม่ได้อีกต่อไปตั้งแต่ Chromium 119

ขั้นตอนถัดไป

ตามที่กล่าวไปก่อนหน้านี้ เทคโนโลยี Web Storage API อย่าง localStorage และ sessionStorage หรือมาตรฐาน IndexedDB เป็นทางเลือกที่ดีในหลายๆ กรณี แต่ก็ไม่ใช่ทุกกรณีไป

เหตุผลที่ปล่อยให้นักพัฒนาเว็บจัดการพื้นที่เก็บข้อมูล

เมื่อมี Wasm โซลูชัน SQL หรือ NoSQL ก็จะเข้ามาอยู่ในเว็บได้ ตัวอย่างหนึ่งคือ DuckDB-Wasm อีกตัวอย่างหนึ่งคือ absurd-sql เราเชื่อว่าชุมชนนักพัฒนาแอปสามารถสร้างโซลูชันพื้นที่เก็บข้อมูลใหม่ได้เร็วและดีกว่าผู้ให้บริการเบราว์เซอร์

เราไม่ได้วางแผนที่จะนำ SQL ในเว็บออกเพียงอย่างเดียว ความจริงแล้ว เราแทนที่เครื่องมือดังกล่าวด้วยเครื่องมือที่ชุมชนโอเพนซอร์สจะเป็นผู้ดูแล ซึ่งให้บริการเป็นแพ็กเกจที่อัปเดตได้ตามต้องการโดยไม่ต้องแบกภาระในการเปิดตัวการแก้ไขและฟีเจอร์ใหม่ในเบราว์เซอร์โดยตรง วัตถุประสงค์ของเราคือการช่วยให้นักพัฒนาแอปนำฐานข้อมูลของตนเองมาใช้ในเว็บได้

นอกจากนี้ เราหวังว่าตัวอย่างนี้จะช่วยให้ระบบนิเวศใหม่ของฐานข้อมูลโอเพนซอร์สเติบโตขึ้น การเปิดตัวแฮนเดิลการเข้าถึงระบบไฟล์ในที่สุดก็ทำให้เรามีองค์ประกอบพื้นฐานใหม่สำหรับสร้างโซลูชันพื้นที่เก็บข้อมูลที่กำหนดเอง

เหตุผลในการเลิกใช้งาน SQL ในเว็บ

ข้อกังวลด้านความยั่งยืนและความปลอดภัย

คุณต้องไม่นำข้อกำหนด Web SQL มาใช้อย่างยั่งยืน ซึ่งจะจำกัดนวัตกรรมและฟีเจอร์ใหม่ๆ มาตรฐานเวอร์ชันล่าสุดระบุว่า "User Agent ต้องใช้รูปแบบ SQL ที่ Sqlite 3.6.19 รองรับ"

เดิมที SQLite ไม่ได้ออกแบบมาเพื่อเรียกใช้คำสั่ง SQL ที่เป็นอันตราย แต่การใช้ Web SQL หมายความว่าเบราว์เซอร์ต้องทำเช่นนี้ ความจำเป็นในการอัปเดต SQLite ใน Chromium นั้นมาจากความต้องการที่จะติดตามการแก้ไขด้านความปลอดภัยและความเสถียร ซึ่งขัดแย้งโดยตรงกับข้อกําหนดของ Web SQL ว่าต้องทํางานเหมือนกับ SQLite 3.6.19 ทุกประการ

รูปแบบ API

Web SQL เป็น API ที่แสดงอายุด้วย โค้ดนี้มาจากช่วงปลายยุค 2000 และเป็นตัวอย่างที่ยอดเยี่ยมของ "นรกของคอลแบ็ก" ดังที่ตัวอย่างโค้ดต่อไปนี้ (ได้รับความอนุเคราะห์จาก Nolan Lawson) แสดงให้เห็น ดังที่คุณเห็น คำสั่ง SQL (โดยใช้ SQL Dialect ของ SQLite) จะส่งเป็นสตริงไปยังเมธอดฐานข้อมูล

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!');
      },
    );
  },
);

หากคุณเรียกใช้โค้ดนี้และตรวจสอบตารางที่สร้างด้วยเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome ผลลัพธ์ที่ได้จะเป็นดังนี้

การตรวจสอบส่วน Web SQL ในเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome แสดงฐานข้อมูลชื่อ mydatabase ที่มีตารางชื่อ rainstorms ที่มีคอลัมน์อารมณ์ (ข้อความ) และความรุนแรง (จำนวนเต็ม) ซึ่งมีรายการเดียวที่มีอารมณ์ "เศร้าหมอง" และความรุนแรง 6

ไม่มีการสนับสนุนผู้ติดตั้งใช้งาน

นอกจากรูปร่าง API แบบ Arcane (อย่างน้อยก็จากมุมมองของวันนี้) แล้ว Mozilla ยังมีข้อกังวลมากมายเกี่ยวกับ Web SQL ที่สร้างขึ้นด้วย SQLite ดังนี้

"เราไม่คิดว่า [SQLite] เป็นพื้นฐานที่เหมาะสมสําหรับ API ที่แสดงต่อเนื้อหาเว็บทั่วไป สาเหตุสำคัญคือไม่มีมาตรฐานที่เชื่อถือได้และยอมรับกันอย่างกว้างขวางซึ่งใช้เป็นส่วนหนึ่งของ SQL ในลักษณะที่เป็นประโยชน์ นอกจากนี้ เรายังไม่ต้องการให้การเปลี่ยนแปลง SQLite ส่งผลต่อเว็บในภายหลัง และคิดว่าการใช้ประโยชน์จากรุ่นเบราว์เซอร์หลัก (และมาตรฐานเว็บ) กับ SQLite นั้นไม่รอบคอบ"

คุณสามารถอ่านเกี่ยวกับข้อกังวลของ Mozilla ได้ในบล็อกโพสต์ของ Vladimir Vukićević อดีตพนักงาน Mozilla ดูประวัติเพิ่มเติมได้ในบันทึกการประชุมของกลุ่มทํางานแอปพลิเคชันเว็บ W3C (และหากต้องการดูรายละเอียดจริงๆ โปรดอ่านบันทึก IRC) และที่เก็บอีเมล) นอกจากนี้ บล็อกโพสต์ของ Nolan Lawson ยังให้ภาพรวมที่ดีเกี่ยวกับสิ่งที่เกิดขึ้น

ความคิดเห็น

หากมีข้อกังวลใดๆ เกี่ยวกับขั้นตอนการเลิกใช้งานที่แจ้งไว้ในโพสต์นี้ โปรดแจ้งให้เราทราบในรายชื่ออีเมล blink-dev ทุกคนสามารถเป็นสมาชิกในกลุ่มนี้ได้และทุกคนมีสิทธิ์โพสต์

ขอขอบคุณ

บทความนี้ได้รับการตรวจสอบโดย Joe Medley และ Ben Morss และ Joshua Bell