Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何等待Jake构建(Node.js)中的文件可用?_Javascript_Node.js_Jake - Fatal编程技术网

Javascript 如何等待Jake构建(Node.js)中的文件可用?

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使我们能够

在Node.js Jake构建中,是否有一种方法可以等待某个文件被复制,并且只有在找到目标文件后才能执行某些操作?我认为这个问题可以归结为“有没有一种方法可以在Node.js/Jake中同步复制文件?”(可能不是使用
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;
  }
});