ES6-module-import.md

๐Ÿก

Modern JavaScript Development: Modules and Tooling

Building a Morden Javascript Application modern JavaScript Development use modules, 3rd-party packages

Build Process & JavaScript Bundle

| ๋นŒ๋“œ ๊ณผ์ • | ๋‚ด์šฉ | | ---------- | ----------------------- | | bundling | ๋ชจ๋“ˆ์„ ํ•˜๋‚˜๋กœ ํ•ฉ์นฉ๋‹ˆ๋‹ค. | | transpling & polyfilling | ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ES5 ์ด์ „์œผ๋กœ convert ํ•ฉ๋‹ˆ๋‹ค. |

๐Ÿ’ก JavaScript๋ฅผ ํŠธ๋žœ์ŠคํŒŒ์ผ๋งํ•˜๋Š” ๊ธฐ์ค€์€ ์™œ ES6 (ES2015)์ธ๊ฐ€์š”?

Babel์€ JavaScript ์ฝ”๋“œ๋ฅผ ํŠธ๋žœ์ŠคํŒŒ์ผ(transpile)ํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง์€ ์ƒˆ๋กœ์šด JavaScript ๋ฌธ๋ฒ•์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ด์ „ ๋ฒ„์ „์˜ JavaScript ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

ES6๋Š” JavaScript์˜ ์ƒˆ๋กœ์šด ๋ฒ„์ „์œผ๋กœ, ๋งŽ์€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ๊ณผ ๊ฐœ์„ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ๋“ค์€ ์ฝ”๋“œ๋ฅผ ๋” ๊น”๋”ํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋Š”๋ฐ ๋„์›€์ด ๋˜๊ณ , ๊ฐœ๋ฐœ์ž๋“ค์˜ ํšจ์œจ์„ ๋†’์—ฌ์ค๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด, ํ™”์‚ดํ‘œ ํ•จ์ˆ˜, ๋ธ”๋ก ์Šค์ฝ”ํ”„ ๋ณ€์ˆ˜, ํด๋ž˜์Šค, ๋ชจ๋“ˆ ๋“ฑ์€ ์ฝ”๋“œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๊ณ  ์ดํ•ดํ•˜๋Š”๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.

Software development?

| ๊ณผ์ • | ๋‚ด์šฉ & ๊ตฌ์„ฑ | ์‚ฌ์šฉ | | --- | --- | --- | | development | modules, 3rd-party package๋กœ ๊ตฌ์„ฑ | package manager : npm, nodeJS | | build process | building๊ณผ transpilng, polyfilling ๊ณผ์ • | bundler : webpack & parcel, transplier : babel | | production | ๋นŒ๋”ฉ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์™„๋ฃŒ๋œ JavaScript ๋ฒˆ๋“ค | |

image

Module์€?

  • ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ & ์ฝ”๋“œ๋ฅผ ์บก์Šํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ module์€ ๋…๋ฆฝ์ ์ธ ํŒŒ์ผ(standalone file)๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • import & export
      • import : dependency
      • export : public api

Module์˜ ์žฅ์ 

  1. ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ถ„๋ฆฌ Compose software
  2. ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋…๋ฆฝํ™” Isolate component
  3. ์ถ”์ƒํ™” Abstract code
  4. ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌ Organized code
  5. ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉ Reuse code

ES6 Module vs Script

| | ES6 Module | Script | ์„ค๋ช… | | --- | --- | --- | --- | | top-level variables | ๋ชจ๋“ˆ socpe ๋‚ด | global | ES6 module์˜ ๋ณ€์ˆ˜ ํ™˜๊ฒฝ์€ ํ•ด๋‹น ๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.(์™ธ๋ถ€์—์„œ ๋ณ€์ˆ˜๋ฅผ ์•Œ์•„๋ณด๋ ค๋ฉด ๋ณ€์ˆ˜๋ฅผ export ํ•ฉ๋‹ˆ๋‹ค.) | | default mode | strict mode | sloppy mode | ES6 module์€ ๊ธฐ๋ณธ์ ์œผ๋กœ strict ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค. (strict ๋ชจ๋“œ๋ฅผ ์ตœ์ƒ๋‹จ์—์„œ ์ง์ ‘ ์„ ์–ธํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.) | | top-level์˜ this | undefined | window | ES6 module์—์„œ top-level this๋Š” undefined์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ์Šคํฌ๋ฆฝํŠธ์—์„œ this๋Š” window ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. | | Imports and exports | O | X | script์—์„œ๋Š” import์™€ export๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ES6 module์—์„œ Import๋Š” ๋งจ ์œ„์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.(ํ˜ธ์ด์ŠคํŒ… ๋ฉ๋‹ˆ๋‹ค.) | | HTML linking | | | type์ด ๋ชจ๋“ˆ์ž„์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. | | File downloading | ๋น„๋™๊ธฐ Asynchronous | ๋™๊ธฐ Synchronous | ES6 module์™€ ๋‹ฌ๋ฆฌ Script๋Š” ๋™๊ธฐ์ ์œผ๋กœ ํŒŒ์ผ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. https://javascript.info/script-async-defer ES6 module๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค. |

ES6 module์„ Importํ•˜๋Š” ๊ณผ์ •

import๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ณผ์ •์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

์˜ˆ์‹œ

  • index.js
import { rand } from "./math.js";
import { showDice } from "./dom.js";
const dice = rand(1, 6, 2);
showDice(dice);

Parsing

  • ๋ฉ”์ธ module์ด ์‹คํ–‰๋˜๊ธฐ ์ „์— parsing ์ž‘์—…์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.

๋™๊ธฐ์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š” dead ์ฝ”๋“œ ์‚ญ์ œ & ๋ฒˆ๋“ค๋ง์„ ์›ํ™œํžˆ ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

importํ•ด์˜จ ๋ชจ๋“  ๋ชจ๋“ˆ์ด ๋‹ค์šด๋˜๊ณ , ์‹คํ–‰๋œ ๋‹ค์Œ ๋ฉ”์ธ module์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ตœ์ƒ๋‹จ์—์„œ module์„ importํ•˜์—ฌ, ์‹คํ–‰ ์ „์— ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Download

  • ๋น„๋™๊ธฐ๋กœ ๋‹ค์šด๋กœ๋“œ ํ•ฉ๋‹ˆ๋‹ค.
    • module์˜ import ์ž์ฒด๋Š” ๋™๊ธฐ๋กœ ๋ฐœ์ƒ
    • module์˜ ๋‹ค์šด๋กœ๋“œ๋Š” ๋น„๋™๊ธฐ๋กœ ๋ฐœ์ƒ
    ๊ฐ ๋ชจ๋“ˆ์ด import => download๋˜๋ฉด, ๊ฐ ๋ชจ๋“ˆ ๋˜ํ•œ parsing, export ๊ณผ์ •์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.
    

linking imports

  • importํ•œ module์˜ exports๋ฅผ ๋ฉ”์ธ module์— ์—ฐ๊ฒฐ link ํ•ฉ๋‹ˆ๋‹ค.

  • link๋œ ๊ฐ’์€ ๋ณต์‚ฌ๋œ ๊ฐ’์ด ์•„๋‹ˆ๋ผ, ์—ฐ๊ฒฐ๋œ ๊ฐ’(์ฐธ์กฐํ•˜๋Š” ๊ฐ’)์ž…๋‹ˆ๋‹ค.

    • Live connection, NOT copies. like a pointer
    • ๋”ฐ๋ผ์„œ exports์˜ ๊ฐ’์ด ๋ฐ”๋€๋‹ค๋ฉด importํ•œ ๊ฐ’๋„ ๋ฐ”๋€Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
      ๐Ÿ‘‰ **ES6 Module์˜ ํŠน์ง•์ž…๋‹ˆ๋‹ค!**
      
      JavaScript๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์–ธ์–ด์˜ module์—์„œ๋Š” ํ•ด๋‹น๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
      
  • linking ํ›„, importํ•œ ๊ฐ ๋ชจ๋“ˆ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

import ์ˆœ์„œ ์ •๋ฆฌ

๐Ÿ“‹ ์ˆœ์„œ๋ฅผ ์ •๋ฆฌํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. ๋ฉ”์ธ module์„ ํŒŒ์‹ฑํ•ฉ๋‹ˆ๋‹ค.
2. import๊ฐ€ ๋™๊ธฐ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
3. download๊ฐ€ ๋น„๋™๊ธฐ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
4. imports์˜ exports๋ฅผ linkingํ•ฉ๋‹ˆ๋‹ค.
5. ๊ฐ module์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
6. ์ดํ›„, ๋ฉ”์ธ module์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.