while una tabla repetitivos obtener loop for event ejemplos datos crear con ciclos ciclo agregar javascript gulp

una - event loop javascript



creando tareas usando un loop (5)

Intento crear dinámicamente tareas (minify y concat) basadas en el objeto jsFiles . La clave dará el nombre del archivo de destino y la matriz contiene los archivos src . Cuando ejecuto gulp, veo que se ejecutan todos los nombres de las tareas, pero solo escribe la última clave que es group2.js en este caso. ¿Qué pasa aquí?

// imports here var jsFiles = { group1:[file1.js,file2.js], group2:[file2.js,file3.js] }; for (var key in jsFiles) { gulp.task(key, function() { return gulp.src(jsFiles[key]) .pipe(jshint()) .pipe(uglify()) .pipe(concat(key + ''.js'')) // <- HERE .pipe(gulp.dest(''public/js'')); }); } var defaultTasks = []; for (var key in jsFiles) { defaultTasks.push(key); } gulp.task(''default'', defaultTasks);


Capture el valor de la variable ''clave'' en cada iteración usando IIFE. En su ejemplo, en el momento del ciclo de invocación de concat ya habrá finalizado y la clave variable tendrá el último valor.

for (var key in jsFiles) { (function(key) { gulp.task(key, function() { return gulp.src(jsFiles[key]) .pipe(jshint()) .pipe(uglify()) .pipe(concat(key + ''.js'')) // <- HERE .pipe(gulp.dest(''public/js'')); }); })(key); }

Para una explicación detallada, vea los cierres de esta función - Evitar la sección Problema de referencia


Otra opción es usar funciones de bucle de matriz funcional combinadas con Object.keys , de esta manera:

var defaultTasks = Object.keys(jsFiles); defaultTasks.forEach(function(taskName) { gulp.task(taskName, function() { return gulp.src(jsFiles[taskName]) .pipe(jshint()) .pipe(uglify()) .pipe(concat(key + ''.js'')) .pipe(gulp.dest(''public/js'')); }); });

Siento que esto es un poco más limpio, porque tienes el bucle y la función en el mismo lugar, por lo que es más fácil de mantener.


Solución basada en jslinterrors.com/dont-make-functions-within-a-loop:

var jsFiles = { group1:[file1.js,file2.js], group2:[file2.js,file3.js] }; function createTask(key) { return gulp.src(jsFiles[key]) .pipe(jshint()) .pipe(uglify()) .pipe(concat(key + ''.js'')) .pipe(gulp.dest(''public/js'')); } for (var key in jsFiles) { createTask(key); } var defaultTasks = []; for (var key in jsFiles) { defaultTasks.push(key); } gulp.task(''default'', defaultTasks);


La solución cmancre funciona bien ... pero aquí la modificada y funcional que estoy usando actualmente:

var jsFiles = { group1:[file1.js,file2.js], group2:[file2.js,file3.js] }; var defaultTasks = []; function createTask(key) { gulp.task(key, function() { return gulp.src(jsFiles[key]) .pipe(uglify()) .pipe(concat(key + ''.js'')) .pipe(rename({suffix: ".min"})) //Will create group1.min.js .pipe(gulp.dest(''./assets/js'')); }); } for (var key in jsFiles) { createTask(key); defaultTasks.push(key); } gulp.task(''default'', defaultTasks, function(){ for (var key in jsFiles) { //Will watch each js defined in group1 or group2 gulp.watch(jsFiles[key], [key]) } });


Usando Gulp # 4.0, me gusta el uso de gulp.parallel () como:

var plugins = require(''gulp-load-plugins''); var $ = plugins(); var jsFiles = { // Libraries required by Foundation "jquery" : [ "bower_components/jquery/dist/jquery.js", "bower_components/motion-ui/dist/motion-ui.js", "bower_components/what-input/dist/what-input.js" ], "angular" : [ "bower_components/angular/angular.min.js", "bower_components/angular-animate/angular-animate.min.js", "bower_components/angular-aria/angular-aria.min.js", "bower_components/angular-material/angular-material.min.js", "bower_components/angular-messages/angular-messages.min.js", "bower_components/angular-sanitize/angular-sanitize.min.js", "bower_components/angular-ui-i18n/angular-ui-i18n.min.js" ], // Core Foundation files "foundation-sites" : [ "bower_components/foundation-sites/dist/js/foundation.js" ], // Dropzone Library "dropzone" : [ "bower_components/dropzone/dist/dropzone.js", "bower_components/ng-dropzone/dist/ng-dropzone.min.js" ] }; var defaultTasks = Object.keys(jsFiles); defaultTasks.forEach(function (libName) { gulp.task( ''scripts:''+libName, function () { return gulp.src(jsFiles[libName]) //.pipe($.jshint()) // if you want it //.pipe($.uglify()) // if you like it //.pipe($.concat(libName+''.js'')) // .min.js if you Uglified it .pipe(gulp.dest(''dist/lib/''+libName)); }); }); gulp.task( ''bundle_javascript_dependencies'', gulp.parallel( defaultTasks.map(function(name) { return ''scripts:''+name; }) ) ); gulp.task(''build'', gulp.series( ''clean'', gulp.parallel( /* Any other task of function */ ''bundle_javascript_dependencies'' ) ) );

¡Trabajando para mí y me encanta! Gracias a OverZealous por mostrarme el camino.