Gulp를 사용하여 파일 연결 및 Uglify


124

Gulp를 사용하여 다음을 수행하려고합니다.

  1. 3 개의 특정 자바 스크립트 파일을 가져 와서 연결 한 다음 결과를 파일 (concat.js)에 저장합니다.
  2. 이 연결된 파일을 가져 와서 uglify / minify 한 다음 결과를 다른 파일 (uglify.js)에 저장합니다.

지금까지 다음 코드가 있습니다.

    var gulp = require('gulp'),
        gp_concat = require('gulp-concat'),
        gp_uglify = require('gulp-uglify');

    gulp.task('js-fef', function(){
        return gulp.src(['file1.js', 'file2.js', 'file3.js'])
            .pipe(gp_concat('concat.js'))
            .pipe(gp_uglify())
            .pipe(gulp.dest('js'));
    });

    gulp.task('default', ['js-fef'], function(){});

그러나 uglify 작업이 작동하지 않거나 어떤 이유로 파일이 생성되지 않습니다.

이렇게하려면 어떻게해야합니까?


3
아직 볼 수 없다는 것에 놀랐 기 때문에 목표 자체가 Gulp의 철학에 다소 위배된다는 점을 빠르게 언급하고 싶습니다. 중간 파일을 작성하는 것은 Grunt 작업 방식에 가깝습니다. Gulp는 속도를 향상시키기 위해 스트림을 촉진합니다. 그러나 나는 그 사람이 그의 이유를 가지고 있다고 확신합니다 :).
Bart

나는 그것이 오래된 스레드라는 것을 알고 있지만 yaml 파일을 사용하여 이러한 종류의 작업을 매우 쉽게 수행 할 수 있도록 npm 모듈을 만들었습니다. 그것을 확인하십시오 : github.com/Stnaire/gulp-yaml-packages .
Stnaire

답변:


161

gulp-rename'uglification'전에 먼저 연결된 파일 을 사용 하고 출력 해야한다는 것이 밝혀졌습니다 . 코드는 다음과 같습니다.

var gulp = require('gulp'),
    gp_concat = require('gulp-concat'),
    gp_rename = require('gulp-rename'),
    gp_uglify = require('gulp-uglify');

gulp.task('js-fef', function(){
    return gulp.src(['file1.js', 'file2.js', 'file3.js'])
        .pipe(gp_concat('concat.js'))
        .pipe(gulp.dest('dist'))
        .pipe(gp_rename('uglify.js'))
        .pipe(gp_uglify())
        .pipe(gulp.dest('dist'));
});

gulp.task('default', ['js-fef'], function(){});

에서 오는 grunt그것은 약간 처음에는 혼란하지만 지금은 의미가 있었다. 나는 그것이 gulp멍청한 사람들에게 도움이되기를 바랍니다 .

소스 맵이 필요한 경우 업데이트 된 코드는 다음과 같습니다.

var gulp = require('gulp'),
    gp_concat = require('gulp-concat'),
    gp_rename = require('gulp-rename'),
    gp_uglify = require('gulp-uglify'),
    gp_sourcemaps = require('gulp-sourcemaps');

gulp.task('js-fef', function(){
    return gulp.src(['file1.js', 'file2.js', 'file3.js'])
        .pipe(gp_sourcemaps.init())
        .pipe(gp_concat('concat.js'))
        .pipe(gulp.dest('dist'))
        .pipe(gp_rename('uglify.js'))
        .pipe(gp_uglify())
        .pipe(gp_sourcemaps.write('./'))
        .pipe(gulp.dest('dist'));
});

gulp.task('default', ['js-fef'], function(){});

옵션 및 구성에 대한 자세한 내용은 gulp-sourcemaps 를 참조하십시오 .


참고로 concat.js 앞에 작은 따옴표가 없습니다. 반품 명세서 뒤의 줄은 다음과 gulp.task같아야합니다..pipe(gp_concat('concat.js'))
Eric Jorgensen dec

1
모든 파일이 생성되지만 디버거에서는 여전히 축소 된 버전이 표시됩니다. 그 이유는 무엇일까요? 맵 파일의 이름이 올바르게 지정되고 해당 URL로 액세스 할 수 있습니다.
Meglio

브라우저에 따라 원본 소스가 다른 탭에 있습니다. 거기에 중단 점을 넣어야합니다.
przemcio

4
이름을 변경해야하는 이유가 명확하지 않습니다. 버그입니까?
przemcio

@przemcio 제 경우에는 프로세스의 각 단계에서 모든 파일의 기록을 원했습니다. 당신이 걱정하는 모든 최종 축소 된 파일 인 경우 그러나, 당신은 물론 더욱 꿀꺽 파일을 단축 할 수
Obinwanne 힐

17

내 gulp 파일은 최종 컴파일 된 번들 min.js를 생성하므로 누군가에게 도움이되기를 바랍니다.

여기에 이미지 설명 입력

//Gulpfile.js

var gulp = require("gulp");
var watch = require("gulp-watch");

var concat = require("gulp-concat");
var rename = require("gulp-rename");
var uglify = require("gulp-uglify");
var del = require("del");
var minifyCSS = require("gulp-minify-css");
var copy = require("gulp-copy");
var bower = require("gulp-bower");
var sourcemaps = require("gulp-sourcemaps");

var path = {
    src: "bower_components/",
    lib: "lib/"
}

var config = {
    jquerysrc: [
        path.src + "jquery/dist/jquery.js",
        path.src + "jquery-validation/dist/jquery.validate.js",
        path.src + "jquery-validation/dist/jquery.validate.unobtrusive.js"
    ],
    jquerybundle: path.lib + "jquery-bundle.js",
    ngsrc: [
        path.src + "angular/angular.js",
         path.src + "angular-route/angular-route.js",
         path.src + "angular-resource/angular-resource.js"
    ],
    ngbundle: path.lib + "ng-bundle.js",

    //JavaScript files that will be combined into a Bootstrap bundle
    bootstrapsrc: [
        path.src + "bootstrap/dist/js/bootstrap.js"
    ],
    bootstrapbundle: path.lib + "bootstrap-bundle.js"
}

// Synchronously delete the output script file(s)
gulp.task("clean-scripts", function (cb) {
    del(["lib","dist"], cb);
});

//Create a jquery bundled file
gulp.task("jquery-bundle", ["clean-scripts", "bower-restore"], function () {
    return gulp.src(config.jquerysrc)
     .pipe(concat("jquery-bundle.js"))
     .pipe(gulp.dest("lib"));
});

//Create a angular bundled file
gulp.task("ng-bundle", ["clean-scripts", "bower-restore"], function () {
    return gulp.src(config.ngsrc)
     .pipe(concat("ng-bundle.js"))
     .pipe(gulp.dest("lib"));
});

//Create a bootstrap bundled file
gulp.task("bootstrap-bundle", ["clean-scripts", "bower-restore"], function     () {
    return gulp.src(config.bootstrapsrc)
     .pipe(concat("bootstrap-bundle.js"))
     .pipe(gulp.dest("lib"));
});


// Combine and the vendor files from bower into bundles (output to the Scripts folder)
gulp.task("bundle-scripts", ["jquery-bundle", "ng-bundle", "bootstrap-bundle"], function () {

});

//Restore all bower packages
gulp.task("bower-restore", function () {
    return bower();
});

//build lib scripts
gulp.task("compile-lib", ["bundle-scripts"], function () {
    return gulp.src("lib/*.js")
        .pipe(sourcemaps.init())
        .pipe(concat("compiled-bundle.js"))
        .pipe(gulp.dest("dist"))
        .pipe(rename("compiled-bundle.min.js"))
        .pipe(uglify())
        .pipe(sourcemaps.write("./"))
        .pipe(gulp.dest("dist"));
});

1
@wchoward 좋은 예는 내가 찾던 것, 매우 깨끗하고 간단한 디자인이었습니다.
Faito

10

솔루션 사용 gulp-uglify, gulp-concat하고 gulp-sourcemaps. 이것은 내가 작업중인 프로젝트에서 가져온 것입니다.

gulp.task('scripts', function () {
    return gulp.src(scripts, {base: '.'})
        .pipe(plumber(plumberOptions))
        .pipe(sourcemaps.init({
            loadMaps: false,
            debug: debug,
        }))
        .pipe(gulpif(debug, wrapper({
            header: fileHeader,
        })))
        .pipe(concat('all_the_things.js', {
            newLine:'\n;' // the newline is needed in case the file ends with a line comment, the semi-colon is needed if the last statement wasn't terminated
        }))
        .pipe(uglify({
            output: { // http://lisperator.net/uglifyjs/codegen
                beautify: debug,
                comments: debug ? true : /^!|\b(copyright|license)\b|@(preserve|license|cc_on)\b/i,
            },
            compress: { // http://lisperator.net/uglifyjs/compress, http://davidwalsh.name/compress-uglify
                sequences: !debug,
                booleans: !debug,
                conditionals: !debug,
                hoist_funs: false,
                hoist_vars: debug,
                warnings: debug,
            },
            mangle: !debug,
            outSourceMap: true,
            basePath: 'www',
            sourceRoot: '/'
        }))
        .pipe(sourcemaps.write('.', {
            includeContent: true,
            sourceRoot: '/',
        }))
        .pipe(plumber.stop())
        .pipe(gulp.dest('www/js'))
});

이 결합하고 찜질 모든 scripts라는 파일로, 풋를 all_the_things.js. 파일은 특수한 줄로 끝납니다.

//# sourceMappingURL=all_the_things.js.map

브라우저가 해당 맵 파일을 찾도록 지시하며이 파일도 기록합니다.


7
var gulp = require('gulp');
var concat = require('gulp-concat');
var uglify = require('gulp-uglify');

gulp.task('create-vendor', function () {
var files = [
    'bower_components/q/q.js',
    'bower_components/moment/min/moment-with-locales.min.js',
    'node_modules/jstorage/jstorage.min.js'
];

return gulp.src(files)
    .pipe(concat('vendor.js'))
    .pipe(gulp.dest('scripts'))
    .pipe(uglify())
    .pipe(gulp.dest('scripts'));
});

연결 프로세스 후 파일을 저장 한 다음 uglify하고 다시 저장해야하므로 솔루션이 작동하지 않습니다. concat과 uglify 사이에서 파일 이름을 바꿀 필요가 없습니다.


나는 꿀꺽 꿀꺽 사용할 때 무엇을하고 필요하지 않은지 결정하는 것이 개발자의 특권이라고 말하고 싶습니다. 제 경우에는 각 단계에서 파일 이름을 바꾸고 싶었습니다. 다른 사람들은 다른 것을 선호 할 수 있습니다.
Obinwanne Hill

1
물론 자신에게 가장 적합한 옵션을 결정할 수 있습니다. 아래 답변은 파일 이름을 변경해야한다고 말하고 있습니다. 단지 필요하지 않다고 말한 것뿐입니다 (의무가 아님). 혼동을했다면 죄송합니다.
Milos

4

2015 년 6 월 10 일 : 작성자의 메모 gulp-uglifyjs:

DEPRECATED : 이 플러그인은 Gulp-concat을 사용하는 대신 Uglify를 사용하여 파일을 연결하기 때문에 블랙리스트에 올랐습니다. 이는 "한 가지를해야합니다"패러다임을 깨뜨립니다. 이 플러그인을 만들었을 때 소스 맵을 gulp와 함께 사용할 수있는 방법이 없었지만 이제는 동일한 목표를 달성하는 gulp-sourcemaps 플러그인이 있습니다. gulp-uglifyjs는 여전히 훌륭하게 작동하며 Uglify 실행을 매우 세밀하게 제어 할 수 있습니다. 다른 옵션이 현재 존재한다는 사실을 알려드립니다.


2015년 2월 18일 : gulp-uglifygulp-concat멋지게 작품 모두 gulp-sourcemaps지금. 에 대한 newLine옵션을 올바르게 설정했는지 확인하십시오 gulp-concat. 나는 추천한다 \n;.


원래 답변 (2014 년 12 월) : 대신 gulp-uglifyjs 를 사용하십시오 . gulp-concat반드시 안전하지는 않습니다. 후행 세미콜론을 올바르게 처리해야합니다. gulp-uglify또한 소스 맵을 지원하지 않습니다. 다음은 내가 작업중인 프로젝트의 일부입니다.

gulp.task('scripts', function () {
    gulp.src(scripts)
        .pipe(plumber())
        .pipe(uglify('all_the_things.js',{
            output: {
                beautify: false
            },
            outSourceMap: true,
            basePath: 'www',
            sourceRoot: '/'
        }))
        .pipe(plumber.stop())
        .pipe(gulp.dest('www/js'))
});

어? 꿀꺽는-추하게은 확실히 소스 맵을 지원합니다 github.com/floridoo/gulp-sourcemaps/wiki/...
미스터 오

1
@MisterOh 글을 쓰는 시점에 확실 gulp-concat하지 않거나 그렇지 않은 경우 ( gulp-uglify여러 파일을 축소 하지 못 하므로 먼저 연결해야합니다). 또한 기본적으로를 gulp-concat사용하므로 JS 파일이 제대로 종료되지 않으면 문제 발생할 있습니다. 그러나 예, 이제 지원이 있으므로 그 경로를 더 유연하게 사용하는 것이 좋습니다. \r\n
mpen 2015 년

@Mark-Obinwanne의 답변과 함께 인라인으로 작동하는 gulp-sourcemaps로 솔루션을 게시하면 감사하겠습니다. 작동하지 않는 것 같습니다.
NightOwl888 2015-06-02

@ NightOwl888 괜찮아요 사실, 그것이 당신이 요청한 것이라면 인라인 소스 맵을 생성하지 않습니다. 여전히 별도의 파일입니다.
mpen 2015-06-02

gulp-uglifyjs도 이제 폐기되었습니다. 이제 gulp-uglify 플러그인을 사용하는 것으로 충분합니다. 최신 솔루션에 대한 다른 답변을 참조하십시오.
Neil Monroe

0

비슷한 작업을 수행하기 위해 아래 구성을 사용하고 있습니다.

    var gulp = require('gulp'),
    async = require("async"),
    less = require('gulp-less'),
    minifyCSS = require('gulp-minify-css'),
    uglify = require('gulp-uglify'),
    concat = require('gulp-concat'),
    gulpDS = require("./gulpDS"),
    del = require('del');

// CSS & Less
var jsarr = [gulpDS.jsbundle.mobile, gulpDS.jsbundle.desktop, gulpDS.jsbundle.common];
var cssarr = [gulpDS.cssbundle];

var generateJS = function() {

    jsarr.forEach(function(gulpDSObject) {
        async.map(Object.keys(gulpDSObject), function(key) {
            var val = gulpDSObject[key]
            execGulp(val, key);
        });

    })
}

var generateCSS = function() {
    cssarr.forEach(function(gulpDSObject) {
        async.map(Object.keys(gulpDSObject), function(key) {
            var val = gulpDSObject[key];
            execCSSGulp(val, key);
        })
    })
}

var execGulp = function(arrayOfItems, dest) {
    var destSplit = dest.split("/");
    var file = destSplit.pop();
    del.sync([dest])
    gulp.src(arrayOfItems)
        .pipe(concat(file))
        .pipe(uglify())
        .pipe(gulp.dest(destSplit.join("/")));
}

var execCSSGulp = function(arrayOfItems, dest) {
    var destSplit = dest.split("/");
    var file = destSplit.pop();
    del.sync([dest])
    gulp.src(arrayOfItems)
        .pipe(less())
        .pipe(concat(file))
        .pipe(minifyCSS())
        .pipe(gulp.dest(destSplit.join("/")));
}

gulp.task('css', generateCSS);
gulp.task('js', generateJS);

gulp.task('default', ['css', 'js']);

샘플 GulpDS 파일은 다음과 같습니다.

{

    jsbundle: {
        "mobile": {
            "public/javascripts/sample.min.js": ["public/javascripts/a.js", "public/javascripts/mobile/b.js"]
           },
        "desktop": {
            'public/javascripts/sample1.js': ["public/javascripts/c.js", "public/javascripts/d.js"]},
        "common": {
            'public/javascripts/responsive/sample2.js': ['public/javascripts/n.js']
           }
    },
    cssbundle: {
        "public/stylesheets/a.css": "public/stylesheets/less/a.less",
        }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.