|
| 1 | +# CHAPTER 10 모듈형 자바스크립트 디자인 패턴 |
| 2 | + |
| 3 | +ES2015 이전에 사용된 다양한 모듈 형식을 활용한 모듈형 자바스크립트 작성 방법 |
| 4 | + |
| 5 | +## 스크립트 로더에 대한 참고사항 |
| 6 | + |
| 7 | +AMD, CJS 같은 모듈형 자바스크립트를 이해하기 위해서는 |
| 8 | +모듈형 자바스크립트를 구현하기 위한 도구인 **스크립트 로더**에 대해 알아야 함 |
| 9 | + |
| 10 | +## AMD (Asynchronous Module Definition, 비동기 모듈 지원) |
| 11 | + |
| 12 | +- 모듈과 의존성 모두를 **비동기적으로 로드**할 수 있도록 설계된 모듈 정의 방식 |
| 13 | +- 개발자가 활용할 수 있는 모듈형 자바스크립트 솔루션을 제공하는 것이 목표 |
| 14 | +- 비동기적이면서도 높은 유연성을 가지고 있어 코드와 모듈 간 결합을 줄여줌 |
| 15 | +- jQuery에 도입된 형식 |
| 16 | + |
| 17 | +### 모듈 알아보기 |
| 18 | + |
| 19 | +#### 중요 개념 |
| 20 | + |
| 21 | +- 모듈 정의를 구현하는 `define` 메서드 |
| 22 | +- 의존성 로딩을 처리하는 `require` 메서드 |
| 23 | + |
| 24 | +### AMD가 모듈 기반 애플리케이션 개발에 좋은 이유 |
| 25 | + |
| 26 | +- 유연한 모듈 정의 방식에 대한 명확한 제안을 제공 |
| 27 | +- 전역 네임스페이스, `<script>` 태그 방식에 비해 구조화되어 있음 |
| 28 | +- 모듈 정의가 독립적으로 이루어지기 때문에 전역 네임스페이스의 오염을 방지할 수 있음 |
| 29 | +- 크로스 도메인, 로컬 환경, 디버깅 등에서 문제가 없으며, 서버 사이드 툴을 사용할 필요도 없음 |
| 30 | + 대부분의 AMD 로더는 빌드 과정 없이 브라우저에서 모듈을 로딩하는 것을 지원함 |
| 31 | +- 여러 모듈을 하나의 파일로 가져오기 위한 transport 방식을 제공함 |
| 32 | +- 스크립트의 lazy-load를 지원함 |
| 33 | + |
| 34 | +### AMD 장점 |
| 35 | + |
| 36 | +- 전역 객체의 사용에 대한 걱정을 줄여줌 |
| 37 | +- 변수에 모듈을 할당할 수 있음 |
| 38 | +- 브라우저 환경의 모듈 작동을 위해 서버 사이드에서의 변환이 따로 필요하지 않음 |
| 39 | +- 의존성 관리 측면에서 효율적 |
| 40 | + |
| 41 | +### AMD 단점 |
| 42 | + |
| 43 | +boilerplate/wrapper code 작성이 귀찮음 |
| 44 | + |
| 45 | +## CommonJS |
| 46 | + |
| 47 | +- **서버 사이드**에서 모듈을 선언하는 간단한 API를 지정하는 모듈 제안 |
| 48 | +- AMD와 달리 I/O, 파일 시스템, 프로미스 등 **더욱 광범위한 부분을 다룸** |
| 49 | +- 모듈과 패키지 2가지에 대한 표준을 정립하려 노력했음 |
| 50 | + |
| 51 | +### CommonJS 시작하기 |
| 52 | + |
| 53 | +#### 구조적 관점 |
| 54 | + |
| 55 | +- CommonJS 모듈은 재사용 가능한 자바스크립트 코드 |
| 56 | +- 외부 의존 코드에 공개할 특정 **객체**를 내보냄 |
| 57 | +- AMD와 달리 모듈을 함수로 감싸는 작업 X (ex. `define` 사용 X) |
| 58 | + |
| 59 | +#### 핵심 요소 |
| 60 | + |
| 61 | +- `exports` 변수 : 다른 모듈에 내보내고자 하는 객체를 담음 |
| 62 | +- `require` 함수 : 다른 모듈에서 내보낸 객체를 가져올 때 사용하는 함수 |
| 63 | + |
| 64 | +### Node.js 환경에서의 CommonJS |
| 65 | + |
| 66 | +- CommonJS 모듈은 Node.js에서 사용할 자바스크립트 코드를 패키징하기 위해 등장 |
| 67 | +- `require()` 함수를 호출하면 CommonJS 모듈 로더, `import()` 함수를 호출하면 ECMAScript 모듈 로더가 사용됨 |
| 68 | +- Node.js에서 ES6 모듈 문법으로 작성된 라이브러리 실행할 경우, 내부적으로 CommonJS로 트랜스파일 |
| 69 | + |
| 70 | +#### Node.js가 CommonJS 모듈로 인식하는 파일 |
| 71 | + |
| 72 | +- `.cjs` 확장자를 가진 파일 |
| 73 | +- 가까이에 위치한 `package.json` 파일에 type 항목이 commonjS로 되어있는 경우, `.js` 확장자를 가진 파일 |
| 74 | +- 가까이에 위치한 `package.json` 파일에 type 항목이 존재하지 않는 경우, `.js` 확장자를 가진 파일 |
| 75 | +- `.mjs`, `.cjs`, `.json`, `.node`, `.js` 이외의 확장자를 가진 파일 |
| 76 | + |
| 77 | +## AMD vs CommonJS: 동상이몽 |
| 78 | + |
| 79 | +AMD와 CommonJS는 서로 다른 목표를 가진 모듈 형식 |
| 80 | + |
| 81 | +### AMD |
| 82 | + |
| 83 | +- 브라우저 우선 접근 방식을 채택하여 비동기 동작과 간소화된 하위 호환성을 선택 |
| 84 | +- 파일 I/O에 대한 개념 없음 |
| 85 | +- 객체, 함수, 생성자, 문자열, JSON 등 다양한 형태의 모듈을 지원 |
| 86 | +- 브라우저에서 자체적으로 실행된다는 면에서 유연한 포맷 |
| 87 | + |
| 88 | +### CommonJS |
| 89 | + |
| 90 | +- 서버 우선 접근 방식을 취하며 동기적 작동, 전역 변수와의 독립성, 미래의 서버 환경을 고려 |
| 91 | +- 언래핑된 모듈을 지원하기 때문에 ES2015+ 표준에 가깝게 느껴짐 |
| 92 | +- AMD에서 필수적인 define 함수를 사용하지 않아도 된다. |
| 93 | +- 오직 객체만을 모듈로써 지원 |
| 94 | + |
| 95 | +> CommonJS의 문제점 (출처 : https://velog.io/@eunbinn/commonjs-is-hurting-javascript) |
| 96 | +> |
| 97 | +> - 모듈 로딩이 동기식입니다. 각 모듈은 불린 순서대로 하나씩 로드되고 실행됩니다. |
| 98 | +> - 트리셰이킹이 어렵습니다. 따라서 사용하지 않는 모듈을 제거하고 번들 크기를 최소화하기 어렵습니다. |
| 99 | +> - 브라우저 기반이 아닙니다. 이 모든 코드가 클라이언트 사이드에서 동작하도록 하려면 번들러와 트랜스파일러가 필요합니다. |
| 100 | +> 따라서 CommonJS를 사용하면 빌드 단계가 길어지거나 클라이언트와 서버의 코드를 구분해서 작성해야 합니다. |
| 101 | +
|
| 102 | +### UMD: 플러그인을 위한 AMD 및 CommonJS 호환 모듈 |
| 103 | + |
| 104 | +브라우저와 서버 환경에서 모두 작동할 수 있는 모듈을 원하는 개발자에게는 |
| 105 | +기존 AMD와 CommonJS의 약점을 해결하는 방안이 필요했고, UMD 형식이 만들어짐 (아직 실험 단계) |
| 106 | +AMD나 CommonJS를 대체하기 위한 것이 아니라, 다양한 환경에서 코드가 동작할 수 있도록 돕는 보조 도구 |
0 commit comments