nodejs按照行递归读取文件的问题
我现在想做个后端的依赖加载,解析类似
[@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下一个按行读入的。 不过建议还是自己封装一下,灵活点。