Skip to content

Commit a2414db

Browse files
authored
Docs: 박승훈 10장 (#96)
1 parent a312f0a commit a2414db

File tree

2 files changed

+167
-0
lines changed

2 files changed

+167
-0
lines changed

챕터_10/박승훈.md

+167
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
## 들어가며
2+
3+
- 모듈형 : "서로 의존성이 낮은 기능들이 모듈로써 저장된 형태"
4+
- 느슨한 결합은 의존성을 제거하여 앱의 유지보수에 용이
5+
6+
## 스크립트 로더
7+
8+
- 모듈형 JS를 구현하기 위한 핵심도구
9+
- 호환 가능한 스크립트 로더를 사용해야만 모듈형 JS 구현 가능
10+
11+
12+
## AMD
13+
14+
- Asynchronous Module Definition
15+
- 모듈과 의존성 모두를 비동기적으로 로드할 수 있도록 설계된 모듈 정의 방식
16+
- 주요 목표 : 개발자들이 활용할 수 있는 모듈형 JS 솔루션 제공
17+
- JS 모듈화를 위한 주춧돌
18+
19+
20+
### AMD의 구조
21+
22+
- define() : 모듈을 정의하는 함수
23+
- require() : 모듈을 로드하는 함수
24+
25+
26+
```javascript
27+
define('module', ['dependency'], function(dependency) {
28+
return {
29+
method: function() {
30+
dependency.method();
31+
}
32+
};
33+
});
34+
35+
require(['module'], function(module) {
36+
module.method();
37+
});
38+
```
39+
40+
41+
### AMD 결론
42+
43+
- 탄탄한 애플리케이션 작성에 여러 장점을 제공
44+
- 전역 객체의 사용을 최소화
45+
- 변수에 모듈을 할당 가능
46+
- 의존성 관리 측면에서 효율적
47+
48+
49+
### 나의 생각
50+
51+
AMD는 사용할 일이 없어서 조금 어려운 감이 있네요. 예제에는 더 다양한 예시와 설명들이 있는데 가볍게 훑고 지나간 것 같습니다.
52+
53+
54+
## CommonJS
55+
56+
- 서버 사이드에서 모듈을 선언하는 간단한 API를 지정하는 모듈 제안
57+
- AMD와는 달리 I/O, 파일시스템, 프로미스 등 더욱 광범위한 기능 제공
58+
59+
60+
### CommonJS의 구조
61+
62+
- 모듈을 함수로 감싸는 작업이 불필요(AMD의 define과 달리)
63+
- exports 객체를 통해 다른 모듈에 내보내고자 하는 객체를 담음
64+
- require() 함수를 통해 다른 모듈을 불러옴
65+
66+
67+
```javascript
68+
var lib = require('package/lib');
69+
70+
function foo() {
71+
lib.log('hello world');
72+
}
73+
74+
exports.foo = foo;
75+
```
76+
77+
만약 위의 코드를 AMD로 구현했다면?
78+
79+
```javascript
80+
// 정적 의존성
81+
define(['package/lib'], function(lib) {
82+
function foo() {
83+
lib.log('hello world');
84+
}
85+
86+
return {
87+
foo: foo
88+
};
89+
});
90+
91+
// 동적 의존성
92+
define(function(require) {
93+
var lib = require('package/lib');
94+
95+
function foo() {
96+
lib.log('hello world');
97+
}
98+
99+
return {
100+
foo: foo
101+
};
102+
});
103+
```
104+
105+
106+
### Node.js 환경에서의 CommonJS
107+
108+
- Node.js 환경에서는 CommonJS가 기본 형식으로 사용됨
109+
- Node.js 버전 13.2.0 이후의 안정적인 버전에서는 ES 모듈도 지원
110+
- 최근에는 ES 모듈 형식이 재사용 가능한 JS 코드를 모듈화하는 표준으로 자리잡음
111+
112+
113+
#### Node.js가 CommonJS를 모듈로 인식하는 경우
114+
115+
- .cjs 확장자
116+
- package.json 파일에 "type": "commonjs" 속성이 있거나 type 항목이 없을 때 .js 확장자
117+
- .mjs, .cjs, .json, .node, .js 이외의 확장자를 가진 파일
118+
119+
120+
#### 메서드에 따라 다른 모듈 로더
121+
122+
- require : 항상 CommonJS 모듈 로더 사용
123+
- import : ECMAScript 모듈 로더 사용
124+
125+
126+
#### CJS / ESM 호환성
127+
128+
- 많은 Node.js 라이브러리와 모듈은 CommonJS 형식으로 작성되어 있음
129+
- 브라우저 호환을 위해 모든 주요 브라우저에서는 ESM 문법 지원
130+
- Babel 등의 트랜스파일러를 사용해 구버전 Node.js에서도 작동하는 require() 함수로 변환 가능
131+
- **정리 : ES6 모듈 문법으로 작성된 라이브러리를 Node.js에서 실행하는 경우 내부적으로 CommonJS로 트랜스파일링됨**
132+
133+
134+
### AMD vs CommonJS
135+
136+
> AMD, CommonJS는 서로 다른 목표를 가진 유효한 모듈 형식
137+
138+
#### AMD
139+
140+
- 브라우저 우선 접근 방식 채택
141+
- 비동기 동작과 간소화된 하위 호환성을 선택
142+
- 파일 I/O에 대한 개념 없음
143+
- 객체, 함수, 생성자, 문자열, JSON 등 다양한 형태의 모듈 지원
144+
- 브라우저에서 자체적으로 실행된다는 점에서 유연한 포맷
145+
146+
#### CommonJS
147+
148+
- 서버 우선 접근 방식
149+
- 동기적 작동, 전역 변수와의 독립성, 미래의 서버 환경 고려
150+
- CommonJS가 언래핑된 모듈을 지원하기 때문에 ES2015+ 표준에 조금 더 가깝게 느껴짐
151+
152+
153+
### 나의 생각
154+
155+
AMD 파트에서는 진짜 막막했는데, CommonJS부터는 눈이 조금씩 트이는 기분이었어요. 나중에 ESM, 혹은 더 진보된 무언가가 나온 미래에는 CommonJS도 "뭐야 저게?"하는 날이 올까 싶네요ㅋㅋㅋ Node.js 기반 라이브러리나 옛날 코드를 볼 때 require 방식의 cjs를 많이 보게 되는데, CommonJS에 대해 조금 알고 넘어간다는 것에 의미를 두고 싶어요.
156+
157+
158+
## 마치며
159+
160+
> 이런 모듈 형식들은 단순히 모듈 패턴만 사용하는 것보다 장점이 있다.
161+
162+
- 전역 변수 관리의 필요성 감소
163+
- 정적/동적 의존성 관리에 대한 향상된 지원
164+
- 스크립트 로더와의 높은 호환성
165+
- 서버 환경에서의 모듈 호환성 강화
166+
167+
File renamed without changes.

0 commit comments

Comments
 (0)