gulp: uglify и sourcemaps

Я использую gulp.

Я хотел бы иметь один или несколько JS-файлов (скажем, jQuery), чтобы объединить их в один, минимизировать его и записать в папку распространения.

вот как я это делаю:

minifyJS(['/js/myModule.file1.js',
          '/js/myModule.file2.js'], '/dist/js', 'myModule')

функции:

function minifyJS(sourceFiles, destinationFolder, filenameRoot) {
    return gulp.src(sourceFiles)
        .pipe(plumber())

        // .pipe(sourcemaps.init()) here ???
        .pipe(concat(filenameRoot + '.js'))
        .pipe(sourcemaps.init()) // or here ???

        .pipe(gulp.dest(destinationFolder)) // save .js
        .pipe(uglify({ preserveComments: 'license' }))
        .pipe(rename({ extname: '.min.js' }))
        .pipe(gulp.dest(destinationFolder)) // save .min.js
        .pipe(sourcemaps.write('maps'))
        .pipe(gulp.dest(destinationFolder)) // save .map
}

в чем я не уверен-это sourcemaps.init() расположение...

должен ли я создать несколько (2 в моем случае) файлов карт (что было бы неплохо, если поддерживается браузерами) или только один ( / карты / myModule.карта)?

1 ответов


так вот как sourcemaps работают в Gulp: каждый элемент, который вы выбираете через gulp.src переносится в виртуальный файловый объект, состоящий из содержимого буфера, а также исходного имени файла. Они проходят через ваш поток, где содержимое преобразуется.

если вы добавляете sourcemaps, вы добавляете еще одно свойство к этим виртуальным файловым объектам, а именно sourcemap. С каждым преобразованием, sourcemap также преобразуется. Итак, если вы инициализируете sourcemaps после concat и до uglify, sourcemaps хранит преобразования из этого конкретного шага. Исходная карта "думает", что исходные файлы являются результатом concat, и единственный шаг преобразования, который имел место, - это шаг uglify. Поэтому, когда вы открываете их в своем браузере, ничто не будет соответствовать.

это лучше, что вы размещаете sourcemaps непосредственно после подстановки, и сохранить их непосредственно перед сохранением результатов. Gulp sourcemaps будет интерполироваться между преобразования, так что вы следите за каждым изменением, которое произошло. Исходные исходные файлы будут выбраны вами, а исходная карта будет отслеживать эти исходные файлы.

Это ваш поток:

 return gulp.src(sourceFiles)
    .pipe(sourcemaps.init())
    .pipe(plumber())
    .pipe(concat(filenameRoot + '.js'))
    .pipe(gulp.dest(destinationFolder)) // save .js
    .pipe(uglify({ preserveComments: 'license' }))
    .pipe(rename({ extname: '.min.js' }))
    .pipe(sourcemaps.write('maps'))
    .pipe(gulp.dest(destinationFolder)) // save .min.js

sourcemaps.write на самом деле не пишет sourcemaps, он просто говорит Gulp материализовать их в физический файл при вызове gulp.dest.

тот же плагин sourcemap будет включен в Gulp 4 Изначально: http://fettblog.eu/gulp-4-sourcemaps/ -- Если вы хотите получить более подробную информацию о том, как sourcemaps работают внутри с Gulp, они находятся в главе 6 моей книги Gulp:http://www.manning.com/baumgartner