Как условно скомпилировать (используя Grunt) только измененные файлы jade с включенными шаблонами

Использование версии того, что 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 больших файлов jade для компиляции каждый раз.

Единственное возможное решение, которое я могу придумать, это либо сопоставление зависимостей нефритовых шаблонов либо извне, либо с помощью каталогов, но я не знаю никаких инструментов/плагинов, которые это делают...


person Gilad Peleg    schedule 14.11.2013    source источник


Ответы (2)


После того, как я уже начал работать над каркасом, который будет генерировать своего рода нефрит 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 файлов с их зависимостями, именно то, что мне было нужно:

Использование jade-наследования с grunt watch< /сильный>

person Gilad Peleg    schedule 14.12.2013
comment
Может ли это работать для нескольких папок, унаследованных файлов, поскольку мы отлаживаем их, мы не можем установить, поскольку они работают, будем признательны за вашу помощь :) - person Ajay Patel; 22.04.2016

Я представляю что-то вроде проверки всех файлов jade, и если они включают ваш измененный файл, то также перекомпилируйте его. Не должно быть слишком сложно. Псевдокод:

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);
    }
  });
});

Теперь добавьте эти файлы в задачу компиляции.

person Martin Hansen    schedule 13.12.2013
comment
Хм, getAllJadeFileWithIncludesAndProjectPathMap() на самом деле то, что я искал. Итак, в основном после получения события changed я нахожу его в Array и компилирую jade и все его дочерние элементы. Не только это, но я искал уже существующее решение и не хотел сам изобретать колесо. - person Gilad Peleg; 14.12.2013