Разумеется, моё мнение может не совпадать с вашим. Да, цифры у вас могут получаться другие. Да и воздух может быть у вас чище, но у меня цифры получились такими. Решение за вами :)
Условия измерения
Необходимо для измерений:
- Специально разработанный для этого плагин.
- Реальный
gruntfile.js
из тестовой версии нового Raptorius Web Kit (1.0.0). - Немного терпения.
Характеристики машины:
- CPU: Intel Core i7-3610QM
- RAM: 8 ГБ DDR3 1600 МГц
- SSD: ADATA S511
Результаты небольшого теста на попугайность, которые помогут вам получить почву для сравнения машин, полученных очков и ожидаемых результатов Grunt.
Сразу оговорюсь, что использовать этот gruntfile
не нужно, ибо в нём есть проблемные места, которые явно будут видны на скриншотах ниже. Используется он для поиска оптимального соотношения производительности и затраченного времени на выполнение задач. Пока всё не очень хорошо, как хотелось бы.
Всего мы рассмотрим три случая, которые я смог найти на просторах зарубежного интернета.
Вперед!
А, хотя, нет! Стоп, стоп, стоп! Без кофе — никак! Занесите его в пункт «необходимо для измерений».
Сборка проекта
В этом тесте мы будем собирать весь проект целиком от и до. Текущая карта плагинов:
/*
* ---------------------------------------------------------------
* PROJECT CONFIGURATION
* ---------------------------------------------------------------
*
* - Watch
* - Sync files
* - BrowserSync
* - Styles:
* - CSSComb,
* - LessLint,
* - Less,
* - Autoprefixer
* - CSSO
* - Scripts:
* - JSHint,
* - JSCS,
* - Concat
* - Uglify
* - Images:
* - Imagemin
* - Replace
*/
Стандартная задача
В первом случае мы объявляем всё так, как указано в документации — никакой фантазии, берём и делаем.
// Loading plugins
grunt.loadNpmTasks('grunt-autoprefixer');
grunt.loadNpmTasks('grunt-browser-sync');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-imagemin');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-csscomb');
grunt.loadNpmTasks('grunt-csso');
grunt.loadNpmTasks('grunt-jscs');
grunt.loadNpmTasks('grunt-lesslint');
grunt.loadNpmTasks('grunt-sync');
grunt.loadNpmTasks('grunt-text-replace');
// Initializing plugins
...
В итоге получаем вот такие цифры:
На GitHub предлагали слегка модифицированный вариант загрузки плагинов во время определения задачи. Что же, попробуем!
На примере одной задачи выглядит это так:
grunt.registerTask('watch-styles', function(status) {
grunt.loadNpmTasks('grunt-lesslint');
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-autoprefixer');
status = typeof status !== 'undefined' ? status : 'build';
grunt.task.run([
'lesslint',
'less:' + status + 'CompileFiles',
'autoprefixer:' + status + 'PrefixFiles'
]);
});
В итоге получаем слегка неутешительные цифры:
Довольно странный результат. Нам обещали ~1s выигрыша, но что-то пошло не так :)
Универсальный загрузчик
И вот уже слышно, как в дверь к нам ломится плагин load-grunt-tasks, который читает файл package.json
и загружает плагины в соответствии с его структурой.
Наш gruntfile.js
слегка похудел:
module.exports = function (grunt) {
// Measuring the execution time
require('time-grunt')(grunt);
require('load-grunt-tasks')(grunt);
...
}
Да и в скорости слегка прибавил:
Уже лучше, но на очереди ещё один способ.
Отложенная загрузка плагинов
Плагин jit-grunt (Just In Time) позволяет загружать необходимые плагины по мере их вызова в задаче.
Фактически ничего не изменилось:
module.exports = function (grunt) {
// Measuring the execution time
require('time-grunt')(grunt);
require('jit-grunt')(grunt, {
replace: 'grunt-text-replace'
});
...
}
Уже лучше, но существенно ли?
Исходя из полученных цифр, можно сказать, что jit несущественно увеличивает скорость работы, как и load-grunt-tasks, но ожидал я куда большего.
Типичные задачи
Теперь проведем тест типичной ситуации — разработка проекта. Получается, что разработчик что-то пишет, а Grunt на лету компилирует.
Стандартная задача
Довольно неплохой результат:
Универсальный загрузчик
В среднем получается даже медленнее, чем с загрузкой плагинов описанной, как в документации:
Отложенная загрузка плагинов
Даже сказать нечего — всё так же, но с маленькой поправкой:
Выводы
Если ваш проект подразумевает большое количество полных сборок от и до, то стоит обратить внимание на плагины jit-grunt (Just In Time) и load-grunt-tasks. Чисто визуально jit шустрее, но по цифрам как-то не скажешь, зато в консольку красиво выводится блоками.
Если же ваш проект активно развивается, и что-то часто дописывается (иначе зачем вообще Grunt?), то толку от этих двух плагинов вообще нет.