Frontend-Webdevelopment mit Gulp Task sequentiell abarbeiten ist bei modernen Webdesign nötig. Dabei sind Gulp-Tasks ein wichtiger Bestandteil dieser tollen neuen Technologie. Gulp ist eine NodeJS Applikation, die natürlich auch in der Prozessverarbeitung ihre großen Vorzüge bezüglich der Performance hat. Asynchrone Prozessverarbeitung. Damit tun sich traditionelle Webdeveloper, gerade aus der PHP-Welt recht schwer. Hier findet man sich dann schnell in der sogenannten Callback-Hell wieder. An diesem Punkt sollte man sich natürlich fragen, ob man die richtige Technologie für das zu lösende Problem gewählt hat.
Gulp Task sequentiell ausführen – TYPO3 Gulp
In einer TYPO3 Migration von 6.2 auf 7.6 bin ich vor kurzem auf eine Herausforderung mit Gulp gestoßen. Hier war es wichtig die CSS-Files und JS-Files erst zu minimieren und dann an die richtige Stelle zu meiner Design Extension zu exportieren. So konnte unabhängig im Front- und Backend im Team gearbeitet werden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
const gulp = require('gulp'); const debug = require('gulp-debug'); const gulpLoadPlugins = require('gulp-load-plugins'); const wiredep = require('wiredep').stream; const del = require('del'); const runSequence = require('run-sequence'); const $ = gulpLoadPlugins(); var stylesTarget = 'Resources/Public/Styles/'; var scriptsTarget = 'Resources/Public/Scripts'; var imagesTarget = 'Resources/Public/Images'; var fontsTarget = 'Resources/Public/Fonts'; gulp.task('clean-styles', del.bind(null, [stylesTarget])); gulp.task('styles', () => { return gulp.src('../../rogoit-design/app/Styles/*.scss') .pipe(debug()) .pipe($.plumber()) .pipe($.sourcemaps.init()) .pipe($.sass.sync({ outputStyle: 'expanded', precision: 10, includePaths: ['.'] }).on('error', $.sass.logError)) .pipe($.autoprefixer({browsers: ['> 1%', 'last 2 versions', 'Firefox ESR']})) .pipe($.sourcemaps.write()) .pipe(gulp.dest(stylesTarget)); }); gulp.task('clean-scripts', del.bind(null, [scriptsTarget])); gulp.task('scripts', () => { // ['lint'], return gulp.src('../../rogoit-design/app/Scripts/**/*.js') .pipe(debug()) .pipe($.plumber()) .pipe($.babel()) .pipe(gulp.dest(scriptsTarget)); }); gulp.task('vendor-scripts', () => { // ['lint'], return gulp.src(['../../rogoit-design/dist/Scripts/vendor/**/*', '../../rogoit-design/dist/Scripts/vendor.js']) .pipe(debug()) .pipe(gulp.dest('Resources/Public/Scripts/vendor')); }); gulp.task('clean-images', del.bind(null, [imagesTarget])); gulp.task('images', () => { return gulp.src('../../rogoit-design/app/Images/**/*') .pipe(debug()) .pipe($.imagemin({ progressive: true, interlaced: true, svgoPlugins: [{cleanupIDs: false}] })) .pipe(gulp.dest(imagesTarget)); }); gulp.task('clean-fonts', del.bind(null, [fontsTarget])); gulp.task('fonts', () => { return gulp.src(require('main-bower-files')('**/*.{eot,svg,ttf,woff,woff2}', function (err) {}) .concat('../../rogoit-design/app/Fonts/**/*')) .pipe(debug()) .pipe(gulp.dest(fontsTarget)); }); function lint(files, options) { return gulp.src(files) .pipe($.eslint(options)) .pipe($.eslint.format()); } gulp.task('lint', () => { return lint('../../rogoit-design/Scripts/**/*.js', { fix: true }) .pipe(gulp.dest(scriptsTarget)); }); gulp.task('compress', ['styles', 'scripts'], () => { return gulp.src(['Resources/Public/**/*']) .pipe(debug()) .pipe($.if('*.js', $.uglify())) .pipe($.if('*.css', $.cssnano({safe: true, autoprefixer: false}))) .pipe(gulp.dest('Resources/Public')); }); gulp.task('default', function(done) { runSequence('clean-styles', 'clean-scripts', 'clean-images', 'clean-fonts','styles', 'scripts', 'vendor-scripts', 'fonts', 'images', 'compress', function() { console.log('All tasks finished'); done(); }); }); |
Das hier ist das gesamte Script des Projekts. Vielleicht kann sich hier der eine oder andere entsprechend inspirieren. Grundsätzlich werden hier die Webfolder bzw. Targets geleert, die neuen Files hinein kopiert und dann komprimiert. Diese Prozesse können Aufgrund ihrer Aufgabenreihenfolge nicht asynchron abgearbeitet werden. Hier sind die entscheidenen Zeilen:
1 2 3 4 5 6 7 8 9 10 |
const runSequence = require('run-sequence'); . . . gulp.task('default', function(done) { runSequence('clean-styles', 'clean-scripts', 'clean-images', 'clean-fonts','styles', 'scripts', 'vendor-scripts', 'fonts', 'images', 'compress', function() { console.log('All tasks finished'); done(); }); }); |
Man nutzt die „run-sequence“ Bibliothek, damit man die Tasks im default Prozess sequentiell ausführen kann.
1 Kommentar
Heads up: Ab gulp 4 wird kein Plugin mehr dafür nötig sein: https://github.com/gulpjs/gulp/blob/4.0/docs/API.md#gulpseriestasks