Выполнение базового теста, чтобы увидеть, есть ли разница в производительности между выполнением concat
и затем uglify
по сравнению с выполнением только uglify
.
package.json
{
"name": "grunt-concat-vs-uglify",
"version": "0.0.1",
"description": "A basic test to see if we can ditch concat and use only uglify for JS files.",
"devDependencies": {
"grunt": "^0.4.5",
"grunt-contrib-concat": "^0.5.0",
"grunt-contrib-uglify": "^0.6.0",
"load-grunt-tasks": "^1.0.0",
"time-grunt": "^1.0.0"
}
}
Gruntfile.js
module.exports = function (grunt) {
// Display the elapsed execution time of grunt tasks
require('time-grunt')(grunt);
// Load all grunt-* packages from package.json
require('load-grunt-tasks')(grunt);
grunt.initConfig({
paths: {
src: {
js: 'src/**/*.js'
},
dest: {
js: 'dist/main.js',
jsMin: 'dist/main.min.js'
}
},
concat: {
js: {
options: {
separator: ';'
},
src: '<%= paths.src.js %>',
dest: '<%= paths.dest.js %>'
}
},
uglify: {
options: {
compress: true,
mangle: true,
sourceMap: true
},
target: {
src: '<%= paths.src.js %>',
dest: '<%= paths.dest.jsMin %>'
}
}
});
grunt.registerTask('default', 'concat vs. uglify', function (concat) {
// grunt default:true
if (concat) {
// Update the uglify dest to be the result of concat
var dest = grunt.config('concat.js.dest');
grunt.config('uglify.target.src', dest);
grunt.task.run('concat');
}
// grunt default
grunt.task.run('uglify');
});
};
В src
я положил кучу JS-файлов, в том числе несжатый исходник jQuery, несколько раз скопировал, разложил по подпапкам. Гораздо больше, чем обычно есть на обычном сайте/приложении.
Оказывается, время, необходимое для объединения и сжатия всех этих файлов, практически одинаково в обоих сценариях.
За исключением использования параметра sourceMap: true
и для concat
(см. ниже).
На моем компьютере:
grunt default : 6.2s (just uglify)
grunt default:true : 6s (concat and uglify)
Стоит отметить, что результат main.min.js
одинаков в обоих случаях.
Кроме того, uglify
автоматически заботится об использовании правильного разделителя при объединении файлов.
Единственный случай, когда это имеет значение, — это добавление sourceMap: true
к concat
options
.
Это создает файл main.js.map
рядом с main.js
и приводит к следующему результату:
grunt default : 6.2s (just uglify)
grunt default:true : 13s (concat and uglify)
Но если рабочий сайт загружает только версию min
, этот вариант бесполезен.
Я обнаружил серьезный недостаток использования concat
перед uglify
.
Когда в одном из JS-файлов возникает ошибка, sourcemap
будет ссылаться на объединенный файл main.js
, а не на исходный файл. Когда uglify
выполнит всю работу, он будет ссылаться на исходный файл.
Обновление:
Мы можем добавить еще 2 параметра в uglify
, которые свяжут исходную карту uglify
с исходной картой concat
, тем самым устраняя «недостаток», о котором я упоминал выше.
uglify: {
options: {
compress: true,
mangle: true,
sourceMap: true,
sourceMapIncludeSources: true,
sourceMapIn: '<%= paths.dest.js %>.map',
},
target: {
src: '<%= paths.src.js %>',
dest: '<%= paths.dest.jsMin %>'
}
}
Но это кажется крайне ненужным.
Вывод
Я думаю, можно с уверенностью заключить, что мы можем отказаться от concat
для файлов JS, если мы используем uglify
, и использовать его для других целей, когда это необходимо.
person
Alex Ilyaev
schedule
12.12.2014
concat
, но решил использовать толькоuglify
, который делает все, что нужно, как вы указали. Я предполагаю, что некоторые люди используют оба, чтобы компенсировать сложность своих проектов или потому, что они предпочитают, чтобыuglify
делал только то, что он делает, кроме конкатенации.concat
также позволяет использовать разделители, чегоuglify
, насколько мне известно, нет. - person Wallace Sidhrée   schedule 21.03.2014