Javascript 如何等待Jake构建(Node.js)中的文件可用?
在Node.js Jake构建中,是否有一种方法可以等待某个文件被复制,并且只有在找到目标文件后才能执行某些操作?我认为这个问题可以归结为“有没有一种方法可以在Node.js/Jake中同步复制文件?”(可能不是使用Javascript 如何等待Jake构建(Node.js)中的文件可用?,javascript,node.js,jake,Javascript,Node.js,Jake,在Node.js Jake构建中,是否有一种方法可以等待某个文件被复制,并且只有在找到目标文件后才能执行某些操作?我认为这个问题可以归结为“有没有一种方法可以在Node.js/Jake中同步复制文件?”(可能不是使用fs.readSync和fs.writeSync的组合从头开始写东西) 背景: 我正在开发一个web应用程序,该应用程序在开发过程中运行在Node.js(使用Express)上,但将在生产环境中部署在Java服务器上。(我们在客户端使用Jade和Stylus,Express使我们能够
fs.readSync
和fs.writeSync
的组合从头开始写东西)
背景:
我正在开发一个web应用程序,该应用程序在开发过程中运行在Node.js(使用Express)上,但将在生产环境中部署在Java服务器上。(我们在客户端使用Jade和Stylus,Express使我们能够运行应用程序,而无需生成所有HTML文件等,并在每次更改后部署它。)
我使用Jake进行构建,即从Jade文件生成HTML文件,从Stylus文件生成CSS等。现在,我还尝试将应用程序的所有JavaScript文件连接到一个最小化文件中,并将所有HTML文件更改为使用该文件,而不是在开发过程中以“原始”形式使用的所有单独JS文件
然而,我现在对最后一步有一个问题。我的想法是将我所有的Jade文件复制到一个临时目录中,用于部署构建,并将引用(在所有HTML页面上用作标题的Jade文件中)替换为所有单独JS文件的列表,并将其替换为刚刚通过连接和最小化整组文件而生成的文件。但当我第一次将所有Jade文件复制到另一个位置(异步进行)并尝试编辑其中一个文件时,打开文件总是失败,因为复制操作还没有真正完成
这就是我现在在我的文件
中的内容(简化形式):
var fs = require('fs');
var fse = require('fs-extra');
var path = require('path');
var glob = require('glob');
var Snockets = require('snockets');
var snockets = new Snockets();
// generating the minimized JS file
snockets.getConcatenation(baseDir + '/scripts/all.js', { minify: true }, function(err, allJs) {
if (err) {
throw err;
}
fs.writeFileSync(generatedJsFileName, allJs);
});
// copying all the Jade files to a temp dir
glob.sync('**/*.*', {
cwd : srcDir
}).forEach(function(file) {
var loadPath = srcDir + '/' + file;
var savePath = targetDir + '/' + file;
fse.mkdirsSync(path.dirname(savePath));
fse.copy(loadPath, savePath);
});
// trying to read one of the copied files (which fails, since the file cannot be found yet)
fs.readFile(targetDir + '/views/includes/head.jade', 'utf8', function(err, data) {
...
});
这可能是一个愚蠢的问题,也是一个试图首先解决问题的愚蠢方法。因此,关于更好的方法的建议也是非常受欢迎的
更新:
我还尝试使用Parseq,将每个操作(创建JS文件、复制Jade文件、读取一个文件)放在自己的函数中,但即使这样也会产生同样的错误。如果我多次运行脚本而不删除其间复制操作的目标目录,则可以找到该文件。例如,路径是正确的,问题似乎确实与时间有关。我没有找到主要问题的答案,因此我不知道这是否有助于其他面临同样问题的人。但我确实找到了解决问题的办法 我在两次不同的转换中使用了相同的原始Jade文件,但在第二次转换中,我使用了一个自定义的
js
函数来更改script
标记引用以指向缩小的文件
即
var data=jade.compile(str,{filename:file,pretty:true})({
css:函数(路径){
返回“”;
},
js:函数(路径){
变量名=“”;
返回名称;
}
});
这可能不是最漂亮的解决办法,但确实有效
var data = jade.compile(str, { filename: file, pretty: true })({
css: function(path) {
return '<link rel="stylesheet" href="/styles/' + path + '.css" />';
},
js: function(path) {
var name = '<script src="/scripts/';
if (path == 'all') {
name += generatedJsFileName;
}
else {
name += path + '.js';
}
name += '"></script>';
return name;
}
});