Digamos, por ejemplo, que está creando un proyecto en Backbone o lo que sea y necesita cargar scripts en un orden determinado, por ejemplo underscore.js
, debe cargarse antes backbone.js
.
¿Cómo consigo que concatene los scripts para que estén en orden?
// JS concat, strip debugging and minify
gulp.task('scripts', function() {
gulp.src(['./source/js/*.js', './source/js/**/*.js'])
.pipe(concat('script.js'))
.pipe(stripDebug())
.pipe(uglify())
.pipe(gulp.dest('./build/js/'));
});
Tengo el orden correcto de los scripts en mi source/index.html
, pero dado que los archivos están organizados por orden alfabético, gulp se concatenará underscore.js
después backbone.js
, y el orden de los scripts en mi source/index.html
no importa, mira los archivos en el directorio.
Entonces, ¿alguien tiene una idea sobre esto?
La mejor idea que tengo es cambiar el nombre de los proveedores con los scripts 1
, 2
, 3
para darles el orden correcto, pero no estoy seguro de si me gusta este.
A medida que aprendí más, descubrí que Browserify es una gran solución, puede ser un dolor al principio, pero es genial.
fuente
require
en la parte frontal porque, por supuesto, si ha usado npm en el lado del servidor, verá cómo puede requerir módulos, pero browserify le permite hacerlo en el código del lado del cliente, mantenga para comenzar, requiere un poco de retoques, pero está principalmente dentro de package.json y si quieres usarlo con gulp.js o grunt.js. Si instala el paquete gulp / grunt browserify puede ejecutargulp/grunt browserify
y convertir su script en un script principal, es una ligera curva de aprendizaje pero vale la pena en mi opinión.browserify
paraAngular
módulos, donde las obras de concatenación simples y el orden no importa :)Respuestas:
Recientemente tuve un problema similar con Grunt al construir mi aplicación AngularJS. Aquí hay una pregunta que publiqué.
Lo que terminé haciendo es enumerar explícitamente los archivos en orden en la configuración de gruñido. El archivo de configuración se verá así:
Grunt es capaz de descubrir qué archivos son duplicados y no incluirlos. La misma técnica también funcionará con Gulp.
fuente
Otra cosa que ayuda si necesita que algunos archivos vengan después de una gran cantidad de archivos, es excluir archivos específicos de su globo, de esta manera:
Puede combinar esto con archivos de especificación que deben aparecer primero como se explica en la respuesta de Chad Johnson.
fuente
src
ybuild
te vi usando esa sintaxis, terminé borrando esa parte porque no estaba seguro exactamente por qué lo necesitaba, tiene sentido ahora.['./source/js/*.js', './source/js/**/underscore.js', './source/js/**/!(underscore)*.js']
!(foobar)
) si ha incluido un archivo específico de antemano.['src/app/**/!(*-)*.js', 'src/app/**/*.js']
He utilizado el complemento gulp-order pero no siempre es exitoso, como puede ver en mi módulo de nodo de desbordamiento posterior al orden de desbordamiento de pila con flujos combinados . Al navegar por los documentos de Gulp, me encontré con el módulo streamque que ha funcionado bastante bien para especificar el orden de la concatenación en mi caso. https://github.com/gulpjs/gulp/blob/master/docs/recipes/using-multiple-sources-in-one-task.md
Ejemplo de cómo lo usé a continuación
fuente
Con gulp-useref puede concatenar cada script declarado en su archivo de índice, en el orden en que lo declara.
https://www.npmjs.com/package/gulp-useref
Y en el HTML debe declarar el nombre del archivo de compilación que desea generar, así:
En su directorio de compilación tendrá la referencia a main.min.js que contendrá vendor.js, test.js y main.js
fuente
La secuencia de clasificación también se puede utilizar para garantizar un orden específico de los archivos
gulp.src
. Código de muestra que coloca elbackbone.js
siempre como el último archivo para procesar:fuente
Solo agrego números al comienzo del nombre del archivo:
Funciona en trago sin ningún problema.
fuente
Tengo mis scripts organizados en diferentes carpetas para cada paquete que extraigo de bower, además de mi propio script para mi aplicación. Dado que va a enumerar el orden de estos scripts en algún lugar, ¿por qué no simplemente enumerarlos en su archivo Gulp? Para los nuevos desarrolladores en su proyecto, es bueno que todos los puntos finales de su script estén listados aquí. Puedes hacer esto con gulp-add-src :
gulpfile.js
Nota: jQuery y Bootstrap se agregaron con fines de demostración del pedido. Probablemente sea mejor usar CDN para aquellos, ya que son muy utilizados y los navegadores ya podrían tenerlos en caché de otros sitios.
fuente
Prueba la serie de transmisiones . Funciona como merge-stream / event-stream.merge () excepto que en lugar de intercalar, se agrega al final. No requiere que especifique el modo de objeto como streamqueue , por lo que su código sale más limpio.
fuente
merge2 parece ser la única herramienta de fusión de flujo ordenada en funcionamiento y mantenida en este momento.
Actualización 2020
Las API siempre cambian, algunas bibliotecas se vuelven inutilizables o contienen vulnerabilidades, o sus dependencias contienen vulnerabilidades que no se arreglan durante años. Para manipulaciones de archivos de texto, es mejor que use scripts personalizados de NodeJS y bibliotecas populares como
globby
yfs-extra
junto con otras bibliotecas sin envoltorios Gulp, Grunt, etc.fuente
Un método alternativo es usar un complemento Gulp creado específicamente para este problema. https://www.npmjs.com/package/gulp-ng-module-sort
Le permite ordenar sus scripts agregando un
.pipe(ngModuleSort())
como tal:Asumiendo una convención de directorio de:
¡Espero que esto ayude!
fuente
Para mí tenía natualSort () y angularFileSort () en la tubería que estaba reordenando los archivos. Lo quité y ahora funciona bien para mí.
fuente
Solo uso gulp-angular-filesort
fuente
Estoy en un entorno de módulo donde todos son dependientes del núcleo que usan gulp. Entonces el
core
módulo debe agregarse antes que los demás.Lo que hice:
src
carpetagulp-rename
tucore
directorio para_core
trago está manteniendo el orden de tu
gulp.src
, mi concat sesrc
ve así:Obviamente, tomará el
_
primer directorio de la lista (¿clasificación natural?).Nota (angularjs): luego uso gulp-angular-extender para agregar dinámicamente los módulos al
core
módulo. Compilado se ve así:Donde Admin y Productos son dos módulos.
fuente
si desea solicitar dependencias de bibliotecas de terceros, intente wiredep . Este paquete básicamente verifica la dependencia de cada paquete en bower.json y luego los conecta por usted.
fuente
Probé varias soluciones desde esta página, pero ninguna funcionó. Tenía una serie de archivos numerados que simplemente quería ordenar por nombre de carpeta alfabético, por lo que cuando se canalizaba a
concat()
estarían en el mismo orden. Es decir, preservar el orden de la entrada global. Fácil, verdad?Aquí está mi código específico de prueba de concepto (
print
es solo para ver el orden impreso en el cli):La razón de la locura de
gulp.src
? Determiné que segulp.src
estaba ejecutando de forma asincrónica cuando pude usar unasleep()
función (usando un.map
de sueño incrementado por índice) para ordenar la salida de la secuencia correctamente.El resultado del asíncrono de los directorios
src
medios con más archivos vino después de los directorios con menos archivos, porque tomaron más tiempo procesarlos.fuente
En mi configuración de gulp, primero estoy especificando los archivos del proveedor y luego especificando todo (más general), en segundo lugar. Y coloca con éxito al vendedor js antes que otras cosas personalizadas.
fuente
Aparentemente, puede pasar la opción "nosort" a gulp.src gulp.src .
fuente