Web SQL Database API 可讓您在使用者的電腦上以結構化方式儲存資料 (內部以 SQLite 資料庫引擎為基礎),2009 年 4 月推出,2010 年 11 月放棄。雖然 Gecko 是在 WebKit (支援 Safari) 中實作,並在 Blink 引擎中仍然活躍 (執行 Chrome),但 Gecko 並未導入這項功能,且 WebKit 在 2019 年將其移除。
全球資訊網協會 (W3C) 建議需要網站資料庫採用 Web Storage API 技術,例如 localStorage
和 sessionStorage
或 IndexedDB。這些技術在鍵/值儲存庫和結構化資料方面展現出優異優勢,但肯定也顯得缺乏完善查詢語言等弱點。使用者之所以希望網路 SQL 是有原因的,
網路 SQL 淘汰與移除步驟
- [ 完成。]Web SQL 已從 Chromium 97 中的第三方環境淘汰,並從 2022 年 1 月 4 日移除。
- [ 完成。]自 Chromium 105 (2022 年 1 月 4 日) 起,淘汰不安全內容中的 Web SQL 存取權,屆時「Chrome 開發人員工具問題」面板中會顯示警告訊息。
- [ 完成。]自 Chromium 110 (2022 年 1 月 4 日) 起,您無法再透過不安全的環境存取 Web SQL 存取權。關於繼續使用這項功能,Chromium 110 (2022 年 1 月 4 日) 至 Chromium 123 的企業政策將適用於 Chromium 123 (2022 年 1 月 4 日)。
- [ 完成。]自 Chromium 115 (2022 年 1 月 4 日) 起,所有結構定義中的 Web SQL 存取權均已淘汰,且「Chrome 開發人員工具問題」面板中會顯示警告訊息。
- [淘汰試用計畫 (2022 年 1 月 4 日) 至 Chromium 123 (2022 年 1 月 4 日)。如要進一步瞭解淘汰試用功能,請參閱「開始使用來源試用」。 完成。]為繼續使用 Web SQL,我們在 Chromium 117 期間推出
- [ 完成。]自 Chromium 119 不再提供在所有結構定義中存取 Web SQL 的功能。
下一步該做什麼?
如簡介所述,localStorage
、sessionStorage
或 IndexedDB 標���等 Web Storage API 技術,在很多情況下都是不錯的替代方案,但目前並非在所有情況中。
將��存空間留給網頁程式開發人員的理由
隨著 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 年代末期的子項,以下是「回呼堆積」的絕佳範例,如以下程式碼範例 (由諾蘭勞森的提供) 示範。如您所見,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 開發人員工具檢查建立的資料表,將會產生以下結果:
缺乏實作器支援
除了傳統的 API 型態 (至少從今天的觀點來看),Mozilla 還對在 SQLite 上建構 Web SQL 的疑慮:
「我們認為 [SQLite] 是對一般網路內容公開的 API 的正確基礎,至少因為缺乏部分 SQL 的可信標準,因此對 SQL 而言並不可靠。此外,我們不希望對 SQLite 的異動日後影響到網路,也不認為將主要瀏覽器版本 (以及網路標準) 用於 SQLite 都是必要做法。」
如要瞭解 Mozilla 的問題,請參閱前 Mozilla Vladimir Vukičeviique 的網誌文章。如需更多歷史記錄,請參閱 W3C 網頁應用程式工作小組分鐘數 (如果您真的想進一步瞭解詳細資料,請參閱 IRC 記錄檔) 和郵寄清單封存。此外,Nolan Lawson 的網誌文章也詳細說明瞭整個事件的情況,
意見回饋:
如果您對本文所述的淘汰步驟有任何疑慮,請透過 blink-dev 郵寄清單告訴我們。這個群組的成員資格開放給所有人,但任何使用者都可以留言。
相關連結
- ChromeStatus 項目:淘汰及移除第三方環境中的 WebSQL
- ChromeStatus 項目:淘汰及移除不安全環境中的 WebSQL
- 淘汰及移除意圖:第三方內容中的 WebSQL
- 淘汰及移除意圖:不安全內容中的 WebSQL
- Chromium 問題: 淘汰及移除第三方環境中的 WebSQL
- Chromium 問題: 淘汰並移除不安全的 WebSQL
- Chromium 問題: 淘汰並移除 WebSQL (Window#openDatabase)
- 瀏覽器中由來源私人檔案系統支援的 SQLite Wasm
特別銘謝
本文評論者為 Joe Medley、Ben Morss 和 Joshua Bell。