电子优化的Blob读取

时间:2019-07-18 14:05:48

标签: electron blob

因此,作为Node.js和Chromium的结合点的Electron本质上支持Blob和Node.js的Buffers和'fs'API。

现在,在我的预加载js中,我需要加载许多文件并将它们传递给渲染上下文。但是,我已禁用nodeIntegration,并且这些文件需要作为Blob传递。不过,其中一些Blob的大小可能为数GB。

现在,我知道我可以读取文件并使用类似的方法逐步构建Blob,

const fs = require('fs');

async function loadAsBlob(path) {
    var blob = null;
    function expand(data) {
        if(blob === null)
            blob = new Blob([data]);
        else
            blob = new Blob([blob,data]);
    }

    var hdl = await fs.promises.open(path),
        bufferSize = 16 * 1024 * 1024, // 16MBs at a time
        buffer = new Uint8Array(bufferSize),
        size = (await hdl.stat({bigint: true})).size,
        pos = 0n;

    while(pos < size) {
        let read = await hdl.read(buffer, 0, bufferSize);

        pos += BigInt(bufferSize);
        if(pos > size)
            expand(buffer.subarray(0,read.bytesRead));
        else
            expand(buffer);
    }

    return blob;
}

但这显然效率不高,因为它将文件整体复制到内存中的Blob对象中(加载1.9GB文件大约需要15秒钟),而使用拖放文件API,丢弃的文件会被立即加载,因为不会立即“解析”数据。

所以,最后是我的问题,

我将如何通过电子方法为应用程序生成Blob,而不会“解析”(或 copy )它,就像拖动-拖放API可以吗?

0 个答案:

没有答案