8

使用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 )

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

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

除了从头开始编译所有文件之外,还有其他解决方法吗?jade当您每次要编译大约 60 个大的玉文件时,这会导致问题。

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

4

2 回答 2

4

在已经开始在一个会产生一种玉石的脚手架上工作之后,sourcemap我发现了这个很棒的项目,它已经解决了这个问题:

翡翠传承

用法如下:

  1. 使用安装包:npm install jade-inheritance --save-dev
  2. 您想从玉中获取依赖文件列表的位置:

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

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

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

    depenedentFiles = inheritance.files;

  4. 该项目还演示了如何应用该概念,grunt.watch以便仅编译已更改jade的文件及其依赖项,这正是我所需要的:

通过 grunt watch 使用玉继承

于 2013-12-14T15:09:34.823 回答
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);
    }
  });
});

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

于 2013-12-13T19:13:05.037 回答