J'ai donc essayé Gulp pour voir comment il se compare à Grunt en ce qui concerne la vitesse et je suis assez impressionné par les résultats, mais j'ai une chose que je ne sais pas comment faire à Gulp.
J'ai donc cette tâche de gulp pour minimiser HTML:
gulp.task('html-minify', function() {
var files = [
relativePaths.webPath + '/*.html',
relativePaths.webPath + '/components/**/*.html',
relativePaths.webPath + '/' + relativePaths.appPath + '/components/**/*.html'
];
var changedFiles = buildMetaData.getChangedFiles(files);
//TODO: needs to execute only after successful run of the task
buildMetaData.addBuildMetaDataFiles(changedFiles);
buildMetaData.writeFile();
return gulp.src(changedFiles, {
base: relativePaths.webPath
})
.pipe(filelog())
.pipe(minifyHtml({
empty: true,
quotes: true,
conditionals: true,
comments: true
}))
.pipe(gulp.dest(relativePaths.webPath + '/' + relativePaths.appPath + '/' + relativePaths.buildPath));
});
L'objet buildMetaData a des fonctionnalités personnalisées dont j'ai besoin et pourquoi je ne peux pas utiliser de plugins comme gulp-changed. Ce que j'essaie de comprendre, c'est comment (si possible) exécuter un bloc de code une fois la minification terminée, traiter tous les fichiers et les exécuter correctement. Est-ce que quelque chose comme ça est possible avec gulp?
Vous pouvez simplement effectuer une tâche qui dépend de html-minify
:
gulp.task('other-task', ['html-minify'], function() {
//stuff
});
Vous pouvez également écouter l'événement de flux end
dans le html-minify
tâche:
gulp.task('html-minify', function(done) {
var files = [
relativePaths.webPath + '/*.html',
relativePaths.webPath + '/components/**/*.html',
relativePaths.webPath + '/' + relativePaths.appPath + '/components/**/*.html'
];
var changedFiles = buildMetaData.getChangedFiles(files);
//TODO: needs to execute only after successful run of the task
buildMetaData.addBuildMetaDataFiles(changedFiles);
buildMetaData.writeFile();
var stream = gulp.src(changedFiles, {
base: relativePaths.webPath
})
.pipe(filelog())
.pipe(minifyHtml({
empty: true,
quotes: true,
conditionals: true,
comments: true
}))
.pipe(gulp.dest(relativePaths.webPath + '/' + relativePaths.appPath + '/' + relativePaths.buildPath));
stream.on('end', function() {
//run some code here
done();
});
stream.on('error', function(err) {
done(err);
});
});
Vous pouvez également fusionner deux flux avec avec event-stream . Cet exemple prend l'entrée de la ligne de commande avec yargs , crée une configuration puis fusionne les deux:
var enviroment = argv.env || 'development';
gulp('build', function () {
var config = gulp.src('config/' + enviroment + '.json')
.on('end', function() { gutil.log(warn('Configured ' + enviroment + ' enviroment.')); })
.pipe(ngConstant({name: 'app.config'}));
var scripts = gulp.src('js/*');
return es.merge(config, scripts)
.pipe(concat('app.js'))
.pipe(gulp.dest('app/dist'))
.on('error', function() { });
});
En plus du standard avant les tâches , vous pouvez également attendre la fin d'une tâche précédente. Ceci est utile lorsque vous devez passer des arguments à la tâche avant (que gulp ne prend pas en charge actuellement):
var tasks = {
before: function(arg){
// do stuff
},
build: function() {
tasks.before(arg).on('end', function(){ console.log('do stuff') });
}
};
gulp('build', tasks.build);
Utilisation des tâches de dépendance:
gulp.task('qr-task', ['md-task', 'js-task'], function() {
gulp.src(src + '/*.qr')
.pipe(plugin())
.pipe(gulp.dest(dist));
});
Bien que la tâche principale démarre après toutes les tâches dépendantes mais qu'elles (tâches dépendantes) s'exécuteront en parallèle (en une seule fois), alors ne supposez pas que le les tâches commenceront/se termineront dans l'ordre ( md et js s'exécutent en parallèle avant qr ).
Si vous voulez un ordre exact pour plusieurs tâches et que vous ne voulez pas les diviser, vous pouvez utiliser async et attendre pour y parvenir:
function Async(p) {
return new Promise((res, rej) => p.on('error', err => rej(err)).on('end', () => res()));
}
gulp.task('task', async () => {
await Async(gulp.src(src + '/*.md')
.pipe(plugin())
.pipe(gulp.dest(dist)));
await Async(gulp.src(src + '/*.js')
.pipe(plugin())
.pipe(gulp.dest(dist)));
await Async(gulp.src(src + '/*.qr')
.pipe(plugin())
.pipe(gulp.dest(dist)));
});
dans gulp 4, l'ancien modèle de dépendance est supprimé et vous obtiendrez cette erreur:
AssertionError [ERR_ASSERTION]: Task function must be specified
à la place, vous devez utiliser gulp.parallel et gulp.series (qui permet une exécution correcte des tâches):
gulp.task('qr-task', gulp.series('md-task', 'js-task', function(done) {
gulp.src(src + '/*.qr')
.pipe(plugin())
.pipe(gulp.dest(dist));
done();
}));
pour plus de détails, visitez https://github.com/gulpjs/gulp/blob/4.0/docs/API.md