PouchDB 7.0 发布解读:移除 WebSQL 后的 17.5% 体积瘦身与确定性修订机制
PouchDB 7.0 发布解读移除 WebSQL 后的 17.5% 体积瘦身与确定性修订机制【免费下载链接】pouchdb:kangaroo: - PouchDB is a pocket-sized database.项目地址: https://gitcode.com/gh_mirrors/po/pouchdb本篇技术指南围绕 PouchDB 7.0.0 版本发布内容展开核心主题是默认构建移除 WebSQL、改用 fetch API、采用与 CouchDB 一致的确定性修订Deterministic Revisions机制以及由此带来的包体积缩减默认构建从 148KB 降到 122KB。阅读本文后你将掌握 7.0 的破坏性变更全貌、从 WebSQL 迁移到 IndexedDB 的实操方案、通过fetch选项拦截 PouchDB 所有 HTTP 请求的定制方法以及确定性修订对冲突处理的实际影响。版本总览17.5% 更小的 PouchDB早在 2018 年 1 月的 6.4.2 版本中PouchDB 团队就预告了 7.0 将移除 WebSQL 的默认支持见 6.4.2 发布说明。7.0.0 兑现了这一承诺将默认构建中的 WebSQL 适配器移除。这一决策不仅让开发团队能够将精力集中到单一存储引擎上还配合其他变更将默认 PouchDB 包体积从148KB 缩减至 122KB降幅达17.5%。从当前仓库的 monorepo 结构见 package.json版本标记为7.0.0-prerelease可以看到PouchDB 以packages/node_modules/下多个独立包的形式组织其中pouchdb-adapter-idb、pouchdb-adapter-indexeddb、pouchdb-adapter-websql-core等适配器彼此分离这为按需构建、独立维护各适配器提供了基础——也解释了为什么 WebSQL 可以被从容地从默认构建中剥离。移除 WebSQL告别非标准存储引擎WebSQL 从未成为 W3C 标准规范它的浏览器支持长期依赖 Safari 与旧版 Chromium。随着 Safari 7.1 起 IndexedDB 逐步稳定WebSQL 的存在价值持续降低。在 7.0 中WebSQL 适配器不再包含在默认构建中但仍可在 7.0.0 的发布资产中单独下载使用未来该适配器将迁移到 pouchdb-community 社区仓库继续维护。如果你需要将现有用户从 WebSQL 迁移到 IndexedDB6.4.2 发布说明中给出了一个可复制的迁移方案见 docs/posts/2018-01-23-pouchdb-6.4.2.md通过db.info()检测当前适配器类型若为websql则新建一个adapter: idb的数据库实例再用replicate.to()把旧库数据复制过去function openDB(name, opts) { return new Promise(function (resolve, reject) { var localdb new PouchDB(name, opts); localdb.info().then(function (info) { if (info.adapter ! websql) { return resolve(localdb); } var newopts opts || {}; newopts.adapter idb; var newdb new PouchDB(name, newopts); var replicate localdb.replicate.to(newdb); replicate.then(function () { resolve(newdb); }).catch(reject); }).catch(reject); }); }从当前仓库的 IndexedDB 适配器源码看见 packages/node_modules/pouchdb-adapter-idb/src/index.jsidb适配器在初始化时会自动探测blobSupportBlob 二进制存储能力并维护数据库 schema 版本ADAPTER_VERSION还专门区分了旧idb适配器与新indexeddb适配器的库格式避免用错适配器打开已有数据库源码中会抛出 “This DB was created with the newer indexeddb adapter” 的错误提示。这提醒迁移时注意同一名称的数据库用不同适配器打开会得到不同的底层存储务必使用与创建时一致的适配器或在迁移完成后妥善清理旧库。移除 Promise Polyfill由应用自行决定此前 PouchDB 自带的 Promise polyfill 让大多数已经自带 polyfill 的应用白白增加了打包体积。7.0 将其移除如果你需要支持原生不支持 Promise 的浏览器例如较老的 IE 环境需要自行引入 polyfill官方推荐 promise-polyfill实测表现良好。这一变更的思路与移除 WebSQL 一脉相承现代浏览器已原生支持 PromisePouchDB 不再为“全员兜底”把选择权交还给应用开发者从而换取更小的默认体积。切换到 fetch可拦截所有 HTTP 请求7.0 将底层的 HTTP 请求实现从 XMLHttpRequest 切换为fetch API。这同样是一个可能需要 polyfill 的变更——如果你需要支持 IE 等旧浏览器官方推荐使用 whatwg-fetch。切换到 fetch 的最大收益是PouchDB 现在暴露了fetch选项允许应用拦截 PouchDB 发出的每一个 HTTP 请求。例如为所有请求统一添加自定义请求头var db new PouchDB(http://example.com/dbname, { fetch: function (url, opts) { opts.headers.set(X-Some-Special-Header, foo); return PouchDB.fetch(url, opts); } });上面的代码会让 PouchDB 对http://example.com/dbname发出的每个 HTTP 请求都携带X-Some-Special-Header: foo头——可用于鉴权、埋点、链路追踪等场景且无需侵入 PouchDB 内部实现。从仓库源码看这一机制由独立的pouchdb-fetch包提供浏览器端packages/node_modules/pouchdb-fetch/src/fetch-browser.js直接复用原生 fetch 与 Headers因此opts.headers.set(...)才能正常工作——这也是 7.0 不再兼容“不支持 fetch 的浏览器”的根本原因Node.js 端packages/node_modules/pouchdb-fetch/src/fetch.js则基于node-fetch实现并包裹了fetch-cookie以自动处理 Node 环境下的 Cookie 持久化包的package.json通过browser字段将./src/fetch.js映射到./src/fetch-browser.js实现同一 API 在不同运行时的无缝切换。确定性修订Deterministic Revisions7.0 的一个关键行为变更修订号rev现在由文档内容决定与 CouchDB 的默认行为保持一致。此前 PouchDB 生成修订时带有随机性导致同一份文档在多个副本上产生不同的修订号进而让自动化的冲突解决处理器更容易制造出“额外”的冲突。改为确定性修订后内容相同的文档无论写入哪个 PouchDB/CouchDB 实例产生的修订号都相同复制replication与冲突合并时的行为更可预测自动化冲突处理更不容易引入多余的冲突分支。仓库中的集成测试 tests/integration/test.deterministicrevs.js 精确验证了这一语义默认情况下deterministic_revstrue对两个数据库分别put内容完全相同的文档两次返回的rev相等第 20–34 行显式传入{deterministic_revs: false}后同样内容的文档得到的rev不相等第 37–51 行保留了旧版随机修订的兼容能力修订号本身也参与 MD5 哈希计算即使文档其余内容相同只要_rev不同生成的后续修订也不同第 54–81 行还验证了“复制 → 更新 → 删除”的完整链路中两个库产生的修订历史完全一致第 83–117 行。这套测试同时说明如果你有依赖“每次写入生成不同 rev”的业务逻辑可以按需通过deterministic_revs: false选项恢复旧行为。更多弃用项7.0 继续贯彻“破坏性变更集中处理”的策略一并移除了以下 API移除debug依赖不再默认携带 debug 日志工具减少体积与依赖面移除 IndexedDB 的storage选项此前允许通过该选项指定 IndexedDB 存储后端如persistent/temporary7.0 起不再支持移除已弃用的skipSetup早期用于跳过 HTTP 适配器初始化检查的选项被彻底删除。如果你此前使用了以上任一选项升级到 7.0 前需要先清理代码。修复与改进清单7.0 同时修复了多项问题值得关注的有性能类IndexedDB 的allDocs改用固定长度数组fixed-length array实现复制到服务器端的请求数量减少一致性与正确性复制进度值改用一致的数据类型db.query()文档中options.reduce的默认值修正健壮性移除了灾难性回溯catastrophic backtracking漏洞修复 iOS IndexedDB 下blobSupport静默失败问题opts.live true时return_docs默认改为false兼容性将旧版 Safari 判定为有效浏览器调用level.destroy前先检查其是否存在确保数据库名前缀prefix以斜杠结尾。上述修复覆盖了浏览器端适配器idb/indexeddb、Node 端 LevelDB 适配器以及复制逻辑体现了 7.0 对“默认引擎单一化 各平台细节打磨”的双重投入。升级建议总结如果你计划升级到 PouchDB 7.0请按以下清单自查存储引擎确认目标浏览器环境支持 IndexedDB存量 WebSQL 用户参照上文迁移方案复制数据Promise / fetch 支持若需兼容 IE 等旧浏览器自行引入promise-polyfill与whatwg-fetch冲突处理确定性修订会改变部分自动化冲突处理逻辑的输入建议运行基于 tests/integration/test.deterministicrevs.js 的回归测试验证业务行为已弃用 API清理storage、skipSetup等选项的使用请求定制如需统一附加请求头、注入鉴权信息可立即利用新的fetch选项参考上文代码示例。PouchDB 7.0 是浏览器端存储引擎战略转向的里程碑以体积瘦身换功能聚焦以标准 APIfetch、Promise、确定性修订换生态一致性为后续版本在 IndexedDB 单引擎上的持续演进铺平了道路。【免费下载链接】pouchdb:kangaroo: - PouchDB is a pocket-sized database.项目地址: https://gitcode.com/gh_mirrors/po/pouchdb创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考