javascript - 如何在 NodeJS 中读取大文件(Excel)而不暂停 UI

标签 javascript node.js typescript electron exceljs

我目前正在使用ExcelJS将大型 Excel 文件(10,000 多行)读取到 NodeJS/Angular/Electron 应用程序中。它可以很好地读取较小的文件,但读取较大的文件需要 3.9 到 5 秒的时间,并且在此期间,CSS 根本不会更新。

我目前正在使用 async/await 来加载文件,因为我认为这将允许在等待文件加载时发生其他操作,因为我认为 Node 中的 I/O 操作有自己的线程。我还了解到 CPU 密集型任务会阻塞所有其他 Node 进程。

这是当前加载工作簿的代码:

async openWorkbook(filename: string) {
    this.loading = true;
    const workbook = new Workbook();
    const promise = workbook.xlsx.readFile(this.path + '/sheets/' + filename)
      .then(() => {
        // use workbook
        workbook.getWorksheet(1).name = workbook.getWorksheet(1).name.slice(0, 31);
        const excelFile: ExcelFile = { workbook: workbook, filename: filename };
        this.wbSource.next(excelFile);
      });

    const read = await promise;
  }

此代码的工作方式与回调实现相同,它们都会阻止应用程序的 CSS。我如何在不阻塞 UI 的情况下读取文件(或执行任何 CPU 密集型任务)?

最佳答案

在这种情况下,我要做的第一件事是通过根本不“打开”大文件来防止内存开销。

所以像这样的东西应该有效:

const stream = fs.createReadStream(filePath);
const workbook = new Excel.Workbook();
stream.pipe(workbook.xlsx.createInputStream());

以及那些chunks阻塞循环一小段时间,即使在 javascript 事件循环中也可以使用它;)

关于javascript - 如何在 NodeJS 中读取大文件(Excel)而不暂停 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57527356/

相关文章:

javascript - 脚本未在模式窗口中运行

node.js - 自定义端口不适用于 AWS EC2 实例上的 Node.js 应用程序

typescript 错误 TS2531 对象可能是 'null' 未被 strictNullChecks : false 抑制

javascript - 如何在extjs 4中制作不同颜色的柱形图

javascript - 浏览图像并插入 Iframe

javascript - 可拖动 div 中的位置错误

javascript - 检查变量是否在 Typescript 中定义?

javascript - 如何使用 path-to-regexp 匹配所有不以/api/开头的路径?

node.js - 使用 Express 设置 React Router

javascript - 为命名空间上公开的方法创建类型定义