You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
```warn header="모듈은 로컬 파일에서 동작하지 않고, HTTP 또는 HTTPS 프로토콜을 통해서만 동작합니다."
61
-
로컬에서 `file://` 프로토콜을 통해 웹페이지를 열면 `import·export` 지시자가 동작하지 않습니다. 예제를 실행하려면 로컬 웹 서버인 [static-server](https://www.npmjs.com/package/static-server#getting-started)나, 코드 에디터의 '라이브 서버' 익스텐션(Visual Studio Code 에디터의 경우 [Live Server Extension](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer))을 사용하세요.
61
+
로컬에서 `file://` 프로토콜을 사용해 웹페이지를 열면 `import`, `export` 지시자가 동작하지 않습니다. 예시를 실행하려면 로컬 웹 서버인 [static-server](https://www.npmjs.com/package/static-server#getting-started)나, 코드 에디터의 '라이브 서버' 익스텐션(Visual Studio Code 에디터의 경우 [Live Server Extension](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer))을 사용하세요.
62
62
```
63
63
64
64
## 모듈의 핵심 기능
@@ -67,7 +67,7 @@ sayHi('John'); // Hello, John!
67
67
68
68
모든 호스트 환경에 공통으로 적용되는 모듈의 핵심 기능에 대해 알아봅시다.
69
69
70
-
### '엄격 모드'로 실행됨
70
+
### 엄격 모드로 실행됨
71
71
72
72
모듈은 항상 `엄격 모드(use strict)`로 실행됩니다. 선언되지 않은 변수에 값을 할당하는 등의 코드는 에러를 발생시킵니다.
모듈 스크립트는 지연 실행되기 때문에 문서 전체가 처리되기 전까지 실행되지 않고, 일반 스크립트는 바로 실행되므로 위와 같은 결과가 나타났습니다.
274
274
275
-
모듈을 사용할 땐 HTML 페이지가 완전히 나타난 이후에 모듈이 실행된다는 점에 항상 유의해야 합니다. 페이지 내 특정 기능이 모듈 스크립트에 의존적인 경우, 모듈이 완전히 로딩되기 전에 페이지만 먼저 사용자에게 노출되면 사용자가 혼란을 느낄 수 있기 때문입니다. 모듈 스크립트를 불러오는 동안엔 투명 오버레이나 '로딩 인디케이터(loading indicator)'를 보여주어 사용자의 혼란을 예방해 주도록 합시다.
275
+
모듈을 사용할 땐 HTML 페이지가 완전히 나타난 이후에 모듈이 실행된다는 점에 항상 유의해야 합니다. 페이지 내 특정 기능이 모듈 스크립트에 의존적인 경우, 모듈이 완전히 로딩되기 전에 페이지가 먼저 사용자에게 노출되면 사용자가 혼란을 느낄 수 있기 때문입니다. 모듈 스크립트를 불러오는 동안엔 투명 오버레이나 '로딩 인디케이터(loading indicator)'를 보여주어 사용자의 혼란을 예방해 주도록 합시다.
브라우저 환경에서 `import`는 반드시 상대 혹은 절대 URL 앞에 와야 합니다. 경로가 없는 모듈은 허용하지 않습니다.
321
+
브라우저 환경에서 `import`는 반드시 상대 혹은 절대 URL 앞에 와야 합니다. '경로가 없는' 모듈은 허용되지 않습니다.
322
322
323
323
아래 예제에서 `import`는 무효합니다.
324
324
```js
325
325
import {sayHi} from'sayHi'; // Error!
326
326
// './sayHi.js'와 같이 경로 정보를 지정해 주어야 합니다.
327
327
```
328
328
329
-
Node.js나 번들링 툴은 경로가 없어도 해당 모듈을 찾수 있는 방법을 알기 때문에 경로가 없는 모듈을 사용할 수 있습니다. 하지만 브라우저는 경로 없는 모듈을 지원하지 않습니다.
329
+
Node.js나 번들링 툴은 경로가 없어도 해당 모듈을 찾을 수 있는 방법을 알기 때문에 경로가 없는 모듈을 사용할 수 있습니다. 하지만 브라우저는 경로 없는 모듈을 지원하지 않습니다.
330
330
331
-
### 호환을 위한 'nomodule'
331
+
### 호환을 위한 nomodule
332
332
333
333
구식 브라우저는 `type="module"`을 해석하지 못하기 때문에 모듈 타입의 스크립트를 만나면 이를 무시하고 넘어갑니다. `nomodule` 속성을 사용하면 이런 상황을 대비할 수 있습니다.
334
334
@@ -339,7 +339,7 @@ Node.js나 번들링 툴은 경로가 없어도 해당 모듈을 찾수 있는
339
339
340
340
<script nomodule>
341
341
alert("type=module을 해석할 수 있는 브라우저는 nomodule 타입의 스크립트는 넘어갑니다. 따라서 이 alert 문은 실행되지 않습니다.")
342
-
alert("오래된 브라우저를 사용하고 있다면, type=module이 붙은 스크립트는 무시합니다. 대신 이 alert 문이 실행됩니다.");
342
+
alert("오래된 브라우저를 사용하고 있다면 type=module이 붙은 스크립트는 무시됩니다. 대신 이 alert 문이 실행됩니다.");
343
343
</script>
344
344
```
345
345
@@ -351,17 +351,17 @@ Node.js나 번들링 툴은 경로가 없어도 해당 모듈을 찾수 있는
351
351
352
352
빌드 툴의 역할은 아래와 같습니다.
353
353
354
-
1. HTML의 `<script type="module">`에 넣을 '주요' 모듈('진입점' 역할을 하는 모듈)을 선택합니다.
354
+
1. HTML의 `<script type="module">`에 넣을 '주요(main)' 모듈('진입점' 역할을 하는 모듈)을 선택합니다.
355
355
2. '주요' 모듈에 의존하고 있는 모듈 분석을 시작으로 모듈 간의 의존 관계를 파악합니다.
356
356
3. 모듈 전체를 한데 모아 하나의 큰 파일을 만듭니다(설정에 따라 여러 개의 파일을 만드는 것도 가능합니다). 이 과정에서 `import`문이 번들러 내 함수로 대체되므로 기존 기능은 그대로 유지됩니다.
357
357
4. 이런 과정 중에 변형이나 최적화도 함께 수행됩니다.
358
358
- 도달 가능하지 않은 코드는 삭제됩니다.
359
-
- 내보내진 모듈 중 쓰임처가 없는 모듈을 삭제합니다('가지치기(tree-shaking)').
360
-
- `console`, `debugger` 같은 개발 관련 코드가 삭제됩니다.
361
-
- 최신 자바스크립트 문법이 사용된 경우 [바벨(Babel)](https://babeljs.io/)을 사용하여 같은 기능을 하는 낮은 버전의 스크립트로 변환합니다.
359
+
- 내보내진 모듈 중 쓰임처가 없는 모듈을 삭제합니다(가지치기(tree-shaking)).
360
+
- `console`, `debugger` 같은 개발 관련 코드를 삭제합니다.
361
+
- 최신 자바스크립트 문법이 사용된 경우 [바벨(Babel)](https://babeljs.io/)을 사용해 동일한 기능을 하는 낮은 버전의 스크립트로 변환합니다.
362
362
- 공백 제거, 변수 이름 줄이기 등으로 산출물의 크기를 줄입니다.
363
363
364
-
번들링 툴을 사용하면 스크립트들은 하나 혹은 여러 개의 파일로 번들링 됩니다. 이때 번들링 전 스크립트에 있던 `import/export`문은 특별한 번들러 함수로 대체됩니다. 번들링 과정이 끝나면 기존 스크립트에서 `import/export`가 사라지기 때문에 `type="module"`이 필요 없어집니다. 따라서 아래와 같이 번들링 과정을 거친 스크립트는 일반 스크립트처럼 취급할 수 있습니다.
364
+
번들링 툴을 사용하면 스크립트들은 하나 혹은 여러 개의 파일로 번들링 됩니다. 이때 번들링 전 스크립트에 있던 `import`, `export`문은 특별한 번들러 함수로 대체됩니다. 번들링 과정이 끝나면 기존 스크립트에서 `import`, `export`가 사라지기 때문에 `type="module"`이 필요 없어집니다. 따라서 아래와 같이 번들링 과정을 거친 스크립트는 일반 스크립트처럼 취급할 수 있습니다.
365
365
366
366
```html
367
367
<!-- 웹팩과 같은 툴로 번들링 과정을 거친 스크립트인 bundle.js-->
@@ -374,12 +374,12 @@ Node.js나 번들링 툴은 경로가 없어도 해당 모듈을 찾수 있는
374
374
375
375
지금까지 배운 내용을 요약해봅시다.
376
376
377
-
1. 모듈은 하나의 파일입니다. 브라우저에서 `import/export` 지시자를 사용하려면 `<script type="module">`같은 속성이 필요합니다. 모듈은 아래와 같은 특징을 지닙니다.
377
+
1. 모듈은 하나의 파일입니다. 브라우저에서 `import` ,`export` 지시자를 사용하려면 `<script type="module">`같은 속성이 필요합니다. 모듈은 아래와 같은 특징을 지닙니다.
378
378
- 지연 실행됩니다.
379
379
- 인라인 모듈 스크립트도 비동기 처리 할 수 있습니다.
380
-
- 외부 오리진(도메인, 프로토콜, 포트)에서 스크립트를 불러오려면 CORS 헤더가 있어야 합니다.
380
+
- 외부 오리진(도메인이나 프로토콜, 포트가 다른 오리진)에서 스크립트를 불러오려면 CORS 헤더가 있어야 합니다.
381
381
- 중복된 외부 스크립트는 무시됩니다.
382
-
2. 모듈은 자신만의 스코프를 갖습니다. 모듈 간 기능 공유는 `import/export`로 할 수 있습니다.
382
+
2. 모듈은 자신만의 스코프를 갖습니다. 모듈 간 기능 공유는 `import`, `export`로 할 수 있습니다.
383
383
3. 항상 엄격 모드로 실행(`use strict`)됩니다.
384
384
4. 모듈 내 코드는 단 한 번만 실행됩니다. 모듈을 내보내면 이 모듈을 가져오기 하는 모듈 모두가 내보내진 모듈을 공유합니다.
0 commit comments