์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ •์„ ๐ŸŸก

[์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ] CommonJS vs ES Modules

์ฝ”๋”ฉํ•˜๋Š” ํฌ๋ฃจ 2024. 9. 10. 21:49

์ฐธ๊ณ ์ž๋ฃŒ1

์ฐธ๊ณ ์ž๋ฃŒ 2

 

 

 

๐Ÿ“• JS ๋ชจ๋“ˆ์„ ๋‚ด๋ณด๋‚ด๋Š” ๋ฐฉ์‹์€ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

- ๐Ÿ“Œ ๋ชจ๋“ˆ์ด๋ž€? ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ๋“ค์— ๊ด€ํ•œ ์ฝ”๋“œ๊ฐ€ ๋ชจ์—ฌ์žˆ๋Š” ํ•˜๋‚˜์˜ ํŒŒ์ผ 

- ์ฒซ๋ฒˆ์งธ๋Š” module.exports๋กœ ๋ชจ๋“ˆ์„ ๋‚ด๋ณด๋‚ด๊ณ  require()๋กœ ์ ‘๊ทผํ•˜๋Š” CJS(CommonJS)

- ๋‘๋ฒˆ์งธ๋Š” export๋กœ ๋ชจ๋“ˆ์„ ๋‚ด๋ณด๋‚ด๊ณ  import๋กœ ์ ‘๊ทผํ•˜๋Š” ESM(ES Modules)๊ฐ€ ์žˆ๋‹ค.

 

//CJS
modules.exports = { ... }  //๋ชจ๋“ˆ ๋‚ด๋ณด๋‚ผ๋•Œ
const utils = requires('utils');  //๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ฌ ๋•Œ
// ESM ๋ฐฉ๋ฒ•
export.default = () => {... }; //๋ชจ๋“ˆ์„ ๋‚ด๋ณด๋‚ผ ๋•Œ
import utils from 'utils'; // ๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ฌ ๋•Œ

 

 

โœจ์ฐจ์ด์ 

1. CJS ๋ฐฉ์‹

- require๋กœ ๋ชจ๋“ˆ์„ ์ ‘๊ทผํ•˜๊ณ  module.exports๋กœ ๋ชจ๋“ˆ์„ ๋‚ด๋ณด๋‚ด๋Š” ESM ๋ฐฉ์‹

- Node.js์—์„œ ์ง€์›ํ•˜๋Š” ๋ชจ๋“ˆ ๋ฐฉ์‹์œผ๋กœ ์ดˆ๊ธฐ Node ๋ฒ„์ „๋ถ€ํ„ฐ ์‚ฌ์šฉ

- ๋ณ„๋„์˜ ์„ค์ •์ด ์—†๋‹ค๋ฉด CJS๊ฐ€ ๊ธฐ๋ณธ๊ฐ’

 

1) ๋ชจ๋“ˆ์— ์ ‘๊ทผํ•  ๋•Œ require()

- ์™ธ๋ถ€ ๋ชจ๋“ˆ์— ์ ‘๊ทผํ• ๋•Œ๋Š” require()์„ ์‚ฌ์šฉ

 

2) ๋‚ด๋ณด๋‚ผ ๋•Œ๋Š” module.exports

- named exports, default exports ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ์Œ

 

- named export๋Š” export ๋Œ€์ƒ์„ ๋ช…๋ช…ํ•˜์—ฌ ๋‚ด๋ณด๋‚ด๋Š” ๋ฐฉ์‹

module.exports.add = (a, b) => a + b;
module.export.sub = (a, b) => a - b;

 

๋˜๋Š”,

const calculator = require("./calculator.js");  
const { add } = require("./calculator.js");

 

 

3) ํŠน์ง•

- require()๋Š” ์ฆ‰์‹œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ตฌ์กฐ

- top-level await์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™

- ๋™๊ธฐ๋กœ ์ž‘๋™ํ•˜๋ฏ€๋กœ promise๋ฅผ ๋ฆฌํ„ดํ•˜์ง€ ์•Š๊ณ , module.exports์— ์„ค์ •๋œ ๊ฐ’๋งŒ์„ ๋ฆฌํ„ด

- import ์ˆœ์„œ์— ๋”ฐ๋ผ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰

 


 

๐Ÿ“Œ top-level await ์ด๋ž€?
ES2022์—์„œ ๋‚˜์˜จ ๊ธฐ๋Šฅ์œผ๋กœ, ๋ชจ๋“ˆ์˜ ์ตœ์ƒ์œ„ ์Šค์ฝ”ํ”„์—์„œ ๋น„๋™๊ธฐ ๋™์ž‘์„ awaitํ•˜์—ฌ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
 ์ด์ „์—๋Š” async ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ๋Š” ์Šค์ฝ”ํ”„๋‚ด์—์„œ๋งŒ await๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์Šค์ฝ”ํ”„์—์„œ ๋น„๋™๊ธฐ ๋™์ž‘์ด ์™„๋ฃŒ๋˜๊ธฐ๊นŒ์ง€ ๋ธ”๋กœํ‚นํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ
๋ชจ๋“ˆ ๋‹จ์œ„์—์„œ await๋ฅผ ํ†ตํ•ด ํŠน์ • ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ๋™์ž‘์ด ์™„๋ฃŒ๋˜๊ธฐ๊นŒ์ง€ ํ•˜์œ„ ๋ชจ๋“ˆ์˜ ๋™์ž‘์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

๐Ÿ’ป ์˜ˆ์‹œ ์ฝ”๋“œ

//a.js
import fetch  from "node-fetch";
let users;
export default (async () => {
  const resp = await fetch('https://jsonplaceholder.typicode.com/users');
    users = resp.json();
})();
export { users };

//b.js
import promise, {users} from './a.js';
  promise.then(() => { 
    console.log('All users:', users);
  });

- a ๋ชจ๋“ˆ์„ b ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ a ๋ชจ๋“ˆ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ ์‚ฌ์šฉ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์œ„์™€ ๊ฐ™์ด ์ฒ˜๋ฆฌํ•ด์•ผ ํ–ˆ์Œ

 

 //a.js
  const resp = await fetch('https://jsonplaceholder.typicode.com/users');
  const users = resp.json();
  export { users};

  //b.js
  import { users } from './a.js';

  console.log(users);
  console.log('In usingAwait module');

- ์ด๋ ‡๊ฒŒ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

 

 


 

 

2. ESM

- import๋กœ ๋ชจ๋“ˆ์„ ์ ‘๊ทผํ•˜๊ณ  export๋กœ ๋ชจ๋“ˆ์„ ๋‚ด๋ณด๋‚ด๋Š” ESM ๋ฐฉ์‹

- ESMAScript์— ์ง€์›ํ•˜๋Š” ๋ฐฉ์‹

- Node14์—์„œ๋Š” CJS, MJS(ES Modules)์ด ๊ณต์กดํ•˜๋Š”๋ฐ, ๋‘๊ฐœ๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

- ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ CJS(๊ธฐ๋ณธ๊ฐ’)์—์„œ ESM์œผ๋กœ ๋ณ€๊ฒฝํ•  ์‹œ, JS ์ผ๋ถ€ ๋™์ž‘์ด ๋ณ€๊ฒฝ๋œ๋‹ค.

 

1. ์‚ฌ์šฉ๋ฐฉ๋ฒ•

- ESM ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” package.json์— 'type:'module'์„ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

// package.json

{
  "type": "module",
}

 

 

2. ๋ฌธ๋ฒ•

- ๋ชจ๋“ˆ ์ ‘๊ทผํ•  ๋•Œ๋Š” import()

- ๋ชจ๋“ˆ ๋‚ด๋ณด๋‚ผ ๋•Œ๋Š” export()

 

 

3. ํŠน์ง•

- top-level await๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ module loader๊ฐ€ ๋น„๋™๊ธฐ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋œ๋‹ค.

- ๊ทธ๋Ÿฌ๋ฏ€๋กœ CJS์ฒ˜๋Ÿผ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐ”๋กœ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  import, export ๊ตฌ๋ฌธ์„ ์ฐพ์•„ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํŒŒ์‹ฑํ•œ๋‹ค.

- ํŒŒ์‹ฑ๋‹จ๊ณ„์—์„œ import, export ์—๋Ÿฌ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

- ๋ชจ๋“ˆ์„ ๋ณ‘๋ ฌ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜์ง€๋งŒ, ์‹คํ–‰์€ ์ˆœ์ฐจ์ ์œผ๋กœ ํ•œ๋‹ค.

- import, export๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์žˆ์–ด ESM ์‚ฌ์šฉ์„ ์œ„ํ•ด ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.