티스토리 뷰

발생일: 2015.05.17

키워드: gulp, browserify, gulp + browserify, vinly-source-stream, 걸프, 브라우저리파이

문제:
모듈의 의존성 관리는 browserify 를 사용하고 있는데, gulp 빌드에 포함하려고 한다.
browserify 모듈을 파이프에 끼어넣어 봤는데, 의도처럼 잘 되진 않는다.
어떻게 하면 될까?


해결책:

browserify 는 gulp 플러그인이 아니기 때문에,
browserify 의 스트림을 걸프에서 사용하는 vinyl 객체로 변경해줘야 하며,
이 용도로 vinyl-source-stream 모듈이 추가로 필요하다.

대략의 빌드 스크립트는 아래와 같다.

var gulp = require('gulp');
var browserify = require('browserify');
var source = require('vinyl-source-stream');

gulp.task('script', function () {
  return browserify('./src/js/main.js') // (A)
    .bundle() // (B)
    .pipe(source('bundle.js')) // (C)
    .pipe(gulp.dest('dist/js')); // (D)
});


각 라인이 하는 역할은 아래와 같다.

(A) browserify('./src/js/main.js')
  browserify API를 호출하는 코드다.
  `main.js`에서부터 시작해 의존하고 있는 다른 파일들을 로드해 병합한다.
  주의할 것은 browserify 로 전달하는 파일명은 `./`를 포함한 경로라는 것이다.
  gulp로 전달하는 모든 파일은 현재 디렉토리를 생략해도 되는데,
  browserify 는 전달받는 파일을 노드 모듈로 판단하기 때문인 것으로 보인다.

(B) .bundle()
  browserify 객체의 `bundle()`을 호출한다.
  `bundle()`은 browserify 의 객체를 읽어올 수 있는 Readable Stream 을 리턴한다.
  이 스트림으로부터 병합된 스크립트 파일을 읽어올 수 있다.

(C) pipe(source('bundle.js'))
  browserify 객체에서 리턴한 스트림은 기본적으로 gulp 의 스트림과 호환되지 않는다.
  browserify 가 gulp의 플러그인이 아니기 때문이다.
  gulp 의 플러그인으로 전달해야 하는 파라미터는, 파일의 메타데이터 정보를 포함하고 있는 vinyl 의 인스턴스여야 한다.
  `vinyl-source-stream` 모듈은 일반 스트림을 메타데이터를 포함한 vinyl 객체로 변환해주는 역할을 한다.
  이 코드에서는, 연결된 스트림에 `bundle.js`라는 파일명을 추가해 다음 스트림으로 전달한다.

(D) pipe(gulp.dest('dist/js'))
  마지막으로, 메모리 상의 가상의 파일을 `dist/js`디렉토리에 쓴다.

  
  


반응형
댓글
공지사항