Skip to content

Commit 0421521

Browse files
authored
[오혜성] 챕터 10, 11 (#93)
* 챕터 10 * 챕터 11
1 parent 00d92b0 commit 0421521

2 files changed

Lines changed: 178 additions & 0 deletions

File tree

챕터_10/오혜성.md

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# 모듈형 자바스크립트 디자인 패턴
2+
3+
## AMD
4+
5+
- CommonJS의 모듈 형식에 대한 사양 초안으로 시작됐지만, 합의점을 이루지 못해 amdjs 그룹으로 넘어감
6+
7+
- 모듈과 의존성 모두를 비동기적으로 로드할 수 있도록 설계된 모듈 정의 방식
8+
9+
## CJS
10+
11+
- 2009년 ServerJS 프로젝트에서 만들어진 형식, 이후 CommonJS 그룹에 의해 공식화됨
12+
13+
## VS
14+
15+
- AMD
16+
- 브라우저 우선 접근 방식을 채택하여 비동기 동작과 간소화된 하위 호환성을 선택
17+
- 반면 파일 IO에 대한 개념이 없음
18+
- 객체, 함수, 생성자, 문자열, JSON 등 다양한 형태의 모듈을 지원
19+
20+
- CJS
21+
- 서버 우선 접근 방식을 취함
22+
- 동기적으로 작동
23+
- 전역 변수와의 독립성
24+
- 언래핑된 모듈을 지원하기 때문에 ES 표준에 조금 더 가깝게 느껴짐
25+
26+
> 여기서 말하는 언래핑된 모듈?
27+
28+
```js
29+
// wrapped-module.js
30+
define(['dependency1', 'dependency2'], function(dep1, dep2) {
31+
var privateVar = "비공개 변수";
32+
33+
return {
34+
publicMethod: function() {
35+
return "공개 메서드";
36+
}
37+
};
38+
});
39+
40+
// unwrapped-module.js
41+
var dep1 = require('dependency1');
42+
var dep2 = require('dependency2');
43+
44+
var privateVar = "비공개 변수";
45+
46+
exports.publicMethod = function() {
47+
return "공개 메서드";
48+
};
49+
50+
// 문법적 차이
51+
// 래핑된 모듈: define() 함수로 전체 모듈을 감싸야 함
52+
// 언래핑된 모듈: 일반 JavaScript처럼 직접 코드를 작성
53+
54+
// 의존성 관리
55+
// 래핑된 모듈: 의존성을 배열로 한번에 선언
56+
// 언래핑된 모듈: 필요한 곳에서 직접 require()로 호출
57+
```
58+
59+
## UMD
60+
61+
- 브라우저와 서버 환경에서 모두 작동할 수 있는 모듈을 위해 개발
62+
63+
- UMD는 AMD나 CommonJS를 대체하기 위한 것이 아니라, 오늘날 다양한 환경에서 동작할 수 있도록 돕는 보조 도구
64+
65+
## 내 생각
66+
67+
Node.js 환경도 13.2.0 이후부터 ES 모듈을 정상적으로 사용할 수 있으니 앵간해서는 ES 모듈을 사용하는게 좋지 않을까 생각됨
68+
69+
- CJS 트리쉐이킹 안되는 것은 다른 분이 설명해주실 것으로 예상

챕터_11/오혜성.md

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
# 네임스페이스 패턴
2+
3+
- 네임스페이스는 코드 단위를 고유한 식별자로 그룹화한 것을 뜻함
4+
5+
## 단일 전역 변수 패턴
6+
7+
```js
8+
const myUniqueNamespace = {};
9+
```
10+
11+
## 접두사 네임스페이스 패턴
12+
13+
```js
14+
const foo_property = {};
15+
```
16+
17+
## 객체 리터럴 표기법 패턴
18+
19+
```js
20+
const myUnique = {
21+
getInfo: () => {}
22+
models: {};
23+
}
24+
```
25+
26+
## 중첩 네임스페이스 패턴
27+
28+
```js
29+
foo.util.DOM.getElementById('bar');
30+
```
31+
32+
## 즉시 실행 함수 표현식 패턴
33+
34+
```js
35+
const namespace = {};
36+
37+
((n) => {
38+
n.foo = 'foo';
39+
})(namespace)
40+
```
41+
42+
## 네임스페이스 주입 패턴
43+
44+
```js
45+
const namespace = {};
46+
47+
(() => {
48+
this.foo = 'foo';
49+
}).apply(namespace);
50+
```
51+
52+
- 객체/클로저 내에서 명시적으로 선언할 때 직접 접근이 불가능한 상황에서만 사용하는 것을 추천
53+
54+
## 고-급 네임스페이스 패턴
55+
56+
57+
### 중첩 네임스페이스 자동화 패턴
58+
59+
```js
60+
const namespace = {};
61+
const mod = extend(namespace, "module1.module2.module3");
62+
63+
console.log(mod === namespace.module1.module2.module3); // true
64+
```
65+
66+
### 의존성 선언 패턴
67+
68+
```js
69+
const namespace = {
70+
// 대충 여기에 중첩된 거 많음
71+
};
72+
73+
const util = namespace.DOM.util;
74+
util.getById('bar');
75+
```
76+
77+
- 로컬 변수를 사용하는 것이 전역 변수에 매번 접근해 사용하는 것보다 빠름
78+
> 이전 챕터에서 공유한 것처럼 체이닝을 덜하는 이점도 있을 것이라 생각
79+
80+
81+
## 내 생각
82+
83+
- ES 모듈을 이용하는 현대적인 환경에서 전역 네임스페이스를 고려하는 환경이 있을까 싶음
84+
- 너무 내가 어플리케이션 레이어 개발자인가 ;;
85+
86+
- 코드 스니펫 정도에서 배워가는 건 있었다고 생각 (살짝)
87+
88+
- 의존성 선언 패턴(이게 이름이 적절한지는 모르겠는데)이 좋은 건 알겠으나, 가독성 측면에서 좋지 않다고 느낀 경험
89+
90+
```tsx
91+
const UserCard = () => {
92+
const { data: {
93+
foo: {
94+
name
95+
}
96+
} } = useSuspenseQuery(대충getUserQuery);
97+
98+
return <div>{name}</div>
99+
}
100+
101+
// 간단한 형태라면 이렇게 사용해도 좋겠으나
102+
103+
const ComplexUserCard = () => {
104+
const { data: user } = useSuspenseQuery(대충getUserQuery);
105+
106+
// 복잡한 형태라면 해당 줄만 읽어도 출처를 알 수 있는 형태가 좋았던 경험이 있음
107+
return <div>{user.foo.name}</div>
108+
}
109+
```

0 commit comments

Comments
 (0)