Skip to content

Latest commit

ย 

History

History
400 lines (270 loc) ยท 15.5 KB

library-structures.md

File metadata and controls

400 lines (270 loc) ยท 15.5 KB

๊ฐœ์š” (Overview)

์ผ๋ฐ˜์ ์œผ๋กœ, ์„ ์–ธ ํŒŒ์ผ์„ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. JavaScript์—์„œ ์‚ฌ์šฉํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ๊ณ , ์ด์— ๋งž์ถ”์–ด ์„ ์–ธ ํŒŒ์ผ์„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ๋Š” ์ผ๋ฐ˜์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒจํ„ด์„ ์‹๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ, ๊ทธ ํŒจํ„ด์— ์ƒ์‘ํ•˜๋Š” ์„ ์–ธ ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค๋ฃน๋‹ˆ๋‹ค.

์ฃผ์š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ๊ฐ์˜ ๊ตฌ์กฐํ™” ํŒจํ„ด ์œ ํ˜•์€ ํ…œํ”Œ๋ฆฟ ์„น์…˜์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์‹œ์ž‘ํ•˜๋ฉด ๋” ๋น ๋ฅด๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ข…๋ฅ˜ ์‹๋ณ„ํ•˜๊ธฐ (Identifying Kinds of Libraries)

์ฒซ ๋ฒˆ์งธ๋กœ, TypeScript ์„ ์–ธ ํŒŒ์ผ์ด ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ข…๋ฅ˜๋ฅผ ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ ์ข…๋ฅ˜์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ, ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์˜ ์˜ˆ์ œ๋ฅผ ๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ตฌ์กฐ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์€ ์„ ์–ธ ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋Š” ์ฒซ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋ฒ•๊ณผ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์กฐ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํžŒํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฌธ์„œ์™€ ๊ตฌ์„ฑ์— ๋”ฐ๋ผ์„œ, ์–ด๋–ค ๊ฑด ๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ์‰ฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณธ์ธ์—๊ฒŒ ๋” ํŽธํ•œ ๊ฒƒ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

์ „์—ญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (Global Libraries)

์ „์—ญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ „์—ญ ์Šค์ฝ”ํ”„ (์ฆ‰, import ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ)์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‚ฌ์šฉ์„ ์œ„ํ•ด ๊ฐ„๋‹จํžˆ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, jQuery๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, $ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

$(() => { console.log('hello!'); } );

HTML ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฌธ์„œ์—์„œ ์ง€์นจ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

<script src="http://a.great.cdn.for/someLib.js"></script>

์˜ค๋Š˜๋‚ , ๋Œ€๋ถ€๋ถ„์˜ ์ „์—ญ์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์œ ๋ช… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ ์‹ค์ œ๋กœ UMD ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค (์•„๋ž˜๋ฅผ ์ฐธ์กฐ). UMD ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฌธ์„œ๋Š” ์ „์—ญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฌธ์„œ์™€ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ „์—ญ ์„ ์–ธ ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ธฐ ์ „์—, ์‹ค์ œ๋กœ๋Š” UMD๊ฐ€ ์•„๋‹Œ์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

์ฝ”๋“œ์—์„œ ์ „์—ญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‹๋ณ„ํ•˜๊ธฐ (Identifying a Global Library from Code)

์ „์—ญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๋Š” ๋Œ€๊ฒŒ ์—„์ฒญ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ „์—ญ "Hello, world" ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

function createGreeting(s) {
    return "Hello, " + s;
}

ํ˜น์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

window.createGreeting = function(s) {
    return "Hello, " + s;
}

์ „์—ญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, ๋ณดํ†ต ๋‹ค์Œ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ var๋ฌธ ์ด๋‚˜ function์„ ์–ธ
  • ํ•˜๋‚˜ ์ด์ƒ์˜ window.someName ํ• ๋‹น
  • DOM ์ธํ„ฐํŽ˜์ด์Šค document ํ˜น์€ window๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •

๋‹ค์Œ์€ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค:

  • require ์ด๋‚˜ define ๊ฐ™์€ ๋ชจ๋“ˆ ๋กœ๋” ๊ฒ€์‚ฌ ํ˜น์€ ์‚ฌ์šฉ
  • var fs = require("fs"); ํ˜•ํƒœ์˜ CommonJS/Node.js-์Šคํƒ€์ผ import
  • define(...) ํ˜ธ์ถœ
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ require ํ˜น์€ importํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์„œ

์ „์—ญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜ˆ์ œ (Examples of Global Libraries)

์ „์—ญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ UMD ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ฐ”๊พธ๋Š”๊ฒŒ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์—, ์ „์—ญ ์Šคํƒ€์ผ๋กœ ์ž‘์„ฑํ•œ ์ธ๊ธฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ํฌ๊ธฐ๊ฐ€ ์ž‘๊ณ  DOM์ด ํ•„์š”ํ•œ (ํ˜น์€ ์˜์กด์„ฑ์ด ์—†๋Š”) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์ „์—ญ์ž…๋‹ˆ๋‹ค.

์ „์—ญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ…œํ”Œ๋ฆฟ (Global Library Template)

ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ global.d.ts์€ ์˜ˆ์ œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ myLib๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. "์ด๋ฆ„ ์ถฉ๋Œ ๋ฐฉ์ง€" ๊ฐ์ฃผ๋ฅผ ๋ฐ˜๋“œ์‹œ ์ฝ์–ด๋ณด์„ธ์š”.

๋ชจ๋“ˆํ˜• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (Modular Libraries)

์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ชจ๋“ˆ ๋กœ๋” ํ™˜๊ฒฝ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, express๋Š” Node.js์—์„œ๋งŒ ๋™์ž‘ํ•˜๊ณ  ๋ฐ˜๋“œ์‹œ CommonJS์˜ require ํ•จ์ˆ˜๋กœ ๋กœ๋“œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ECMAScript 2015 (ES2015, ECMAScript 6, ES6๋กœ๋„ ์ž˜ ์•Œ๋ ค์ง„), CommonJS์™€ RequireJS๋Š” ๋ชจ๋“ˆ์„ importingํ•˜๋Š” ๋น„์Šทํ•œ ๊ฐœ๋…์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. JavaScript์˜ CommonJS (Node.js)๋ฅผ ์˜ˆ๋ฅผ ๋“ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค

var fs = require("fs");

TypeScript๋‚˜ ES6์—์„œ๋Š”, import ํ‚ค์›Œ๋“œ๊ฐ€ ๊ฐ™์€ ๋ชฉ์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

import fs = require("fs");

์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋“ˆํ˜• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฌธ์„œ์—์„œ ๋‹ค์Œ ์ฝ”๋“œ๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

var someLib = require('someLib');

ํ˜น์€

define(..., ['someLib'], function(someLib) {

});

์ „์—ญ ๋ชจ๋“ˆ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ UMD ๋ชจ๋“ˆ์˜ ๋ฌธ์„œ์—์„œ๋„ ์ด ์˜ˆ์ œ๋“ค์„ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ฝ”๋“œ๋‚˜ ๋ฌธ์„œ๋ฅผ ๋ฐ˜๋“œ์‹œ ํ™•์ธํ•˜์„ธ์š”.

์ฝ”๋“œ์—์„œ ๋ชจ๋“ˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‹๋ณ„ํ•˜๊ธฐ (Identifying a Module Library from Code)

๋ชจ๋“ˆํ˜• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ ์ค‘ ๋ช‡ ๊ฐ€์ง€๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

  • require ํ˜น์€ define์— ๋Œ€ํ•œ ๋ฌด์กฐ๊ฑด์ ์ธ ํ˜ธ์ถœ
  • import * as a from 'b'; ํ˜น์€ export c; ๊ฐ™์€ ์„ ์–ธ๋ฌธ
  • exports ํ˜น์€ module.exports์— ๋Œ€ํ•œ ํ• ๋‹น

๋‹ค์Œ์€ ๊ฑฐ์˜ ๊ฐ–์ง€ ์•Š์Šต๋‹ˆ๋‹ค:

  • window ํ˜น์€ global ํ”„๋กœํผํ‹ฐ ํ• ๋‹น

๋ชจ๋“ˆํ˜• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜ˆ์ œ (Examples of Modular Libraries)

๋งŽ์€ ์œ ๋ช…ํ•œ Node.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ express, gulp, request์™€ ๊ฐ™์€ ๋ชจ๋“ˆ๊ตฐ ์•ˆ์— ์žˆ์Šต๋‹ˆ๋‹ค.

UMD

UMD ๋ชจ๋“ˆ์€ ๋ชจ๋“ˆ๋กœ (import๋ฅผ ํ†ตํ•ด) ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ํ˜น์€ ์ „์—ญ์œผ๋กœ๋„ (๋ชจ๋“ˆ ๋กœ๋” ์—†๋Š” ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋  ๋•Œ) ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Moment.js ๊ฐ™์€ ๋งŽ์€ ์œ ๋ช…ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Node.js๋‚˜ RequireJS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค:

import moment = require("moment");
console.log(moment.format());

๋ฐ˜๋ฉด ๋ฐ”๋‹๋ผ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

console.log(moment.format());

UMD ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‹๋ณ„ํ•˜๊ธฐ (Identifying a UMD library)

UMD modules์€ ๋ชจ๋“ˆ ๋กœ๋” ํ™˜๊ฒฝ ์œ ๋ฌด๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ด๋Š” ์ฐพ๊ธฐ ์‰ฌ์šด ํŒจํ„ด์ž…๋‹ˆ๋‹ค:

(function (root, factory) {
    if (typeof define === "function" && define.amd) {
        define(["libName"], factory);
    } else if (typeof module === "object" && module.exports) {
        module.exports = factory(require("libName"));
    } else {
        root.returnExports = factory(root.libName);
    }
}(this, function (b) {

๋งŒ์•ฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ, ํŠนํžˆ ํŒŒ์ผ ์ƒ๋‹จ์—์„œ typeof define, typeof window ํ˜น์€ typeof module์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ๋ณด์•˜๋‹ค๋ฉด, ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„ UMD ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

UMD ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฌธ์„œ์—์„œ๋Š” require๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” "Node.js์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ" ์˜ˆ์ œ๋ฅผ ์ข…์ข… ์„ค๋ช…ํ•˜๊ณ  "๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ" ์˜ˆ์ œ์—์„œ๋Š” <script> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

UMD ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜ˆ์ œ (Examples of UMD libraries)

์œ ๋ช…ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋Œ€๋ถ€๋ถ„์€ UMD ํŒจํ‚ค์ง€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋กœ๋Š” jQuery, Moment.js, loadash ๋“ฑ ๋” ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…œํ”Œ๋ฆฟ (Template)

๋ชจ๋“ˆ์€ ์„ธ ๊ฐ€์ง€ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค, module.d.ts, module-class.d.ts ๊ทธ๋ฆฌ๊ณ  module-function.d.ts.

๋งŒ์•ฝ ๋ชจ๋“ˆ์„ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์œผ๋ฉด module-function.d.ts์„ ์‚ฌ์šฉํ•˜์„ธ์š”:

var x = require("foo");
// ์ฐธ๊ณ : ํ•จ์ˆ˜๋กœ 'x'๋ฅผ ํ˜ธ์ถœ
var y = x(42);

๊ฐ์ฃผ "ES6๊ฐ€ ๋ชจ๋“ˆ ํ˜ธ์ถœ ์‹œ๊ทธ๋‹ˆ์ฒ˜์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ"๋ฅผ ๋ฐ˜๋“œ์‹œ ์ฝ์–ด๋ณด์„ธ์š”

๋งŒ์•ฝ ๋ชจ๋“ˆ์ด new๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด module-class.d.ts๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”:

var x = require("bar");
// ์ฐธ๊ณ : 'new' ์—ฐ์‚ฐ์ž๋ฅผ import๋œ ๋ณ€์ˆ˜์— ์‚ฌ์šฉ
var y = new x("hello");

์ด๋Ÿฐ ๋ชจ๋“ˆ์—๋„ ๊ฐ™์€ ๊ฐ์ฃผ๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๋ชจ๋“ˆ์ด ์œ„ ์‚ฌํ•ญ์— ํ•ด๋‹น๋˜์ง€ ์•Š๋‹ค๋ฉด, module.d.ts ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋ชจ๋“ˆ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ˜น์€ UMD ํ”Œ๋Ÿฌ๊ทธ์ธ (Module Plugin or UMD Plugin)

๋ชจ๋“ˆ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ (UMD๋‚˜ ๋ชจ๋“ˆ)์˜ ํ˜•ํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Moment.js์—์„œ, moment-range๋Š” moment ๊ฐ์ฒด์— ์ƒˆ๋กœ์šด range ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์„ ์–ธ ํŒŒ์ผ ์ž‘์„ฑ์„ ์œ„ํ•ด, ๋ชจ๋“ˆ์ด ์ผ๋ฐ˜ ๋ชจ๋“ˆ๋กœ ๋ณ€๊ฒฝ๋˜๋“  UMD ๋ชจ๋“ˆ๋กœ ๋ณ€๊ฒฝ๋˜๋“  ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

ํ…œํ”Œ๋ฆฟ (Template)

module-plugin.d.ts ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

์ „์—ญ ํ”Œ๋Ÿฌ๊ทธ์ธ (Global Plugin)

์ „์—ญ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ „์—ญ์˜ ํ˜•ํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ „์—ญ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ „์—ญ-์ˆ˜์ • ๋ชจ๋“ˆ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋Ÿฐํƒ€์ž„์— ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ช‡๋ช‡ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Array.prototype์ด๋‚˜ String.prototype์— ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ „์—ญ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹๋ณ„ํ•˜๊ธฐ (Identifying global plugins)

์ „์—ญ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ์„œ๋ฅผ ๋ณด๊ณ  ์‰ฝ๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ˆ์ œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

var x = "hello, world";
// ๋‚ด์žฅ ํƒ€์ž…์— ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ ์ƒ์„ฑ
console.log(x.startsWithHello());

var y = [1, 2, 3];
// ๋‚ด์žฅ ํƒ€์ž…์— ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ ์ƒ์„ฑ
console.log(y.reverseAndSort());

ํ…œํ”Œ๋ฆฟ (Template)

global-plugin.d.ts ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

์ „์—ญ-์ˆ˜์ • ๋ชจ๋“ˆ (Global-modifying Modules)

์ „์—ญ-์ˆ˜์ • ๋ชจ๋“ˆ์€ import ๋  ๋•Œ, ์ „์—ญ ์Šค์ฝ”ํ”„์— ์กด์žฌํ•˜๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, import ๋  ๋•Œ String.prototype์— ์ƒˆ๋กœ์šด ๋ฉค๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒจํ„ด์€ ๋Ÿฐํƒ€์ž„ ์ถฉ๋Œ์˜ ๊ฐ€๋Šฅ์„ฑ ๋•Œ๋ฌธ์— ์œ„ํ—˜ํ•˜์ง€๋งŒ, ์—ฌ์ „ํžˆ ์„ ์–ธ ํŒŒ์ผ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ „์—ญ-์ˆ˜์ • ๋ชจ๋“ˆ ์‹๋ณ„ํ•˜๊ธฐ (Identifying global-modifying modules)

์ „์—ญ-์ˆ˜์ • ๋ชจ๋“ˆ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ์„œ๋ฅผ ๋ณด๊ณ  ์‰ฝ๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ, ์ „์—ญ ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ, ํšจ๊ณผ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด require ํ˜ธ์ถœ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

// ๋ฐ˜ํ™˜๊ฐ’์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” 'require' ํ˜ธ์ถœ
var unused = require("magic-string-time");
/* ํ˜น์€ */
require("magic-string-time");

var x = "hello, world";
// ๋‚ด์žฅ ํƒ€์ž…์— ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ ์ƒ์„ฑ
console.log(x.startsWithHello());

var y = [1, 2, 3];
// ๋‚ด์žฅ ํƒ€์ž…์— ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ ์ƒ์„ฑ
console.log(y.reverseAndSort());

ํ…œํ”Œ๋ฆฟ (Template)

global-modifying-module.d.ts ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

์˜์กด์„ฑ ์‚ฌ์šฉํ•˜๊ธฐ (Consuming Dependencies)

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ช‡ ๊ฐ€์ง€ ์˜์กด์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์„น์…˜์—์„œ๋Š” ์„ ์–ธ ํŒŒ์ผ ์•ˆ์— ์˜์กด์„ฑ์„ import ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ „์—ญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ (Dependencies on Global Libraries)

๋งŒ์•ฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ „์—ญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กด์„ฑ์ด ์žˆ๋‹ค๋ฉด, /// <reference types="..." /> ๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”:

/// <reference types="someLib" />

function getThing(): someLib.thing;

๋ชจ๋“ˆ ์˜์กด์„ฑ (Dependencies on Modules)

๋งŒ์•ฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ชจ๋“ˆ์— ์˜์กด์„ฑ์ด ์žˆ๋‹ค๋ฉด, import๋ฌธ์„ ์‚ฌ์šฉํ•˜์„ธ์š”:

import * as moment from "moment";

function getThing(): moment;

UMD ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ (Dependencies on UMD libraries)

์ „์—ญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ (From a Global Library)

๋งŒ์•ฝ ์ „์—ญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ UMD ๋ชจ๋“ˆ์— ์˜์กด์„ฑ์ด ์žˆ๋‹ค๋ฉด, /// <reference types ๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”:

/// <reference types="moment" />

function getThing(): moment;

๋ชจ๋“ˆ์ด๋‚˜ UMD ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ (From a Module or UMD Library)

๋งŒ์•ฝ ๋ชจ๋“ˆ์ด๋‚˜ UMD ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ UMD ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กด์„ฑ์ด ์žˆ๋‹ค๋ฉด, import๋ฌธ์„ ์‚ฌ์šฉํ•˜์„ธ์š”:

import * as someLib from 'someLib';

UMD ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์˜์กด์„ฑ ์„ ์–ธ์— /// <reference ๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”!

๊ฐ์ฃผ (Footnotes)

์ด๋ฆ„ ์ถฉ๋Œ ๋ฐฉ์ง€ํ•˜๊ธฐ (Preventing Name Conflicts)

์ „์—ญ ์„ ์–ธ ํŒŒ์ผ์„ ์ž‘์„ฑํ•  ๋•Œ, ์ „์—ญ ์Šค์ฝ”ํ”„์— ๋งŽ์€ ํƒ€์ž…์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์œ ์˜ํ•˜์„ธ์š”. ๋งŽ์€ ์„ ์–ธ ํŒŒ์ผ์ด ํ”„๋กœ์ ํŠธ ๋‚ด์— ์žˆ์„ ๋•Œ, ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ์ด๋ฆ„ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์•ผ ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๊ทœ์น™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ •์˜ํ•œ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ๋ฌด์—‡์ด๋“  ํƒ€์ž…์„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋งŒ์•ฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ „์—ญ ๊ฐ’ 'cats'๋ฅผ ์ •์˜ํ•˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜๊ณ 

declare namespace cats {
    interface KittySettings { }
}

์ด๋ ‡๊ฒŒ ํ•˜์ง€๋Š” ๋งˆ์„ธ์š”

// ์ตœ์ƒ์œ„-๋ ˆ๋ฒจ์—์„œ
interface CatsKittySettings { }

์ด ๊ฐ€์ด๋“œ๋Š” ์„ ์–ธ ํŒŒ์ผ ์‚ฌ์šฉ์ž๊ฐ€ ์ค‘๋‹จํ•˜์ง€ ์•Š๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ UMD๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

ES6๊ฐ€ ๋ชจ๋“ˆ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ (The Impact of ES6 on Module Plugins)

์–ด๋–ค ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๊ธฐ์กด ๋ชจ๋“ˆ์— ์ตœ์ƒ์œ„ export๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. CommonJS์™€ ๋‹ค๋ฅธ ๋กœ๋”์—์„œ๋Š” ํ—ˆ์šฉ๋˜์ง€๋งŒ, ES6 ๋ชจ๋“ˆ์€ ๋ถˆ๋ณ€ํ•˜๋‹ค๊ณ  ๊ฐ„์ฃผ๋˜๊ธฐ์— ์ด ํŒจํ„ด์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด TypeScript๋Š” ๋กœ๋”์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๊ธฐ์—, ์ด ์ •์ฑ…์ด ์ปดํŒŒ์ผ-์‹œ๊ฐ„์— ์ ์šฉ๋˜์ง€ ์•Š์ง€๋งŒ, ES6 ๋ชจ๋“ˆ ๋กœ๋”๋กœ ์ „ํ™˜ํ•˜๋ ค๋Š” ๊ฐœ๋ฐœ์ž๋Š” ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“ˆ ํ˜ธ์ถœ ์‹œ๊ทธ๋‹ˆ์ฒ˜์— ES6๊ฐ€ ๋ฏธ์น˜๋Š” ์˜ํ–ฅ (The Impact of ES6 on Module Call Signatures)

Express์™€ ๊ฐ™์€ ๋งŽ์€ ์œ ๋ช…ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ import ๋  ๋•Œ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ๋ฐ˜์ ์ธ Express ์‚ฌ์šฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

import exp = require("express");
var app = exp();

ES6 ๋ชจ๋“ˆ ๋กœ๋”์—์„œ, ์ตœ์ƒ์œ„-๋ ˆ๋ฒจ ๊ฐ์ฒด(์—ฌ๊ธฐ์—์„œ๋Š” exp๋กœ import)๋Š” ํ”„๋กœํผํ‹ฐ๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค; ์ตœ์ƒ์œ„-๋ ˆ๋ฒจ ๋ชจ๋“ˆ ๊ฐ์ฒด๋Š” ์ ˆ๋Œ€ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํ•ด๊ฒฐ์ฑ…์€ ํ˜ธ์ถœ ๊ฐ€๋Šฅ/์ƒ์„ฑ ๊ฐ€๋Šฅ ๊ฐ์ฒด๋ฅผ default export๋กœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค; ์–ด๋–ค ๋ชจ๋“ˆ ๋กœ๋” shims์€ ์ž๋™์œผ๋กœ ์ด ์ƒํ™ฉ์„ ๊ฐ์ง€ํ•˜๊ณ  ์ตœ์ƒ์œ„-๋ ˆ๋ฒจ ๊ฐ์ฒด๋ฅผ default export๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ ๋ ˆ์ด์•„์›ƒ (Library file layout)

์„ ์–ธ ํŒŒ์ผ์˜ ๋ ˆ์ด์•„์›ƒ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ ˆ์ด์•„์›ƒ์„ ๋ฐ˜์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค

myLib
  +---- index.js
  +---- foo.js
  +---- bar
         +---- index.js
         +---- baz.js

์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด import ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

var a = require("myLib");
var b = require("myLib/foo");
var c = require("myLib/bar");
var d = require("myLib/bar/baz");

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์„ ์–ธ ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค

@types/myLib
  +---- index.d.ts
  +---- foo.d.ts
  +---- bar
         +---- index.d.ts
         +---- baz.d.ts