Skip to content

Latest commit

ย 

History

History
462 lines (360 loc) ยท 14.3 KB

File metadata and controls

462 lines (360 loc) ยท 14.3 KB

์ด ํ€ต ์Šคํƒ€ํŠธ ๊ฐ€์ด๋“œ๋Š” gulp๋กœ TypeScript๋ฅผ ๋นŒ๋“œํ•œ ๋‹ค์Œ Browserify, uglify ๋˜๋Š” Watchify๋ฅผ gulp ํŒŒ์ดํ”„ ๋ผ์ธ์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

๋˜ํ•œ Babelify๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Babel ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
npm๊ณผ ํ•จ๊ป˜ Node.js๋Š” ์ด๋ฏธ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ž‘์€ ํ”„๋กœ์ ํŠธ (Minimal project)

์ƒˆ๋กœ์šด ๋””๋ ‰ํ† ๋ฆฌ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ์‹œ๋‹ค. ๋‹น์žฅ์€ proj๋ผ๊ณ  ์ด๋ฆ„์„ ๋ถ™์ด๊ฒ ์ง€๋งŒ ์›ํ•˜๋Š” ๋Œ€๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mkdir proj
cd proj

์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์กฐํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

proj/
   โ”œโ”€ src/
   โ””โ”€ dist/

TypeScript ํŒŒ์ผ์€ src ํด๋”์—์„œ ์‹œ์ž‘ํ•˜์—ฌ TypeScript ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋˜๊ณ  dist์—์„œ ๋๋‚ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ๊ณจ๊ฒฉ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค:

mkdir src
mkdir dist

ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™” (Initialize the project)

์ด์ œ ์ด ํด๋”๋ฅผ npm ํŒจํ‚ค์ง€๋กœ ๋ฐ”๊ฟ€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

npm init

์ผ๋ จ์˜ ์•Œ๋ฆผ์„ ๋ฐ›๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
entry point๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ./dist/main.js๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
package.json ํŒŒ์ผ๋กœ ๋Œ์•„๊ฐ€์„œ ์–ธ์ œ๋“  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜์กด์„ฑ ์„ค์น˜ (Install our dependencies)

์ด์ œ๋Š” npm install์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋จผ์ € gulp-cli๋ฅผ ๊ธ€๋กœ๋ฒŒ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค (Unix ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ npm install ๋ช…๋ น ์•ž์— sudo๋ฅผ ๋ถ™์—ฌ์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค).

npm install -g gulp-cli

๊ทธ๋Ÿฐ ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์˜ ๊ฐœ๋ฐœ์ž ์˜์กด์„ฑ์— typescript, gulp ๋ฐ gulp-typescript๋ฅผ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค.
Gulp-typescript๋Š” Typescript์˜ gulp ํ”Œ๋Ÿฌ๊ทธ์ธ์ž…๋‹ˆ๋‹ค.

npm install --save-dev typescript gulp gulp-typescript

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ ์ž‘์„ฑ (Write a simple example)

Hello World ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

src์— main.ts ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค :

function hello(compiler: string) {
    console.log(`Hello from ${compiler}`);
}
hello("TypeScript");

proj์ด๋ผ๋Š” ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— tsconfig.json ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค :

{
    "files": [
        "src/main.ts"
    ],
    "compilerOptions": {
        "noImplicitAny": true,
        "target": "es5"
    }
}

gulpfile.js ์ƒ์„ฑ (Create a gulpfile.js)

ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— gulpfile.js ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค :

var gulp = require("gulp");
var ts = require("gulp-typescript");
var tsProject = ts.createProject("tsconfig.json");

gulp.task("default", function () {
    return tsProject.src()
        .pipe(tsProject())
        .js.pipe(gulp.dest("dist"));
});

resulting ์•ฑ ํ…Œ์ŠคํŠธ (Test the resulting app)

gulp
node dist/main.js

ํ”„๋กœ๊ทธ๋žจ์—์„œ "Hello from TypeScript!"๋ฅผ ์ธ์‡„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ์— ๋ชจ๋“ˆ ์ถ”๊ฐ€ (Add modules to the code)

Browserify๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฏน์Šค์— ๋ชจ๋“ˆ์„ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ์‹ค์ œ ์•ฑ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

src/greet.ts ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค :

export function sayHello(name: string) {
    return `Hello from ${name}`;
}

์ด์ œ src/main.ts์˜ sayHello๋ฅผ greet.ts์—์„œ ๊ฐ€์ ธ์˜ค๋„๋ก ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค :

import { sayHello } from "./greet";

console.log(sayHello("TypeScript"));

๋งˆ์ง€๋ง‰์œผ๋กœ src/greet.ts๋ฅผ tsconfig.json์— ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค :

{
    "files": [
        "src/main.ts",
        "src/greet.ts"
    ],
    "compilerOptions": {
        "noImplicitAny": true,
        "target": "es5"
    }
}

gulp์„ ์‹คํ–‰ํ•˜๊ณ  ๋…ธ๋“œ์—์„œ ํ…Œ์ŠคํŠธํ•˜์—ฌ ๋ชจ๋“ˆ์ด ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค :

gulp
node dist/main.js

ES2015 ๋ชจ๋“ˆ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ TypeScript๋Š” Node๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” CommonJS ๋ชจ๋“ˆ์„ ๋ฐฉ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” CommonJS๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ฒ ์ง€๋งŒ options ๊ฐ์ฒด์— module์„ ์„ค์ •ํ•˜์—ฌ ์ด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Browserify

์ด์ œ ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋…ธ๋“œ์—์„œ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ด๋™ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
์ด๋ฅผ ์œ„ํ•ด ๋ชจ๋“  ๋ชจ๋“ˆ์„ ํ•˜๋‚˜์˜ JavaScript ํŒŒ์ผ๋กœ ๋ฒˆ๋“ค๋ง ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.
๋‹คํ–‰ํžˆ๋„ ์ •ํ™•ํžˆ Browserify๊ฐ€ ํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค.
๋” ์ข‹์€ ๊ฒƒ์€ ๋…ธ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” CommonJS ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ TypeScript์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ฆ‰ TypeScript์™€ Node ์„ค์ •์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†ก๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € browserify, tsify ๋ฐ vinyl-source-stream์„ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค.
tsify๋Š” gulp-typescript์ฒ˜๋Ÿผ Typeify ์ปดํŒŒ์ผ๋Ÿฌ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” Browserify ํ”Œ๋Ÿฌ๊ทธ์ธ์ž…๋‹ˆ๋‹ค.
vinyl-source-stream์„ ์‚ฌ์šฉํ•˜๋ฉด Browserify์˜ ํŒŒ์ผ ์ถœ๋ ฅ์„ gulp์—์„œ vinyl์œผ๋กœ ์ธ์‹ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋‹ค์‹œ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

npm install --save-dev browserify tsify vinyl-source-stream

ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ (Create a page)

src์— index.html ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค :

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>Hello World!</title>
    </head>
    <body>
        <p id="greeting">Loading ...</p>
        <script src="bundle.js"></script>
    </body>
</html>

์ด์ œ main.ts๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ํŽ˜์ด์ง€๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์‹ญ์‹œ์˜ค :

import { sayHello } from "./greet";

function showHello(divName: string, name: string) {
    const elt = document.getElementById(divName);
    elt.innerText = sayHello(name);
}

showHello("greeting", "TypeScript");

showHello ํ˜ธ์ถœ์€ sayHello๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ paragraph ํ…์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
์ด์ œ gulpfile์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค :

var gulp = require("gulp");
var browserify = require("browserify");
var source = require('vinyl-source-stream');
var tsify = require("tsify");
var paths = {
    pages: ['src/*.html']
};

gulp.task("copy-html", function () {
    return gulp.src(paths.pages)
        .pipe(gulp.dest("dist"));
});

gulp.task("default", ["copy-html"], function () {
    return browserify({
        basedir: '.',
        debug: true,
        entries: ['src/main.ts'],
        cache: {},
        packageCache: {}
    })
    .plugin(tsify)
    .bundle()
    .pipe(source('bundle.js'))
    .pipe(gulp.dest("dist"));
});

copy-html ํƒœ์Šคํฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  default์˜ ์˜์กด์„ฑ์œผ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
default๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค copy-html์ด ๋จผ์ € ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ default๋ฅผ gulp-typescript ๋Œ€์‹  tsify ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ Browserify๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.
ํŽธ๋ฆฌํ•˜๊ฒŒ๋„ ๋‘˜ ๋ชจ๋‘ TypeScript ์ปดํŒŒ์ผ๋Ÿฌ์— ๋™์ผํ•œ options ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

bundle์„ ํ˜ธ์ถœํ•œ ํ›„ source(vinil-source-stream์— ๋Œ€ํ•œ ๋ณ„์นญ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถœ๋ ฅ ๋ฒˆ๋“ค bundle.js์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

gulp๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €์—์„œ dist/index.html์„ ์—ด์–ด ํŽ˜์ด์ง€๋ฅผ ํ…Œ์ŠคํŠธํ•˜์‹ญ์‹œ์˜ค.
ํŽ˜์ด์ง€์— "Hello from TypeScript"๊ฐ€ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Browserify์— debug : true๋ฅผ ์ง€์ •ํ•œ ๊ฒƒ์— ์ฃผ๋ชฉํ•˜์‹ญ์‹œ์˜ค.
์ด๋กœ ์ธํ•ด tsify๋Š” ๋ฒˆ๋“ค JavaScript ํŒŒ์ผ ๋‚ด์—์„œ ์†Œ์Šค๋งต์„ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.
์†Œ์Šค ๋งต์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋œ JavaScript ๋Œ€์‹  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์›๋ณธ TypeScript ์ฝ”๋“œ๋ฅผ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ธŒ๋ผ์šฐ์ €์˜ ๋””๋ฒ„๊ฑฐ๋ฅผ ์—ด๊ณ  main.ts ์•ˆ์— ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ์„ ๋„ฃ์œผ๋ฉด ์†Œ์Šค ๋งต์ด ์ž‘๋™ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๊ณ ์นจ ํ•  ๋•Œ ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  greet.ts๋ฅผ ๋””๋ฒ„๊น… ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Watchify, Babel, and Uglify

์ด์ œ ์ฝ”๋“œ๋ฅผ Browserify์— ๋ฌถ์–ด์„œ tsify ํ–ˆ์œผ๋ฏ€๋กœ browserify ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ์— ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Watchify๊ฐ€ gulp๋ฅผ ๊ณ„์† ์‹คํ–‰ํ•˜๋ฉฐ ํŒŒ์ผ์„ ์ €์žฅํ•  ๋•Œ๋งˆ๋‹ค ์ ์ฐจ์ ์œผ๋กœ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.
    ์ด๋ฅผ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ํŽธ์ง‘-์ €์žฅ-์ƒˆ๋กœ๊ณ ์นจ ์‚ฌ์ดํด์„ ๊ณ„์† ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Babel์€ ES2015 ์ด์ƒ์„ ES5 ๋ฐ ES3์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋งค์šฐ ์œ ์—ฐํ•œ ์ปดํŒŒ์ผ๋Ÿฌ์ž…๋‹ˆ๋‹ค.
    ๋”ฐ๋ผ์„œ TypeScript์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ด‘๋ฒ”์œ„ํ•œ ๋งž์ถคํ˜• ๋ณ€ํ™˜์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Uglify๋Š” ๋‹ค์šด๋กœ๋“œ ์‹œ๊ฐ„์„ ์ค„์ด๋„๋ก ์ฝ”๋“œ๋ฅผ ์••์ถ•ํ•ฉ๋‹ˆ๋‹ค.

Watchify

Watchify๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ปดํŒŒ์ผ์„ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค :

npm install --save-dev watchify gulp-util

์ด์ œ gulpfile์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค :

var gulp = require("gulp");
var browserify = require("browserify");
var source = require('vinyl-source-stream');
var watchify = require("watchify");
var tsify = require("tsify");
var gutil = require("gulp-util");
var paths = {
    pages: ['src/*.html']
};

var watchedBrowserify = watchify(browserify({
    basedir: '.',
    debug: true,
    entries: ['src/main.ts'],
    cache: {},
    packageCache: {}
}).plugin(tsify));

gulp.task("copy-html", function () {
    return gulp.src(paths.pages)
        .pipe(gulp.dest("dist"));
});

function bundle() {
    return watchedBrowserify
        .bundle()
        .pipe(source('bundle.js'))
        .pipe(gulp.dest("dist"));
}

gulp.task("default", ["copy-html"], bundle);
watchedBrowserify.on("update", bundle);
watchedBrowserify.on("log", gutil.log);

์—ฌ๊ธฐ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ธ ๊ฐ€์ง€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ์•ฝ๊ฐ„ ๋ฆฌํŒฉํ† ๋งํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  1. watchify์— ๋Œ€ํ•œ ํ˜ธ์ถœ์—์„œ browserify ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ์‹ธ๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์œ ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  2. watchedBrowserify.on("update", bundle);์„ ํ˜ธ์ถœํ•˜์—ฌ Browserify ๊ฐ€ TypeScript ํŒŒ์ผ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค bundle ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.
  3. watchedBrowserify.on("log", gutil.log);์„ ํ˜ธ์ถœํ•˜์—ฌ ์ฝ˜์†”์— ๋กœ๊ทธํ–ˆ์Šต๋‹ˆ๋‹ค.

(1)๊ณผ (2)๋Š” default ์ž‘์—…์—์„œ browserify๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
Watchify์™€ Gulp ๋ชจ๋‘ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— default ํ•จ์ˆ˜์— ์ด๋ฆ„์„ ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
(3)์„ ์‚ฌ์šฉํ•œ ๋กœ๊น…์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์„ ํƒ ์‚ฌํ•ญ์ด์ง€๋งŒ ์„ค์ •์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ Gulp๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์‹œ์ž‘ํ•ด์•ผ ํ•˜๊ณ  ๊ณ„์† ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
main.ts์—์„œ showHello์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์ €์žฅํ•˜์‹ญ์‹œ์˜ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค :

proj$ gulp
[10:34:20] Using gulpfile ~/src/proj/gulpfile.js
[10:34:20] Starting 'copy-html'...
[10:34:20] Finished 'copy-html' after 26 ms
[10:34:20] Starting 'default'...
[10:34:21] 2824 bytes written (0.13 seconds)
[10:34:21] Finished 'default' after 1.36 s
[10:35:22] 2261 bytes written (0.02 seconds)
[10:35:24] 2808 bytes written (0.05 seconds)

Uglify

๋จผ์ € Uglify๋ฅผ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค.
Uglify์˜ ์š”์ ์€ ์ฝ”๋“œ๋ฅผ ์••์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ์†Œ์Šค ๋งต์„ ์œ ์ง€ํ•˜๋ ค๋ฉด vinyl-buffer์™€ gulp-sourcemaps๋„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

npm install --save-dev gulp-uglify vinyl-buffer gulp-sourcemaps

์ด์ œ gulpfile์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค :

var gulp = require("gulp");
var browserify = require("browserify");
var source = require('vinyl-source-stream');
var tsify = require("tsify");
var uglify = require('gulp-uglify');
var sourcemaps = require('gulp-sourcemaps');
var buffer = require('vinyl-buffer');
var paths = {
    pages: ['src/*.html']
};

gulp.task("copy-html", function () {
    return gulp.src(paths.pages)
        .pipe(gulp.dest("dist"));
});

gulp.task("default", ["copy-html"], function () {
    return browserify({
        basedir: '.',
        debug: true,
        entries: ['src/main.ts'],
        cache: {},
        packageCache: {}
    })
    .plugin(tsify)
    .bundle()
    .pipe(source('bundle.js'))
    .pipe(buffer())
    .pipe(sourcemaps.init({loadMaps: true}))
    .pipe(uglify())
    .pipe(sourcemaps.write('./'))
    .pipe(gulp.dest("dist"));
});

uglify ์ž์ฒด์—๋Š” ํ•˜๋‚˜์˜ ํ˜ธ์ถœ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค โ€” buffer์™€ sourcemaps์— ๋Œ€ํ•œ ํ˜ธ์ถœ์€ sourcemaps์ด ๊ณ„์† ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ด์ „๊ณผ ๊ฐ™์ด ์ธ๋ผ์ธ ์†Œ์Šค ๋งต์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๋ณ„๋„์˜ ์†Œ์Šค ๋งต ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด์ œ Gulp๋ฅผ ์‹คํ–‰ํ•˜๊ณ  bundle.js๊ฐ€ ๋‚œ๋…ํ™”๋กœ ์••์ถ•๋˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค :

gulp
cat dist/bundle.js

Babel

๋จผ์ € ES2015 ์ „์šฉ Babelify ๋ฐ Babel preset์„ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค.
Uglify์ฒ˜๋Ÿผ Babelify๋„ ์ฝ”๋“œ๋ฅผ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— vinyl-buffer์™€ gulp-sourcemaps์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ Babelify๋Š” ํ™•์žฅ์ž๊ฐ€ .js, .es, .es6 ๋ฐ .jsx ์ธ ํŒŒ์ผ๋งŒ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ Babelify์— ์˜ต์…˜์œผ๋กœ .ts ํ™•์žฅ์ž๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

npm install --save-dev babelify babel-core babel-preset-es2015 vinyl-buffer gulp-sourcemaps

์ด์ œ gulpfile์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค :

var gulp = require('gulp');
var browserify = require('browserify');
var source = require('vinyl-source-stream');
var tsify = require('tsify');
var sourcemaps = require('gulp-sourcemaps');
var buffer = require('vinyl-buffer');
var paths = {
    pages: ['src/*.html']
};

gulp.task('copyHtml', function () {
    return gulp.src(paths.pages)
        .pipe(gulp.dest('dist'));
});

gulp.task('default', ['copyHtml'], function () {
    return browserify({
        basedir: '.',
        debug: true,
        entries: ['src/main.ts'],
        cache: {},
        packageCache: {}
    })
    .plugin(tsify)
    .transform('babelify', {
        presets: ['es2015'],
        extensions: ['.ts']
    })
    .bundle()
    .pipe(source('bundle.js'))
    .pipe(buffer())
    .pipe(sourcemaps.init({loadMaps: true}))
    .pipe(sourcemaps.write('./'))
    .pipe(gulp.dest('dist'));
});

TypeScript ๋Œ€์ƒ ES2015๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
Babel์€ TypeScript์—์„œ ๋‚ด๋ณด๋‚ด๋Š” ES2015 ์ฝ”๋“œ์—์„œ ES5๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

tsconfig.json์„ ์ˆ˜์ •ํ•ฉ์‹œ๋‹ค :

{
    "files": [
        "src/main.ts"
    ],
    "compilerOptions": {
        "noImplicitAny": true,
        "target": "es2015"
    }
}

Babel์˜ ES5 ์ถœ๋ ฅ์€ ๊ฐ„๋‹จํ•œ ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•œ TypeScript์˜ ์ถœ๋ ฅ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.