javascript 如何将SQL.js WASM加载为base64,以便可以直接在HTML文件中加载

yi0zb3m4  于 2023-03-28  发布在  Java
关注(0)|答案(2)|浏览(309)

我尝试从https://github.com/sql-js/sql.js加载sql-wasm.wasm,这样它就不需要服务器。否则,尝试从HTML加载wasm会出现CORS错误。我将其转换为base64(~ 800 KB),如下所示

const SQLBASE64 = "AGFzbQEAAAABrQRHYAJ/fwF/YAF/AX....AAJ4BAEHwogQLA4AWUQ==";

link到完整的base64字符串)
WebAssembly.Instance只适用于非常小的二进制文件。WebAssembly.instantiate()WebAssembly.instantiateStreaming()都以错误的对象、格式或头等错误结束。
我该怎么做才合适呢?

ijnw1ujt

ijnw1ujt1#

你可以尝试使用这个question的答案(你的const的答案是):

const SQLBASE64 = "...";

function asciiToBinary(str) {
  if (typeof atob === 'function') {
    return atob(str)
  } else {
    return new Buffer(str, 'base64').toString('binary');
  }
}

function decode(encoded) {
  var binaryString =  asciiToBinary(encoded);
  var bytes = new Uint8Array(binaryString.length);
  for (var i = 0; i < binaryString.length; i++) {
    bytes[i] = binaryString.charCodeAt(i);
  }
  return bytes.buffer;
}

var instance = WebAssembly.instantiate(decode(SQLBASE64), {})
      .then(r => r.instance);

编辑:
我做了更多的调查,你需要sql-wasm.js文件来示例化sql-wasm.wasm文件。你的wasm模块需要sql-wasm.js给予的导入,但是它所需要的配置似乎只需要一个路径。这意味着,没有办法告诉它加载html文件中已经存在的二进制模块。
我认为这是可以改变的,无论是一个pull request还是一个官方回购的问题。当然,我希望被更有知识的人证明是错误的。

gab6jxml

gab6jxml2#

所以有两个问题。

  1. base64字符串不正确。已使用https://github.com/BillKek/wasm2js_let_staticsql-wasm.wasm v1.8.0正确转换为base64。
    1.不需要直接调用WebAssembly.instantiate,而是从sql.js使用initSqlJs()
    然后像这样装上子弹
const wasm_strbuffer = atob(SQLBASE64);
    let wasm_codearray = new Uint8Array(wasm_strbuffer.length);
    for (var i in wasm_strbuffer) wasm_codearray[i] = wasm_strbuffer.charCodeAt(i);

    const sqlPromise = initSqlJs({
        locateFile: filename => URL.createObjectURL(new Blob([wasm_codearray], { type: 'application/wasm' }))
    });
    const dataPromise = fetch("mysqlite.db").then(res => res.arrayBuffer());
    Promise.all([sqlPromise, dataPromise]).then((data) => {
        const SQL = data[0];
        const buf = data[1];
        const db = new SQL.Database(new Uint8Array(buf));
        dbLoaded(db);
    });

Base64 wasm gist https://gist.github.com/SMUsamaShah/358fba159cb41fe469fc61e7db444c0e

相关问题