web 数据库的前世今生
web 数据库1一直以来是有规范, 当然也是 Google, Inc. 作为第一发起人实现的。目的是用结构化方式在存储数据(内部基于 SQLite 数据库引擎)他在 2009年的时候推出2 , 没过两年就弃用了3 属于纯的命运多舛,在 此前的文章中 我也有提及,但是那个时候未能料到仅仅1年多他最终进入了墓地 4。
哀悼
生于 webkit,存于 Blink ,未尽事业于 Gecko
很符合 websql 的一生。
目前来讲 W3C 更推崇开发者使用 indexDB、localstorage、sessionstorage5 等等 storage api 来做储存。这些传统的 storage api 在绝大部分场景表现良好,但是可以肯定的是,他们仍然缺乏强有力的查询语言6来提供一些必要的支持。
websql 的废弃
截止现在(2024年07月04日),websql 已经彻底的在 chrome 上消失了。事实上如果需要一个精准的时间是 2022 年 1月后发布的 chrome119 版本开始。
安全性
websql 的废弃是有原因的,核心在于安全性,websql 是基于 sqlite 封装的,sqlite 从设计之初开始就不是一个基于沙箱运行的组件,所以起安全性有待验证,而更糟的是,一旦 sqlite 出现 安全性更新,那么 chrome 就必须跟着更新内置的 sqlite,对于浏览器来说,让用户升级是一个麻烦事儿。
另外从规范定义上来讲 websql 必须严格对齐 sqlite 3.6.19 ,并以此为规范实现:
这使得原定的按照规范落地的计划并不成功。
核心原因
我个人认为更核心的原因还是在于没有一个事实的 sql 子集可以在 web 上安全、高性能的定义,绝大部分数据库在设计上是不考虑本地安全性的。而对于浏览器而言,这恰恰相反。
过于糟糕的 api
websql 在设计上是一个经典的回调地域写法:
过时警告
下面是一段在绝大部分浏览器无法运行的伪代码,请不要参考、使用。
仅仅打开数据库查询内容,就可以初见端倪,诚然可以将其优化为 promise 版本,使用 async-await 解决,但是显然作为 native 实现的 api 要更新为 promise 是一个漫长的过程(需要扯皮)
Mozilla 不愿意支持
Mozilla 对这一功能抵触情绪很强:
原文
We don’t think [SQLite] is the right basis for an API exposed to general web content, not least of all because there isn’t a credible, widely accepted standard that subsets SQL in a useful way. Additionally, we don’t want changes to SQLite to affect the web later, and don’t think harnessing major browser releases (and a web standard) to SQLite is prudent.
说人话:sqlite 没有事实标准,也没有 sql 子集,web 标准作为一个落地很慢的标准,不能把未来的标准和一个不稳定的方案绑定。78
当今的 web 数据库?
时至今日,由于浏览器越来越强大的原生能力和系统级api 的开放,我们得以将 sqlite 使用 wasm 的方式在浏览器上实现:
https://sqlite.org/wasm/doc/trunk/index.md
这个非常有意思,下面有一个简单的对比图9:
我们可以看得出在性能上 wasm 版本的 sqlite 完全可用,并且效果不错。
脚注
-
https://www.w3.org/TR/webdatabase/#status-of-this-document ↩
-
大概在 2019 年 webkit 正式抛弃了 websql, https://lists.webkit.org/pipermail/webkit-dev/2019-November/030968.html ↩
-
注意 cookie 并不属于 storage,这里是特意不加 cookie 的 ↩
-
我们知道有很多 storage 的封装来提供 ORM ,但是本质上其性能和能力上,对比 SQL 还是有很大不足的 ↩
-
一些文章: https://nolanlawson.com/2014/04/26/web-sql-database-in-memoriam/ ↩
-
来自 W3C 的讨论: https://www.w3.org/2009/11/02-webapps-minutes.html#item10 ↩
本文标题:谈谈已经去世的 websql 和秽土转生的 sqlite-wasm
永久链接:https://iceprosurface.com/code/web-frontend/discuss-websql-and-sqlite-wasm/
作者授权:本文由 icepro 原创编译并授权刊载发布。
版权声明:本文使用「署名-非商业性使用-相同方式共享 4.0 国际」创作共享协议,转载或使用请遵守署名协议。