弃用并移除 Web SQL

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

万维网联盟 (W3C) 鼓励需要 Web 数据库的开发者采用 localStoragesessionStorageIndexedDBWeb Storage API 技术。这些技术在键值对存储和结构化数据方面展示了它们的优势,但可以肯定地说,它们也存在一些弱点,例如缺乏强有力的查询语言。人们希望在 Web 上使用 SQL,是有原因的。

Web SQL 弃用和移除步骤

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

Chrome 开发者工具的“Issues”面板已被弃用,其中包含一条警告“在非安全上下文中读取 Web SQL”的警告。

  • [ 完成。]自 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。如需详细了解弃用试用,请参阅源试用使用入门
  • [ 完成。]从 Chromium 119 开始,您将无法再在所有上下文中访问 Web SQL。

后续步骤

如简介中所述,Web Storage API 技术(如 localStoragesessionStorageIndexedDB 标准)在许多情况下都是很好的替代方案,但目前为止,并非全部。

将存储空间留给 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 世纪末的孩子,它是一个很好的“回调地狱”示例,如以下代码示例(由 Nolan Lawson 提供)演示的。如您所见,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”的表,该表包含“imity”(文本)和“severity”(整数)列,其中有一个条目表示情绪低落,严重级别为“6”。

缺少实施人员支持

除了神秘的 API 形状(至少从目前的角度来看),Mozilla 还对基于 SQLite 构建的 Web SQL 持有许多顾虑

“我们认为 [SQLite] 不是向一般 Web 内容公开的 API 的正确基础,最重要的是,因为没有一个可靠且广泛接受的标准来以实用方式对 SQL 进行子集内嵌。此外,我们不希望对 SQLite 所做的更改日后影响网络,并且认为将主要浏览器版本(和网络标准)引入 SQLite 并不明智。”

您可以阅读前 Mozillan Vladimir Vukichiceviically 的博文了解 Mozilla 的顾虑。如需了解更多历史记录,请查看 W3C Web 应用工作组会议分钟数(如果您确实想要了解详情,请参阅 IRC 日志)和邮寄名单归档。此外,Nolan Lawson 的博文简要介绍了所发生的情况。

反馈

如果您对本博文中提到的弃用步骤有任何疑虑,请通过 blink-dev 邮寄名单告诉我们。此群组的成员资格向所有人开放,并且任何人都可以在此论坛发帖。

致谢

本文由 Joe MedleyBen MorssJoshua Bell 审核。