Library Structures

๊ฐœ์š” (Overview)

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

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

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

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

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

์–ด๋–ค ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š”๊ฐ€? (What should you look for?)

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์—, ๋‹ค์Œ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋ฐฉ์‹์ด ๋ฌด์—‡์ธ๊ฐ€?

    ์˜ˆ๋ฅผ ๋“ค์–ด, npm์œผ๋กœ๋งŒ ๋‹ค์šด๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? ์•„๋‹ˆ๋ฉด CDN ์—์„œ๋งŒ ๋‹ค์šด๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?

  2. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž„ํฌํŠธํ•˜๋Š” ๋ฐฉ์‹์ด ๋ฌด์—‡์ธ๊ฐ€?

    ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์ธ๊ฐ€? ์•„๋‹ˆ๋ฉด require ๋˜๋Š” import/export ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ธ๊ฐ€?

์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ƒ˜ํ”Œ

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

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

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

js
var fs = require("fs");

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

ts
import fs = require("fs");

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

js
var someLib = require('someLib');

ํ˜น์€

js
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 ํ”„๋กœํผํ‹ฐ ํ• ๋‹น

๋ชจ๋“ˆ์„ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ (Templates For Modules)

๋ชจ๋“ˆ์„ ์œ„ํ•œ ๋„ค ๊ฐ€์ง€ ํ…œํ”Œ๋ฆฟ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ๊ฐ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ฐœ์š”๋Š” module.d.ts๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

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

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

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

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

์ž„ํฌํŠธ ๋˜์—ˆ์„ ๋•Œ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ์ˆ˜์ •์‚ฌํ•ญ์„ ๋งŒ๋“œ๋Š” ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, module-plugin.d.ts ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์„ธ์š”:

js
const jest = require("jest");
require("jest-matchers-files");

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

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

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

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

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

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

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

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

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

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

js
// Web
window.createGreeting = function (s) {
return "Hello, " + s;
};
// Node
global.createGreeting = function (s) {
return "Hello, " + s;
};
// Potentially any runtime
globalThis.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๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. โ€œ์ด๋ฆ„ ์ถฉ๋Œ ๋ฐฉ์ง€โ€ ๊ฐ์ฃผ๋ฅผ ๋ฐ˜๋“œ์‹œ ์ฝ์–ด๋ณด์„ธ์š”.

UMD

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

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

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

js
console.log(moment.format());

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

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

js
(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-plugin.d.ts ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

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

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

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

ts
/// <reference types="someLib" />
function getThing(): someLib.thing;

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

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

ts
import * as moment from "moment";
function getThing(): moment;

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

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

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

ts
/// <reference types="moment" />
function getThing(): moment;

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

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

ts
import * as someLib from 'someLib';

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

๊ฐ์ฃผ (Footnotes)

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

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

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

ts
declare namespace cats {
interface KittySettings { }
}

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

ts
// ์ตœ์ƒ์œ„-๋ ˆ๋ฒจ์—์„œ
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 ์‚ฌ์šฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

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

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

The TypeScript docs are an open source project. Help us improve these pages by sending a Pull Request โค

Contributors to this page:
MHMohamed Hegazy  (57)
  (6)
DRDaniel Rose  (3)
KKenrick  (1)
DRDaniel Rosenwasser  (1)
4+

Last updated: 2025๋…„ 11์›” 18์ผ

ย