弃用并移除 Web SQL

借助 Web SQL Database API,您能够以结构化方式在用户计算机上存储数据(在内部基于 SQLite 数据库引擎),该 API 于 2009 年 4 月推出于 2010 年 11 月弃用。虽然 Gecko 在 WebKit(为 Safari 提供支持)中实现并在 Blink 引擎(为 Chrome 提供支持)中保持活跃状态,但 Gecko(为 Firefox 提供支持)从未实现过此功能,并且 WebKit 已于 2019 年将其移除

万维网联盟 (W3C) 建议需要 Web 数据库的用户采用 Web Storage API 技术,例如 localStoragesessionStorageIndexedDB。这些技术在键值对存储和结构化数据方面展现出其优势,但公认也有缺点,例如缺少强有力的查询语言。人们想在网络上使用 SQL 是有原因的。

Web SQL 弃用和移除步骤

  • [ 已完成。]在 Chromium 97 中,第三方上下文已弃用并移除了 Web SQL(2022 年 1 月 4 日)。
  • [ 已完成。]自 Chromium 105(2022 年 1 月 4 日)起,不安全情境中的 Web SQL 访问已被弃用,当时 Chrome 开发者工具的“问题”面板中会显示警告消息。

Chrome 开发者工具的“Issues”面板已被弃用,并在面板中显示“Web SQL in non-安全上下文”警告。

  • [ 已完成。]从 Chromium 110(2022 年 1 月 4 日)起,不再支持在不安全情境中进行 Web SQL 访问。请参阅 Chromium 110(2022 年 1 月 4 日)至 Chromium 123(2022 年 1 月 4 日)的企业政策,以便继续使用该功能。
  • [ 已完成。]自 Chromium 115 版(2022 年 1 月 4 日)起,所有情境中的 Web SQL 访问权限已被弃用,并且 Chrome 开发者工具“问题”面板中会显示警告消息。
  • [ 我们在这儿。]从 Chromium 117(2022 年 1 月 4 日)到 Chromium 123(2022 年 1 月 4 日),您可以进行弃用试用以继续使用 Web SQL。如需详细了解弃用试用,请参阅源试用使用入门

后续步骤

正如简介中所述,localStoragesessionStorageWeb Storage API 技术或 IndexedDB 标准在许多(但不是所有情形)中都是不错的替代方法。

将存储空间留给 Web 开发者的理由

随着 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。作为 21 世纪末的孩子,它就是“回调地狱”的一个很好的例子,如以下代码示例(由诺兰·劳森提供)所示。如您所见,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 DevTools 中检查“Web SQL”部分会显示一个名为 mydatabase 的数据库,其中包含一个名为“rainstorms”的表格,其中列包含“mouses”(文本)和“severity”(整数),其中有一个条目的情绪为忧郁,严重程度为“6”。

缺乏实施人员支持

除了神秘的 API 结构(至少从今天的角度来看)之外,Mozilla 对基于 SQLite 构建 Web SQL 还存在许多顾虑

“我们认为 [SQLite] 不是提供给一般 Web 内容的 API 的正确基础,更重要的是,没有一个可信且被广泛接受的标准能够以有用的方式对 SQL 进行子集内嵌。此外,我们不希望对 SQLite 所做的更改以后影响 Web,也不认为利用主要浏览器版本(和 Web 标准)使用 SQLite 是明智的做法。”

如需了解 Mozilla 的担忧,请参阅前 Mozillan Vladimir Vuki 发送到维基维奇的博文。如需更多历史记录,请查看 W3C Web 应用工作组会议(如果您确实想了解详情,请参阅 IRC 日志)和邮寄名单归档。此外,Nolan Lawson 的博文对发生的情况做了很好的概述。

反馈

如果您对这篇博文中所介绍的弃用步骤有任何疑虑,请通过 blink-dev 邮寄名单告知我们。此群组的成员资格对所有人开放,并且任何人都可以发帖。

致谢

本文由 Joe MedleyBen MorssJoshua Bell 审核。