在 sqlite3 中,浏览器中的数据库

以下演示了如何在浏览器中启动并运行 sqlite31,只需几个简单的步骤。为了简单起见,本教程将演示在网页的所谓主线程中加载 sqlite3 JavaScript/WebAssembly (WASM) 模块。从 worker 中使用该模块只需要稍微多一点的努力,将在以后的教程中介绍,以及如何使用各种持久存储选项。

在我们开始之前,请注意此处演示的方法的以下限制

步骤 1:创建 HTML

在最基本的情况下,我们需要加载主要sqlite3.js和使用它的客户端应用程序的 HTML 支架。例如

<!doctype html>
<html lang="en-us">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Hello, sqlite3</title>
  </head>
  <body>
    <script src="jswasm/sqlite3.js"></script>
    <script src="demo-123.js"></script>
  </body>
</html>

查看demo-123.html,它具有更丰富的功能。

步骤 2:创建 JS 应用程序

HTML 已经完成,我们需要我们的 JavaScript 应用程序。最基本的部分是加载库的 WASM 编译形式,以及初始化其 JavaScript 绑定。所有这些都通过sqlite3.js导出的例程执行

window.sqlite3InitModule().then(function(sqlite3){
  // The module is now loaded and the sqlite3 namespace
  // object was passed to this function.
  console.log("sqlite3:", sqlite3);
});

查看demo-123.js,它是一个“功能齐全”的示例,展示了高级 sqlite3 JS API。

sqlite3InitModule()函数是 sqlite3 WASM 模块加载器导出的唯一全局符号,并且在任何应用程序中只能调用一次。应用程序有责任将sqlite3对象存储在应用程序方便的位置。最简单的情况

globalThis.sqlite3 = sqlite3;

将它安装为全局符号2,但在大多数项目中都不鼓励使用全局作用域。

请注意,在缓慢的连接上,下载 WASM 文件(由sqlite3InitModule()触发的步骤)可能需要一些时间,在此期间,演示将看起来处于非活动状态。应用程序可以添加额外的 HTML、CSS 和 JS 部分以接收有关加载状态的通知,以便例如,UI 可以显示“正在加载...”动画或报告任何错误。这样做需要熟悉Emscripten提供的 JS/WASM 支架,但这超出了本演示的范围。在sqlite3 fiddle 应用程序的底部提供了一个示例。

步骤 3:Web 服务器

有了 HTML 和 JS,我们需要一个 Web 服务器来运行它们。由于安全限制,浏览器可能会拒绝加载通过file:// URL 提供的服务的 WASM。由于 Web 服务器在很大程度上取决于个人喜好,并且有很多可用的选项,因此在这里运行该部分超出了范围。

简而言之,我们需要以下文件在某个任意 Web 服务器上的同一目录中

Web 服务器启动并运行后,我们只需要将浏览器指向演示文件的位置即可


  1. ^ 需要最新(2020 年后)的完整功能浏览器。Firefox 和 Chrome 系列浏览器已知在大多数平台上都足够。此框架目前针对浏览器,而不是非浏览器运行时,例如 node.js。
  2. ^ 符号globalThisself分别指主线程和 Worker 线程中的全局对象。名称globalThis对于非浏览器平台更具可移植性,并且在所有与 JS 相关的浏览器中都受支持。