登录
注册
node.js 学习社区
nodejs按照行递归读取文件的问题

眉间雀

2014-12-07 15:17

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

@import js.app
@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 ('core.dom.get');
 var reg = /\s*@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)
});

原文引自:http://cnodejs.org/topic/528b64cfd2b3893f2a907599

回复 · 0

发表回复

你可以在回复中 @ 其他人