nodejs按照行递归读取文件的问题
发布于 1年前 作者 jtyjty99999 1189 次浏览

我现在想做个后端的依赖加载,解析类似

[@import](/user/import) js.app
[@import](/user/import) 'js.cs'
hello!

这样的文件。 我的思路是 按行读取这种文件,之后解析每一行,遇到import这种的就解析成路径,比如第一行解析成 js/app.js 之后继续递归读js/app.js,直到所有的依赖读取结束。之后把所有读出来的东西拼在一起。

现在有这么个问题。我用ndir之类按行读取的,因为是异步的,我不知道什么时候递归才完毕。 之前考虑用eventproxy的after方法,但不知道有多少个依赖,因此无法进行计数。

php读取文件是同步的所以很轻松就可以解决,等待读完了就行了。

请问nodejs有类似同步按行读取文件的么,或者说还有什么办法可以解决我的问题?

附未完成的代码

var fs = require('fs');

//解析import为路径
function getImport(line) {
 //[@import](/user/import) ('core.dom.get');
 var reg = /\s*[@import](/user/import)\s*\(?\s*[\"\']?([a-z_\-\.\/]+)[\"\']?\s*\)?\s*;?/i;

 var matched = line.match(reg);

 if (matched && matched[1]) {
  return matched[1];
 }
}

//把路径转为真实路径
function getImportPath(path) {
 return path.replace(/\./g, '/') + '.js'
}

//按照行读取文件,返回文件数组

var ndir = require('ndir');

var fileContent = [];

//判断是否为真实路径

function isRealPath(path) {
 if (path.indexOf('.js') !== -1) {
  return true
 } else {
  return false
 }
}
//合并文件内容
function concatFile(filePath) {

 var path;

 if (!isRealPath(filePath)) {
  filePath = getImportPath(getImport(filePath)); //解析路径
 } else {
  path = filePath;
 }
 ndir.createLineReader(filePath)
 .on('line', function (line) {
  var content = line.toString();
  if (content.indexOf('@') !== -1) { //读到import
   concatFile(content);
  } else {
   fileContent.unshift(content);
  }

 })
 .on('end', function () {
  console.log('end');
  ep.emit('line-read-end');
  //writeFile(fileContent, path) 啥时候能调用?
 })
 .on('error', function (err) {
  console.error(err);
 });

}
//写文件
function writeFile(content, path) {

 console.log(content, path)

}

concatFile('test.js');

var EventProxy = require('eventproxy');

var ep = new EventProxy();

ep.after('line-read-end', 3, function (list) { //这里的3是我随便写的,但实际是不知道要执行多少次的
 console.log(fileContent)
});
1 回复

nodejs里面有同步读取文件的,基本的API都带同步方法。 但是确实目前没有按行读入,你可以用流直接切一下,就几行代码,而且流还可以指定字节数读入,比较方便。 或者你用NPM下一个按行读入的。 不过建议还是自己封装一下,灵活点。

回到顶部