如何有条件地编译(使用Grunt)只更改了包含模板的jade文件

时间:2013-11-14 14:56:55

标签: javascript compilation pug gruntjs grunt-contrib-watch

使用grunt-contrib-watch推荐的版本仅在此处编译已更改的文件https://github.com/gruntjs/grunt-contrib-watch#compiling-files-as-needed

var changedFiles = Object.create(null);

var onChange = grunt.util._.debounce(function() {
grunt.config('jshint.all.src', Object.keys(changedFiles));
   changedFiles = Object.create(null);
}, 200);

grunt.event.on('watch', function(action, filepath) {
   changedFiles[filepath] = action;
   onChange();
});

这很好用(我再次在这里写了一个变体:https://gist.github.com/pgilad/6897875

问题是在Jade模板中使用include时,这意味着您要包含其他Jade模板以构建完整的html文件。

使用单一解决方案进行编译不起作用,因为如果使用.jade嵌入正在处理的include current_working_jade.jade文件,则包含文件将无法重新编译

除了 从头开始编译所有jade文件之外, 是否有任何变通办法?当每次有大约60个大型玉文件要编译时,这会导致问题。

我能想到的唯一可能的解决方案是在外部或使用目录映射jade模板依赖项,但我不知道有哪些工具/插件可以做到这一点......

2 个答案:

答案 0 :(得分:4)

在已经开始处理将产生一种玉石{1}的脚手架之后,我找到了这个伟大的项目,已经解决了这个问题:

Jade Inheritance

用法如下:

  1. 使用以下代码安装包:sourcemap
  2. 您想从玉器中获取相关文件列表:

    npm install jade-inheritance --save-dev

    var JadeInheritance = require('jade-inheritance');

  3. 然后当你想要获取文件时:

    var inheritance = new JadeInheritance(file, basedirname, {basedir:basedirname});

  4. 该项目还演示了如何将概念与depenedentFiles = inheritance.files;一起应用,以便仅使用其依赖项编译已更改的grunt.watch文件,这正是我所需要的:

  5. <强> Using jade-inheritance with grunt watch

答案 1 :(得分:1)

我想象检查所有玉文件,如果它们包含您更改的文件,那么也重新编译它。不应该太难。伪代码:

var allFiles = getAllJadeFileWithIncludesAndProjectPathMap();
//allFiles now contains something like this

{
  'jade/index.jade': ['jade/menu.jade', 'jade/home.jade'],
  'jade/about.jade': ['jade/menu.jade']
}


var rootFiles = [];

_.each(allFiles, function (includes, parent) {
  _.each(includes, function (includePath) {
    var parent;
    while (parent = getParentPath(includePath)) {
      //nothing needed if getParentPath returns null for files that aren't included
    }

    if (rootFiles.indexOf(parent) !== -1) {
      rootFiles.push(parent);
    }
  });
});

现在将这些文件添加到编译任务中。