uglify multiple es6 and javascript typescript gulp uglifyjs gulp-sourcemaps

javascript - multiple - gulp uglify es6



Gulp: Genera mapas de origen para scripts minificados y no minificados (2)

Parece una especie de truco, pero funciona

gulp.src(''TypeScript/Test.ts'') .pipe(plumber()) .pipe(sourcemaps.init()) .pipe(ts(tsOptions)).js .pipe(sourcemaps.write(''.'')) .pipe(gulp.dest(''./wwwroot/test'')) .pipe(uglify()) .pipe(rename({ extname: ''.min.js'' })) .pipe(sourcemaps.write(''.'')) .pipe(gulp.dest(''./wwwroot/test''));

La magia está en el plumber . Fontanero evita detener el proceso en la excepción. Pero el interés principal por qué ocurre una excepción. Entonces, está bastante claro. En su código, crea el mapa de origen a través de .pipe(sourcemaps.write(''.'')) // Write sourcemap for non-minified version y luego trata de reutilizarlo. Y sí, el mapa de origen no es js, y ocurre una excepción. Con plumber esta excepción lo ignora y logra su objetivo.

Pero podría haber averiguado algo mal, te recomiendo que encuentres una solución más verdadera.

Soy nuevo en tragar y me he encontrado con un problema que probablemente sea un escenario bastante común. Lo que intento hacer es compilar un texto mecanografiado en javascript, crear un mapa fuente para él y luego ejecutar uglify. Me gustaría tener un mapa de origen para js ugliyfied así como para js no uglified.

Lo que intento lograr es la siguiente estructura de archivos:

framework.js framework.js.map < this won''t work framework.min.js framework.min.js.map

Esta es mi tarea trago:

var gulp = require(''gulp''), uglify = require(''gulp-uglify'') ts = require("gulp-typescript") sourcemaps = require(''gulp-sourcemaps'') rename = require(''gulp-rename''); var tsProject = ts.createProject("tsconfig.json"); gulp.task(''typescript'', function(){ tsProject.src() .pipe(sourcemaps.init()) .pipe(tsProject()).js .pipe(sourcemaps.write(''.'')) // Write sourcemap for non-minified version .pipe(gulp.dest("dist")) .pipe(uglify()) // Code will fail here .pipe(rename({suffix:''.min''})) .pipe(sourcemaps.write(''.'')) // Write sourcemap for minified version. .pipe(gulp.dest("dist")); }); gulp.task(''default'', [''typescript'']);

Como puede ver, estoy ejecutando sourcemaps.write () dos veces para obtener los dos archivos diferentes. Esto me da un error

tream.js:74 throw er; // Unhandled stream error in pipe. ^ GulpUglifyError: unable to minify JavaScript at createError (C:/Users/alexa/Dropbox/code/Web/mhadmin/framework/node_modules/gulp-uglify/lib/create-error.js:6:14)

Salir de la primera de las llamadas sourcemap.write () dará como resultado un mapa de origen correcto para la versión minimizada del archivo.

Alguna idea de cómo solucionar este problema?

EDITAR: Esto no es exactamente un duplicado de gulp: uglify y sourcemaps, ya que necesito escribir múltiples mapas de origen con múltiples llamadas a gulp.dest ()


El problema es que después del primer .pipe(sourcemaps.write(''.'')) Tienes dos archivos en tu transmisión:

framework.js framework.js.map

Usted escribe esos dos archivos en el sistema de archivos (lo cual está bien), pero luego intenta ejecutar uglify() en ambos. Como su archivo framework.js.map no es un archivo JavaScript y no contiene un código JavaScript válido, el plugin uglify() lanza.

Después de haber escrito framework.js.map en el sistema de archivos, realmente no hay razón para mantener ese archivo en la transmisión. El objeto de archivo vinyl para framework.js todavía tiene una propiedad .sourceMap que lleva todas las transformaciones hasta el momento, lo que significa que puede simplemente eliminar el archivo framework.js.map de la transmisión.

El plugin gulp-filter permite hacer eso:

var filter = require(''gulp-filter''); gulp.task(''typescript'', function(){ return tsProject.src() .pipe(sourcemaps.init()) .pipe(tsProject()).js .pipe(sourcemaps.write(''.'')) .pipe(gulp.dest("dist")) .pipe(filter(''**/*.js'')) // only let JavaScript files through here .pipe(uglify()) .pipe(rename({suffix:''.min''})) .pipe(sourcemaps.write(''.'')) .pipe(gulp.dest("dist")); });

Después de .pipe(filter(''**/*.js'')) solo el archivo framework.js estará en la transmisión y uglify() no volverá a aparecer.