弃用并移除 Web SQL

Web SQL Database API: 以结构化方式将数据存储在用户的计算机上( SQLite 数据库引擎) 于 2009 年 4 月推出已于 2010 年 11 月弃用。 虽然它在 WebKit(为 Safari 提供支持)中实施,并在 Blink 引擎(为 Chrome 提供支持)、Gecko(为 Firefox 提供支持)从未 实现了此功能 WebKit 已于 2019 年将其移除

万维网联盟 (W3C) 鼓励 需要 Web 数据库 Web Storage API 技术,例如 localStoragesessionStorage, 或 IndexedDB。 这些技术展现了它们在键/值存储和和 结构化数据,但确实也存在一些弱点,例如缺少 强查询语言人们希望在 Web 上使用 SQL,是有原因的。

Web SQL 弃用和移除步骤

  • [ 完成。]对于第三方上下文,Web SQL 已被弃用,并已移除 Chromium 97( 2022 年 1 月 4 日)。
  • [ 完成。]自以下版本起,不安全上下文中的 Web SQL 访问功能已被弃用 Chromium 105( 2022 年 1 月 4 日),届时您会收到警告消息 已在 Chrome DevTools 的“Issue”面板中显示。

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

  • [ 完成。]不再允许通过不安全上下文访问 Web SQL 自 Chromium 110( 2022 年 1 月 4 日)。一个 企业政策,以确保继续使用该功能 Chromium 110( 2022 年 1 月 4 日)至 Chromium 123 ( 2022 年 1 月 4 日)。
  • [ 完成。]自以下日期起,我们已弃用所有上下文中的 Web SQL 访问权限: Chromium 115( 2022 年 1 月 4 日)并会显示警告消息 。
  • [ 完成。]答 弃用试用至 “继续使用 Web SQL”功能(从 Chromium 117 开始提供) ( 2022 年 1 月 4 日)至 Chromium 123 ( 2022 年 1 月 4 日)。 如需详细了解弃用试用,请参阅 开始源试用
  • [ 完成。]不再支持在所有上下文中访问 Web SQL (从 Chromium 119 开始)。

后续步骤

正如简介部分所指出的 Web Storage API 技术,例如 localStoragesessionStorage, 或 IndexedDB 标准在许多情况下都是很好的替代方案,但目前为止,并非所有情况都是如此。

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

随着 Wasm 的出现,SQL 或 NoSQL 解决方案可以进入网络。一个示例 是 DuckDB-Wasm,另一个是 absurd-sql。根据这些创建的内容 我们认为,开发者社区可以不断迭代发展, 提供更快、更好的解决方案。

我们不打算直接移除 Web SQL。事实上,我们已经将其替换为 某事 将作为软件包提供, 可以随意更新,而无需引入修复和新功能 直接插入浏览器我们真正的目标是让开发者 将自有数据库连接到 Web 服务器。

除此之外,我们还希望这个示例能够帮助 开源数据库的蓬勃发展!发行 文件系统访问句柄 最后提供了新的基元,可用于自定义存储解决方案, 。

弃用 Web SQL 的原因

可持续性和安全性方面的顾虑

Web SQL 规范无法持续实施,这限制了 创新和新功能。标准 states “用户代理必须 实现 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”的表,该表包含“imity”(文本)和“severity”(整数)列,其中有一个条目表示情绪低落,严重级别为“6”。

缺少实施人员支持

除了神秘的 API 形状(至少从今天的角度来看),Mozilla 有很多 顾虑 如何在 SQLite 的基础上构建 Web SQL:

“我们认为 [SQLite] 不是提供给一般 Web 的 API 的正确基础 这主要是因为 以实用方式对 SQL 进行子集内嵌的标准。此外,我们不希望 以便之后影响网页,不考虑利用主流浏览器, 发布(和 Web 标准)都是明智之举。”

您可以访问以下网址了解 Mozilla 的顾虑: 前任 Mozillan Vladimir Vukičeviese 的博文。 如需查看更多历史记录,请访问 W3C Web 应用工作组会议分钟数 (要了解详情,请阅读 IRC 日志)和 邮寄名单归档)。 此外, Nolan Lawson 的博文 对所发生的情况进行了很好的概述

反馈

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

致谢

本文由 Joe MedleyBen MorssJoshua Bell