因此,作为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可以吗?