在 PWA service-worker 用例中将 sql.js 与 webpack 一起使用时出错

Errors when I use sql.js with webpack in PWA service-worker usecase

我想在 PWA service-worker 中使用 sql-wasm.js (https://github.com/sql-js/sql.js)。 我想使用它的原因是,通过服务工作者获取 mbtiles(sql基于 ite 的网络地图图块分布格式),从中提取网络地图图块图像并将它们存储到索引数据库中。 所以我想将 sql-wasm.js 用于纯只读用例。

我这样从服务人员那里调用 sql-wasm.js:

import initSqlJs from "./sql-wasm";
import "./sql-wasm.wasm";

...

  initSqlJs({}).then(SQL => {
    //Create the database
    var db = new SQL.Database();
    // Run a query without reading the results
    db.run("CREATE TABLE test (col1, col2);");
    // Insert two rows: (1,111) and (2,222)
    db.run("INSERT INTO test VALUES (?,?), (?,?)", [1,111,2,222]);

    // Prepare a statement
    var stmt = db.prepare("SELECT * FROM test WHERE col1 BETWEEN $start AND $end");
    stmt.getAsObject({$start:1, $end:1}); // {col1:1, col2:111}

    // Bind new values
    stmt.bind({$start:1, $end:2});
    while(stmt.step()) { //
      var row = stmt.getAsObject();
      console.log('Here is a row: ' + JSON.stringify(row));
    }
  });

...

我的 webpack-config 包括:

    externals: { fs: 'fs', }

准备好这些后,我运行 webpack (4.41.6),然后我得到了这个警告

WARNING in ./src/weiwudi_gw_logic.js 78:2-11
"export 'default' (imported as 'initSqlJs') was not found in './sql-wasm'
 @ ./src/weiwudi_gw.js
 @ ./test/src/sw_npm.js

以及这些错误:

ERROR in ./src/sql-wasm.wasm
Module not found: Error: Can't resolve 'a' in 'F:\github\Weiwudi\src'
 @ ./src/sql-wasm.wasm
 @ ./src/weiwudi_gw_logic.js
 @ ./src/weiwudi_gw.js
 @ ./test/src/sw_npm.js

ERROR in ./src/sql-wasm.wasm
WebAssembly module is included in initial chunk.
This is not allowed, because WebAssembly download and compilation must happen asynchronous.
Add an async splitpoint (i. e. import()) somewhere between your entrypoint and the WebAssembly module:
* ./test/src/sw_npm.js --> ./src/weiwudi_gw.js --> ./src/weiwudi_gw_logic.js --> ./src/sql-wasm.wasm

如何避免这些errors/warnings?

======

我已经从这张票中得到了信息 (),但是添加 experiments/asyncWebAssembly 选项仅在 webpack5 中有效。 如果可能的话,我想用 webpack4 来解决这个问题。不可能吗?

最后我成功地在 PWA service worker 中使用基于 wasm 的 sqlite,通过使用这个模块:

https://www.npmjs.com/package/sql-wasm

该模块包含 2 个文件

  • node_modules/sql-wasm/dist/esm/sql-wasm-browser.js
  • node_modules/sql-wasm/dist/sqlite3.wasm

稍作修改后使用,效果很好。

  1. 将 sql-wasm-browser.js 与 service worker 的源代码放在同一个文件夹中。

  2. 对 sql-wasm-browser.js 添加一些修改,以避免错误提示“文档未定义”

/* eslint-disable camelcase */
const document = {}; //<= Add this
var createSqlite3Api = (function (module) {
  1. 从 service worker 的源代码中调用它。
import createSqlWasm from "./sql-wasm-browser";
  1. 通过 webpack 5 编译,webpack.config:
    resolve: {
        fallback: {
            fs: false,
            path: false,
            crypto: false
        }
    }
  1. 将sqlite3.wasm与编译结果放在同一个文件夹中。

然后它工作正常。