Languages/Javascript

[javascript] CJS, AMD, UMD, ESM ์ด๋ž€? / ์‚ฌ์šฉ๋ฒ•

MOONCO 2021. 5. 21. 13:53

๐Ÿ‘‰ CJS, AMD, UMD, ESM์˜ ๋ชฉ์ 

์ฒ˜์Œ JS๋Š” ๋ชจ๋“ˆ๋กœ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๋‚ด๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์ด ์—†์–ด, ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๋‹ด์•„์•ผ ํ–ˆ๋‹ค.

JS ํ”„๋กœ๊ทธ๋žจ์„ ๋ชจ๋“ˆ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ , ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ,

CJS, AMD, UMD, ESM์„ ๊ฐœ๋ฐœํ–ˆ๋‹ค.

 

๐Ÿ‘‰ CJS (CommonJS)

javascript๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋งŒ ์•„๋‹ˆ๋ผ, ๋‹ค๋ฅธ ๊ณณ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” API

 

API๋ž€?

 

[ํ”„๋กœ๊ทธ๋ž˜๋ฐ] API๋ž€?

API๋ž€? ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ๋ผ๋ฆฌ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๋„๊ตฌ Application Programming Interface ์•ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธํ„ฐํŽ˜์ด์Šค API ์˜ˆ์‹œ REST API : ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์—ฐ๊ฒฐ GraphQL API : ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์—ฐ๊ฒฐ

defineall.tistory.com

 

CJS ๊ตฌ๋ฌธ ( ์‚ฌ์šฉ๋ฒ• )

// require๋ฅผ ํ†ตํ•ด ๋ชจ๋“ˆ์„ ๋ณ€์ˆ˜์— ๋‹ด์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค
var lib = require('package/lib');

// ๊ฐ€์ ธ์˜จ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.
function foo() {
  lib.log('hello world!');
}

// foo ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก, ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋กœ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค
exports.foobar = foo;

 

CJS ํŠน์ง• - ๋™๊ธฐ์  ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

๋™๊ธฐ์  ๋ฐฉ์‹์ด๋ž€?

 

[ํ”„๋กœ๊ทธ๋ž˜๋ฐ] ๋™๊ธฐ์ฒ˜๋ฆฌ, ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ ๋ž€?

๋™๊ธฐ(synchronous) ์ฒ˜๋ฆฌ ์ด์ „ ์ž‘์—…์ด ๋๋‚˜์•ผ, ๋‹ค์Œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹ ๋น„๋™๊ธฐ(asynchronous) ์ฒ˜๋ฆฌ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹ // ์ŠคํŠธ๋ฆฌ๋ฐ๋„ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ค‘์— ํ•˜๋‚˜๋‹ค.

defineall.tistory.com

 

๋™๊ธฐ์  ๋ฐฉ์‹ ์˜ˆ์‹œ

var foo = require('foo');
var bar = require('bar');

foo.log('It is foo');
bar.log('It is bar');


// ์ถœ๋ ฅ ๊ฒฐ๊ณผ
It is foo
It is bar

 

 

CJS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • Node.js
  • PINF

 

๐Ÿ‘‰ AMD (Asynchronous Module Definition)

CommonJS๋Š” ๋ชจ๋“  ํŒŒ์ผ์ด ๋กœ์ปฌ ๋””์Šคํฌ์— ์žˆ์–ด, ํ•„์š”ํ•  ๋•Œ ๋ฐ”๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์—์„œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

๋ธŒ๋ผ์šฐ์ €์—์„œ ์ด๋Ÿฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด, ํ•„์š”ํ•œ ๋ชจ๋“ˆ์ด ๋ชจ๋‘ ๋‹ค์šด๋กœ๋“œ๋  ๋•Œ๊นŒ์ง€ ์•„๋ฌด๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†๋‹ค.

๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” API์ธ, AMD๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

 

AMD ๊ตฌ๋ฌธ ( ์‚ฌ์šฉ๋ฒ• )

// myModule.js
// define์„ ์ด์šฉํ•ด ์ƒˆ๋กœ์šด ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ , ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ์ „ํ•ด์คŒ
define(['package/lib'], function (lib) {

  // ์ฝœ๋ฐฑํ•จ์ˆ˜ ์ด์šฉํ•ด์„œ, ๋ถˆ๋Ÿฌ์˜จ ๋ชจ๋“ˆ ์‚ฌ์šฉ๊ฐ€๋Šฅ
  function foo () {
    lib.log('hello world!');
  }
  
  // ๋‹ค๋ฅธํŒŒ์ผ์—์„œ fooํ•จ์ˆ˜๋ฅผ, foobar์ด๋ž€ ์ด๋ฆ„์˜ ๋ชจ๋“ˆ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ฌ
  return {
    foobar: foo
  };
});
// ์œ„์—์„œ ์„ ์–ธํ•œ ๋ชจ๋“ˆ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
require(['package/myModule'], function (myModule) {
  myModule.foobar();
});

 

AMD๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • RequireJS
  • PINF

 

๐Ÿ‘‰ UMD (Univarsal Module Definition)

AMD์™€ CommonJS๊ฐ€ ์„œ๋กœ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ API

 

UMD ๊ตฌ๋ฌธ ( ์‚ฌ์šฉ๋ฒ• )

(function (root, factory) {
  if(typeof define === 'function' && define.amd) {
    // define์ด ํ•จ์ˆ˜์ด๊ณ , define.amd๊ฐ€ ์กด์žฌํ• ๋•Œ AMD์‚ฌ์šฉ
    define(['exports', 'b'], factory);
  } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
    // export๊ฐ€ ๊ฐ์ฒด์ด๊ณ , export.nodeName์ด ๋ฌธ์ž์—ด์ด ์•„๋‹๋•Œ, CommonJS์‚ฌ์šฉ
    factory(exports, require('b'));
  } else {
    //Browser globals
    factory((root.commonJsStrict = {}), root.b);
  }
}(this, function (exports, b) {
  // use b in some fashion.
  // attach properties to the exports object to define
  // the
  exports.action = function () {};
}));

 

UMD ํŠน์ง• - ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ ๋กœ๋”์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

AMD์™€ CommonJS์—์„œ ๋ชจ๋‘ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.

AMD - ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ

CommonJS - ์„œ๋ฒ„ ์‚ฌ์ด๋“œ

 

๐Ÿ‘‰ ESM (ECMAScript Module)

ES6๋ถ€ํ„ฐ ์ถ”๊ฐ€๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“ˆ ๊ธฐ๋Šฅ

 

ESM ๊ตฌ๋ฌธ ( ์‚ฌ์šฉ๋ฒ• )

// import, from ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค!
import lib from 'package/lib';

function foo () {
  lib.log('hello world!');
}

export {
  foobar: foo
};

 

ESM ํŠน์ง• - javascript ์ž์ฒด ๋ชจ๋“ˆ ์‹œ์Šคํ…œ

ECMAScript์—์„œ ์ง€์›ํ•˜๋Š” ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ๊ณต์‹ ๋ชจ๋“ˆ

import์™€ export๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋งŽ์œผ๋ฏ€๋กœ, ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.
<script> ํƒœ๊ทธ์— type="module"์„ ์„ ์–ธํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋ชจ๋“ˆ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋•Œ, ๋ชจ๋“ˆ์ด๋ผ๋Š” ๊ฒƒ์„ ์ •ํ™•ํžˆ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด mjs ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•œ๋‹ค.

 

ESM ์‚ฌ์šฉ๋ฒ•

<html>
<body>
  <script type="module" src="foo.mjs"></script>
  <script type="module" src="foo.mjs"></script>
</body>
</html>
// foo.mjs
var x = 'foo';

console.log(x);  // foo

console.log(window.x);
// bar.mjs
// import๋ฅผ ์‚ฌ์šฉํ•ด, ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค

import test from "./module.mjs";
console.log(test);

var x = 'bar';

console.log(x);

console.log(window.x);
// module.mjs
const test = 'hello world';

// export๋ฅผ ์‚ฌ์šฉํ•ด, ๋ชจ๋“ˆ๋กœ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
export default test;

 

 

๋ฐ˜์‘ํ˜•