淘汰及移除網路 SQL

Web SQL Database API 已於 2009 年 4 月推出,並於 2010 年 11 月遭到捨棄,可讓您以結構化方式將資料儲存在使用者的電腦上 (內部以 SQLite 資料庫引擎為基礎)。雖然這項工具是在 WebKit (可支援 Safari) 中實現的,而且還在 Blink 引擎 (用於 Chrome 的 Blink 引擎) 中保持活躍,但 Gecko (為 Firefox 提供支援) 從未實作這項功能,且 WebKit 在 2019 年就移除

全球資訊網協會 (W3C) 鼓勵需要網路資料庫採用 Web Storage API 技術 (例如 localStoragesessionStorageIndexedDB)。這些技術在鍵/值存放區和結構化資料方面都展現出優勢,但肯定也有一些缺點,例如缺少高強度的查詢語言。使用者之所以想在網路上使用 SQL 是有原因的,

Web SQL 淘汰和移除步驟

  • [ 完成。]Web SQL 已遭 Chromium 97 (2022 年 1 月 4 日) 淘汰並移除,以便用於第三方環境
  • [ 完成。]Web SQL 存取權的不安全內容已於 Chromium 105 (2022 年 1 月 4 日) 中淘汰,但警告面板顯示於 2022 年 1 月 4 日 4 月 4 日。問題面板會顯示警告訊息。

Chrome 開發人員工具面板顯示警告,指出在不安全的環境中讀取 Web SQL 的警告訊息。

  • [ 完成。]自 Chromium 110 (2022 年 1 月 4 日) 起,我們不再支援在不安全環境中使用 Web SQL 存取功能。如要繼續使用這項功能的企業政策,請在 Chromium 110 (2022 年 1 月 4 日) 至 Chromium 123 之間 (2022 年 1 月 4 日) 提供。
  • [ 完成。]自 Chromium 115 (2022 年 1 月 4 日) 起,網路 SQL 存取權已遭淘汰,且 Chrome 開發人員工具問題面板會顯示警告訊息。
  • [ 我們在這裡。]為了繼續使用 Web SQL,您將從 Chromium 117 開始淘汰試用方案 (2022 年 1 月 4 日) 至 Chromium 123 (2022 年 1 月 4 日)。如要進一步瞭解淘汰試用功能,請參閱「開始使用來源試用」。

下一步該做什麼?

如先前所述,localStoragesessionStorageWeb Storage API 技術或 IndexedDB 標準等是許多不錯的替代方案,但目前並非所有情況。

為網頁程式開發人員保留儲存空間的理由

隨著 Wasm 的問世,SQL 或 NoSQL 解決方案將能成為網路領域。其中一個範例是 DuckDB-Wasm,另一個是 absurd-sql。以這些作品為基礎,我們認為開發人員社群能夠疊代並開發新的儲存空間解決方案,速度比瀏覽器廠商更快、更優質。

我們不只打算移除 Web SQL。事實上,我們將其替換為由開放原始碼社群維護的某些功能,並以套件形式持續更新,而不會為瀏覽器導入修正項目和新功能的負擔。我們的目標是讓開發人員 將自己的資料庫移植到網路

更棒的是,本範例將協助新的開放原始碼資料庫生態系統蓬勃發展!檔案系統存取控點最終提供了可建構自訂儲存空間解決方案的新基本功能。

淘汰 Web SQL 的原因

永續發展和安全性疑慮

Web SQL 規格無法持續實作,這會限制創新與新功能。標準的最終版本就是狀態:「使用者代理程式必須實作 Sqlite 3.6.19 支援的 SQL 方言」

SQLite 最初並非為了執行惡意 SQL 陳述式而設計,但實作 Web SQL 意味著瀏覽器必須完成這項工作。Chromium 中的 SQLite 會影響更新速度,安全性和穩定性修正也會受到影響。這與 Web SQL 的要求行為與 SQLite 3.6.19 完全相同,有直接衝突。

API 類型

Web SQL 也是能顯示其年齡的 API。做為 2000 年代末期的子項,「callback hell」是一個很好的範例,請參閱下列程式碼樣本 (諾蘭勞生的法院)。如您所見,SQL 陳述式 (使用 SQLite SQL 方言) 會以字串的形式傳遞到資料庫方法。

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 開發人員工具檢查已建立的資料表,並使用 Chrome 開發人員工具檢查已建立的資料表,結果如下:

檢查 Chrome 開發人員工具的「Web SQL」部分時,會顯示一個名為「mydatabase」的資料庫,其中有一個名為「rainrains」的表格,資料欄心情 (文字) 和嚴重性 (整數) 有一個項目,心情為豆豆,嚴重性為六。

缺少實作工具支援

除了弧形 API 形狀 (至少與今日的觀點不同),Mozilla 也對於以 SQLite 建構的 Web SQL 有許多疑慮

「我們認為 [SQLite] 不應是公開一般網路內容的 API 的正確基礎,因為缺少可信且廣泛接受的標準,所以使用 SQL 分類都很有用。此外,我們不希望對 SQLite 的變更影響日後影響網路體驗,也不認為將主要瀏覽器版本 (和網路標準) 用於 SQLite。"

如要進一步瞭解 Mozilla 的疑慮,請參閱 Mozillan Vladimir Vukiicheviich 的網誌文章。如需更多歷史記錄,請參閱 W3C 網頁應用程式工作群組分鐘數 (如果您真的想瞭解詳情,請參閱 IRC 記錄) 和郵寄清單封存檔。此外,Nolan Lawson 的網誌文章詳細說明瞭狀況,

意見回饋:

如果您對本文所述的淘汰步驟有任何任何疑慮,請透過 blink-dev 郵寄清單告訴我們。此群組中的成員可以加入此群組,所有成員都可以張貼訊息。

特別銘謝

本文由 Joe MedleyBen MorssJoshua Bell 審查。