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

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

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

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

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

แผงปัญหาเกี่ยวกับ 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) ดูข้อมูลเพิ่มเติมเกี่ยวกับช่วงทดลองใช้การเลิกใช้งานได้ที่เริ่มต้นใช้งานช่วงทดลองใช้จากต้นทาง
  • [ เสร็จสิ้น] การเข้าถึง 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

นอกจากนี้ SQL ในเว็บยังเป็น API ที่แสดงอายุด้วย เนื่องจากเป็นเด็กในช่วงปลายทศวรรษที่ 2000 ตัวอย่างนี้เป็นตัวอย่างที่ดีของ "นรกเรียกกลับ" ดังที่เห็นได้จากตัวอย่างโค้ดต่อไปนี้ (ด้วยความเอื้อเฟื้อจาก Nolan Lawson) อย่างที่คุณเห็น คำสั่ง SQL (ที่ใช้ภาษา SQL ของ 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 DevTools จะแสดงฐานข้อมูลชื่อ mydatabase พร้อมตารางชื่อพายุฝนที่มีอารมณ์แบบคอลัมน์ (แบบข้อความ) และความรุนแรง (จำนวนเต็ม) โดยมีรายการเดียวที่มีอารมณ์มืดมนและมีความรุนแรงอยู่ที่ 6

ขาดการสนับสนุนจากผู้ติดตั้งใช้งาน

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

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

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

ความคิดเห็น

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

กิตติกรรมประกาศ

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