๋ฐฐ๊ฒฝ
ํจ์๋ค๋ผ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น? ์ ์ญ ์ค์ฝํ์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ๋๋ค๋ฉด ๋ค๋ฅธ ๋ด๋ถ ์์์ ์ํด ๋ง๊ฐ์ง ์๋ ์๊ณ , ์์๊ฐ ๋ค์์ผ ์ ์ญ ์ค์ฝํ์ ์์๊ฐ ์กด์ฌํ์ง ์์ ์๋ ์๋ค.
๋ฐ๋ผ์ ๋ชจ๋์ด๋ผ๋ ๋ฐฉ์์ ์ด์ฉํ๋ฉด ๊ฐ๊ฐ ํ์ํ ๋ชจ๋์ importํ์ฌ ์ฌ์ฉํจ์ผ๋ก์จ ์ด๋์์ ์๋ฌ๊ฐ ๋๋์ง ํ์ ํ๊ธฐ ์ฝ๋ค. ๋ชจ๋์ ๋ง๋ค๊ณ import, export ํ๋ ์์คํ ์ ๋ชจ๋ ์์คํ ์ด๋ผ ํ๋๋ฐ ํ์ฌ 2๊ฐ์ง์ ๋ชจ๋ ์์คํ ์ด ํ๋ฐํ๊ฒ ์ฌ์ฉ๋๊ณ ์๋ค.
- CommonJS
- ES modules
์ฐจ์ด์
๊ธฐ์ด ๋ฌธ๋ฒ
CommonJS
const module = require('์ด์ฉ๊ตฌ');
const { func } = require('์ด์ฉ๊ตฌ');
module.exports = '์ด์ฉ๊ตฌ'; // default exports
module.exports.func = () => {}; // named exports
ES Modules
import a from '์ด์ฉ๊ตฌ';
import {func} from '์ด์ฉ๊ตฌ';
export const a = '์ด์ฉ๊ตฌ'; // default exports
export default func = () => {}; // named exports
ํธํ
ESM์ CJS๋ ํธํ์ด ์๋๋ค. ESM์์ CJS๋ฅผ default importํ๊ฑฐ๋ CJS์์ ESM์ require๋ก ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ๋ง์ด ๊ฐ๋ฅํ์ง๋ง ์ด์กฐ์ฐจ๋ ๋ง์ boilerplate์ ๋ฒ๋ค๋ฌ๊ฐ ํ์ํ๋ฉฐ ์์๊ฐ ๋ณด์ฅ๋์ง ์๋๋ค.
๋น๊ต
<ES Modules>
- ๋ชจ๋์ ๋น๋๊ธฐ ํ๊ฒฝ์์ ๋ค์ด๋ก๋ํ๋ฉฐ, import export ๊ตฌ๋ฌธ์ ์ฐพ์์ ํ์ฑํ๋ค.
- ๋ฐ๋ผ์ ES modules๋ ์คํํด๋ณด์ง ์์๋ import, export ์๋ฌ๋ฅผ ๊ฐ์งํ ์ ์๋ค.
- config๋ฅผ type="module" ๋ก set ํด์ฃผ์ด์ผ ์ฌ์ฉํ ์ ์๋ค.
- top-level await๊ฐ ๊ฐ๋ฅํ๋ค.
<Common JS>
- require๊ฐ ๋๊ธฐ๋ก ์ด๋ฃจ์ด์ง๋ฏ๋ก promise๋ฅผ return ํ์ง ์๋๋ค.
- ๋ฐ๋ผ์ CommonJS๋ ์คํํด๋ณด์์ผ import, export ์๋ฌ๋ฅผ ๊ฐ์งํ ์ ์๋ค.
- ๊ธฐ๋ณธ ๊ฐ์ด๋ค.
- top-level await๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
๋์ ๋ฐฉ์
ES Modules
๊ฐ๋ฐ์๊ฐ ์ง์ ํ ํ์ผ์ entry point๋ก ํ์ฌ ๋๋จธ์ง ํ์ผ๋ค์ import๋ฌธ์ ๋ฐ๋ผ๊ฐ๋ฉฐ ์ฐพ๋๋ค. ํ์ผ์ ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉํ๋ ค๋ฉด ๋ชจ๋ ๋ ์ฝ๋ ๋ผ๋ ๊ณผ์ ์ด ํ์ํ๊ณ ์ดํ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ๋ชจ๋ ์ธ์คํด์ค๋ก ๋ณํํด์ผํ๋ค. ๋ชจ๋ ์ธ์คํด์ค๋ ์ฝ๋์ ํ์ฌ ์ํ๋ฅผ ๊ฒฐํฉํ๋ ์ญํ ์ ํ๋ค.
๋ชจ๋์ ๋ถ๋ฌ์ค๋ ๊ณผ์ ์ entry ํ์ผ์ด ๋ชจ๋ ์ธ์คํด์ค ์ ์ฒด ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๋ฉด์ ์งํ๋๋๋ฐ, ES ๋ชจ๋ ๋ช ์ธ์ ๋ฐ๋ฅด๋ฉด ๊ทธ ๊ณผ์ ์ ํฌ๊ฒ ๊ตฌ์ฑ, ์ธ์คํด์ค ํ, ํ๊ฐ๋ก ์ด๋ฃจ์ด์ง๋ค.
์ด๋ ๊ฒ ES modules๋ ๋น๋๊ธฐ๋ฐฉ์์ผ๋ก ๋จ๊ณ๊ฐ ์งํ๋๋ ๋ฏ ๋ณด์ด์ง๋ง ES ๋ชจ๋ ๋ช ์ธ ๋ง๊ณ ๋ loader๊ฐ ํ์ผ์ ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ ๋ฐ๋ผ์๋ ์ํฅ์ ๋ฐ๊ธฐ ๋๋ฌธ์, ์ฌ์ฉ ์ค์ธ ํ๋ซํผ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ก๋๊ฐ ๋๊ธฐ์ ์ผ๋ก ํ์ผ์ ๋ก๋ํ ์๋ ์๋ค.
1. ๊ตฌ์ฑ : ๋ชจ๋ ํ์ผ์ ํ์ธํ๊ณ (resolution) ๋ค์ด๋ก๋ํ๊ณ ๋ชจ๋ ๋ ์ฝ๋๋ก ๊ตฌ๋ฌธ๋ถ์ํ๋ค.
loader๋ ํ์ผ์ ์ฐพ์์ ๋ค์ด๋ก๋ํ๋๋ฐ, script ํ๊ทธ์ src๋ฅผ ํตํด entry point๋ฅผ ์ฐพ๊ณ import, export๋ฅผ ๊ฑฐ์ณ๊ฐ๋ฉด์ ํ์ผ๋ค์ ์ฐพ๋๋ค. ๋ฏธ๋ฆฌ ์ ์ฒด ๋ชจ๋ ๊ทธ๋ํ๋ฅผ ์์ฑํด์ผํ๋ฉฐ ์ด ๋ ๋ณ์์๋ ์์ง ๊ฐ์ด ์๋ค. ๋ฐ๋ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋ชจ๋ ๊ฒฝ๋ก์ ๋ณ์ ๊ฐ์ ๋ฃ์ด ์ฌ์ฉํ ์ ์์ง๋ง, import ํํ์ ์ ์ฌ์ฉํ๋ฉด dynamic import๊ฐ ๊ฐ๋ฅํ๋ฏ๋ก ๋ณ์ ๊ฐ์ ์ฌ์ฉํ ์ ์๋ค.
๋ชจ๋ ๋ ์ฝ๋๋ก ๋ถ์ํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ๋ชจ๋์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ดํดํ ์ ์๊ณ , ํด๋น ๋ ์ฝ๋๋ ๋ชจ๋๋งต์ ์ถ๊ฐ๋์ด ํ์ํ ๋๋ง๋ค ๋ก๋๊ฐ ๊ฐ์ ธ์ฌ ์ ์๋ค. ๋ชจ๋ ๋ถ์ ์ ์ ํด๋น ํ์ผ์ด ๋ชจ๋์์ ์๋ ค์ฃผ๊ธฐ ์ํด ์คํฌ๋ฆฝํธ ํ๊ทธ ๋ด๋ถ์ type="module"์ ํ์ํด์ฃผ์ด์ผ ํ๋ค. node ํ๊ฒฝ์์๋ .mjs ํ์ฅ์๋ก ๋ชจ๋์์ ์๋ ค์ค๋ค.
2. ์ธ์คํด์ค ํ : export๋ ๊ฐ์ ์ํด ๋ฉ๋ชจ๋ฆฌ์ ๊ณต๊ฐ์ ์ฐพ๊ณ export, import๋ฅผ ํด๋น ๊ณต๊ฐ์ linkingํ๋ค.
๋ชจ๋ ๋ ์ฝ๋๋ก๋ถํฐ ๋ชจ๋ ํ๊ฒฝ ๋ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ๋ณ์๋ฅผ ๊ด๋ฆฌํ๋ค. ๋ณ์ ๊ฐ์ ํ๊ฐ๊ฐ ๋๋ ํ์ ์ฑ์์ง๋ค.
์์ ๊ฐ์ด export์ import๋ฅผ ๊ฐ์ ๋ณ์์ linkingํ๋ค. export ๋์ ๋ณ์๋ฅผ ์์ ํ ์ ์์ง๋ง, import๋ ๋ถ๊ฐ๋ฅํ๋ค.
3. ํ๊ฐ : ์ฝ๋๋ฅผ ์คํํ์ฌ ๋ณ์์ ์ค์ ๊ฐ์ผ๋ก ์ฑ์ด๋ค.
ํ ๋น๋ ๋ณ์ ๊ฐ์ ์ฑ์ด๋ค. ์ด ๋ ๋ค๋ฅธ ์์ ์ด ์ผ์ด๋ฌ๋ค๊ณ ํด์ ๋ชจ๋์ด 2๋ฒ ํ๊ฐ๋๋ฉด ์๋๋ฏ๋ก ๋ชจ๋ ๋งต์ ์ด์ฉํ์ฌ ํ๋์ ๋ชจ๋ ๋ ์ฝ๋๋ง์ด ์กด์ฌํ๋๋ก ๋ณด์ฅํ๋ค.
Common JS
- ํ์ผ์ import ์์์ ๋ฐ๋ผ ์์ฐจ์ ์ผ๋ก ์์ ์คํํ๋ฏ๋ก ๋ณ์ ๊ฐ์ ํ ๋นํ ์ ์๋ค.
- ๋ณ์์ linking ์ export ๊ฐ์ ์ฌ๋ณธ์ผ๋ก ๋ณต์ฌํ์ฌ ์ฌ์ฉํ๋ค. ๋ฐ๋ผ์ export, importํ๋ ๋ณ์๊ฐ ๋ค๋ฅด๋ค.
์ํ ์์กด์ฑ
// main.js
let count = require('./counter.js').count;
export message = 'hi';
// counter.js
let message = require('./main.js').message; // message ์ ์๋์ด ์์ง ์์
setTimeout(() => console.log(message), 0); // CommonJS : undefined, ES Modules : 'hi'
์ํ๊ด๊ณ๊ฐ ์์ ๋ CommonJS๋ ๋ณ์ ๊ฐ์ ๋ณต์ฌํด์ ์ฌ์ฉํ๋ฏ๋ก main.js์์์ message๊ฐ ํ ๋น์ด ๋์ด๋ counter.js์์์ ๋ณ์๋ ๋ณํ์ง ์๋๋ค. ํ์ง๋ง ES Modules์์๋ ๊ฐ์ ๋ณ์๋ฅผ ์ฐธ์กฐํ๊ณ ์์ผ๋ฏ๋ก setTimout์์ ์ ๋๋ก ํ ๋น๋ ๋ณ์๊ฐ ์ถ๋ ฅ๋๋ค. ES Module์ ์์ ๊ฐ์ด ์ํ ์์กด์ฑ์ ์ง์ํ๋ค.
์ค์ ์ฌ์ฉ
React์์๋ ESModules์ ์ฃผ๋ก ์ฌ์ฉํ๋ค. ํจํค์ง ๋ชจ๋๋ค์ ๊ฒฐ๊ตญ CommonJS๋ฅผ ๊ธฐ๋ณธ ๋ชจ๋ ์์คํ ์ผ๋ก ์ ํํ๊ธฐ ๋๋ฌธ์, ์ฝ๋ ์์ฑ ์ CommonJS๋ก ๋ณํํด์ฃผ์ด์ผ ํ๋๋ฐ ํด๋น ์์ ์ ๋ฒ๋ค๋ฌ์ธ Babel์ด ์ํํ๋ค.
https://runebook.dev/ko/docs/babel/babel-plugin-transform-modules-commonjs/index
์ ๋ฆฌ
๋ํ์ ์ธ ๋ ๊ฐ์ง์ ๋ชจ๋ ์์คํ ์ค CommonJS๊ฐ ์ฒ์์ ๋ฑ์ฅํ์์ผ๋, ํ์ฌ๋ ES modules ๋ชจ๋ ์์คํ ์ด ๋ง์ด ์ฌ์ฉ๋๊ณ ์๋ค. CommonJS์ ๋น๊ตํ์ฌ ES modules๋ ๋น๋๊ธฐ๋ก ๋์ํ์ฌ ์๋๊ฐ ๋น ๋ฅด๊ณ ์ค์ ์ฌ์ฉ๋๋ ๋ถ๋ถ๋ง์ import(tree shaking) ํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒ ์ฐจ์งํ๋ฉฐ, ๊ฐ๋ ์ฑ์ด ์ข๊ณ ์ํ ์์กด์ฑ์ ์ง์ํ๋ค๋ ์ด์ ์ด ์๋ค.
์ฐธ๊ณ
https://yceffort.kr/2020/08/commonjs-esmodules
https://ui.toast.com/weekly-pick/ko_20180402
https://ko.javascript.info/modules-dynamic-imports
https://www.daleseo.com/js-module-import/
๋ถ์ ํํ ์ ๋ณด๊ฐ ๋ด๊ฒจ์์ ์ ์์ต๋๋ค!
๋๊ธ๋ก ์๋ ค์ฃผ์ธ์ :)
Comment