Nodejs 终于有内置的 file.readLines()

在处理大型文本文件(例如解析日志文件)时,出于效率和性能原因,推荐逐行加载/迭代内容,而不是将所有内容读入内存。在 Nodejs 中,这一直很麻烦,因为从日常用户的角度来看,逐行读取的方式看起来很繁琐,而且太底层了。不过,受益于最近合并到版本 v18.11.0 的 PR,情况不再如此,现在有内置的 FileHandle.prototype.readLines,使用起来非常方便。

过去麻烦的方法

import fs from 'node:fs';
import readline from 'node:readline';

const fileStream = fs.createReadStream('input.txt');

const rl = readline.createInterface({
  input: fileStream,
  crlfDelay: Infinity
});

for await (const line of rl) {
  console.log(`Line from file: ${line}`);
}

现在方便的方式

import { open } from 'node:fs/promises';

const file = await open('input.txt');
for await (const line of file.readLines()) {
  console.log(`Line from file: ${line}`);
}

PS:关于该方法是否应该从 PR 增加到核心 nodejs 库,存在一些争论和讨论。从最终用户的角度来看,我认为这是一个很好的添加,它让使用 nodejs 处理大型文本文件更加方便,减少了记住 readline 模块的方法所需的脑力负担,并将代码行数减少了 50%,尽管它只是 readline 之上的一个包装方法。

参考资料

nodejs