很多 SQLite 開發人員正在開發一個項目來實現 將庫編譯成 中間 WebAssembly 代碼 它可以在 Web 瀏覽器中運行,並且適合從 JavaScript 語言的 Web 應用程序中組織與數據庫的工作。
目標 項目的 是提供一個功能性的 JavaScript 鏈接 在功能上與 SQLite API 相同。 為 Web 開發人員提供了一個高級的面向對象的接口,用於處理 sql.js 或 Node.js 風格的數據,包裝了一個低級 C API 和一個基於 Web Worker 機制的 API,允許創建異步控制器,在不同的線程上運行。
為了隱藏基於 Web Worker 的 API 線程的複雜性, 的一個變種 基於機制的編程接口 諾言。
Web 應用程序存儲在 WASM 版本的 SQLite 中的數據可以位於當前會話中(頁面重新加載後丟失),也可以保留在客戶端(跨會話保留)。
對於永久存儲,後端已準備好將數據放在本地文件系統上 使用 OPFS(Origin-Private FileSystem,文件系統訪問 API 的擴展,目前僅在基於 WebKit 和 Chromium 的瀏覽器中可用)和基於 window.localStorage 和 window.sessionStorage API 的瀏覽器本地存儲。
使用 localStorage/sessionStorage 時,數據被映射到適當的鍵/值存儲,而使用 OPFS 時,有兩種選擇:使用 WASMFS 模擬虛擬 FS,以及提供基於 SQLite 的 VFS 層的單獨 sqlite3_vfs 實現。 .
Emscripten 編譯器用於以 WASM 表示形式構建 SQLite. 結果是 sqlite3.js 和 sqlite3.wasm 文件,您可以將它們包含在您的 JavaScript 項目(HTML 和 JavaScript 示例)中。
具體目標 提到了這個項目:
除非在非目標中註明,為 sqlite3 C API 提供或多或少完整的功能包裝,只要 WASM 與 C 的功能奇偶校驗允許。事實上,至少提供以下 API。
- 綁定一個在使用上盡可能接近原生的低級 sqlite3 API。
- 更高級別的 OO API,更像 sql.js 和 node.js 風格的實現。
- 一個基於 worker 的 API,通過 worker 消息與上述 API 進行通信。 這設計用於主線程,在工作線程上安裝較低級別的 API,並通過工作消息與它們通信。
- Worker API 的基於 Promise 的變體,完全隱藏了用戶的線程間通信方面。
- 盡可能使用可用的 JS API 支持客戶端持久存儲。 在撰寫本文時,這包括源私有文件系統 (OPFS) 和(非常有限的)通過 window.localStorage 和 .window.sessionStorage 後端存儲
至於 非特定目標:
- 由於 WASM 是一種以 Web 為中心的技術,而 UTF-8 是該領域的編碼之王,因此目前沒有支持與 UTF3 相關的 sqlite16 API 的計劃。
- 雖然對瀏覽器外 WASM 運行時的支持很普遍,但該項目目前(2022 年末)僅專注於瀏覽器目標。 儘管與 Web 相關的實現細節優先,並且 API 的 JavaScript 組件專門針對瀏覽器客戶端,但較低級別的 WASM 模塊“應該”在非 Web WASM 環境中工作。
- 與舊平台或小眾平台的兼容性。 WASM 專為現代網絡而設計,需要現代平台。 同樣,棄用的 sqlite3 庫選項將從 WASM 界面中完全刪除。
WebAssembly 支持的代碼已添加到項目的主存儲庫中。 與基於 SQLite 的 WebSQL API 不同,WASM SQLite 與瀏覽器完全隔離,不會影響其安全性(在 SQLite 中存在多個可通過 WebSQL 攻擊 Navigator 的漏洞後,Google 決定放棄對 Chrome 中的 WebSQL 的支持) )。
最後,如果你是 有興趣了解更多,您可以查看詳細信息 在下面的鏈接中。