?uem/p1-90`super를 포함하는 소스 텍스트가 super이면 Syntax Error입니다. super에 대한 추가 Script Record는 평가 중인 스크립트에 관한 정보를 캡슐화합니다. 각
| 필드 이름 | 값 타입 | 의미 |
|---|---|---|
| [[Realm]] |
a |
이 스크립트가 생성된 |
| [[ECMAScriptCode]] |
a |
이 스크립트의 소스 텍스트를 파싱한 결과입니다. |
| [[LoadedModules]] |
a |
이 스크립트가 가져온 지정자 문자열에서 해석된 |
| [[HostDefined]] |
anything (default value is |
스크립트에 추가 정보를 연결해야 하는 |
구현체는 해당 스크립트 소스 텍스트에 ParseScript를 평가하기 전에 스크립트 소스 텍스트를 파싱하고
스크립트를 평가하기 위한
호출되면 다음 단계를 수행합니다:
var 및 function 바인딩(비엄격 명시적인 var 또는 함수 선언과 달리
super이면 Syntax Error입니다.
중복 export default
ModuleRequest Record는 주어진 import 속성을 사용하여 모듈을 가져오라는 요청을 나타냅니다. 다음 필드로 구성됩니다:
| 필드 이름 | 값 타입 | 의미 |
|---|---|---|
| [[Specifier]] | a String | 모듈 지정자 |
| [[Attributes]] |
a |
import 속성 |
LoadedModuleRequest Record는 결과
| 필드 이름 | 값 타입 | 의미 |
|---|---|---|
| [[Specifier]] | a String | 모듈 지정자 |
| [[Attributes]] |
a |
import 속성 |
| [[Module]] |
a |
이 모듈 요청에 대응하여 로드된 모듈 |
ImportAttribute Record는 다음 필드로 구성됩니다:
| 필드 이름 | 값 타입 | 의미 |
|---|---|---|
| [[Key]] | a String | 속성 키 |
| [[Value]] | a String | 속성 값 |
Module Record는 하나의 모듈이 가져오고 내보내는 항목에 관한 구조적 정보를 캡슐화합니다. 이 정보는 서로 연결된 모듈 집합의 import와 export를 연결하는 데 사용됩니다. Module Record에는 모듈을 평가할 때만 사용하는 네 개의 필드가 포함됩니다.
명세를 위한 목적으로 Module Record는
Module Record는
| 필드 이름 | 값 타입 | 의미 |
|---|---|---|
| [[Realm]] |
a |
이 모듈이 생성된 |
| [[Environment]] |
a |
이 모듈의 최상위 바인딩을 포함하는 |
| [[Namespace]] |
an Object or |
이 모듈에 대해 생성된 경우 Module Namespace Object( |
| [[HostDefined]] |
anything (default value is |
모듈에 추가 정보를 연결해야 하는 |
| 메서드 | 목적 | 정의 |
|---|---|---|
| LoadRequestedModules ( [ hostDefined ] ) | 추상 메서드 LoadRequestedModules. 선택적 인수 hostDefined (임의의 값). 반환값: Promise. 모든 종속성을 재귀적으로 로드하여 모듈을 연결할 준비를 합니다. |
이 명세에서는 다음 타입에 정의가 있으며, |
| GetExportedNames ( [ exportStarSet ] ) | 추상 메서드 GetExportedNames. 선택적 인수 exportStarSet ( 이 모듈에서 직접 또는 간접으로 내보내는 모든 이름의 목록을 반환합니다. 이 메서드를 호출하기 전에 |
이 명세에서는 다음 타입에 정의가 있으며, |
| ResolveExport ( exportName [ , resolveSet ] ) | 추상 메서드 ResolveExport. 인수 exportName (String) 및 선택적 인수 resolveSet ( 이 모듈에서 내보낸 이름의 바인딩을 반환합니다. 바인딩은 { [[Module]]: 이 연산을 특정 exportName, resolveSet 쌍을 인수로 사용하여 호출할 때마다 동일한 결과를 반환해야 합니다. 이 메서드를 호출하기 전에 |
이 명세에서는 다음 타입에 정의가 있으며, |
| Link ( ) | 추상 메서드 Link. 인수 없음. 반환값: ( 모든 모듈 종속성을 전이적으로 해석하고 이 메서드를 호출하기 전에 |
이 명세에서는 다음 타입에 정의가 있으며, |
| Evaluate ( ) | 추상 메서드 Evaluate. 인수 없음. 반환값: Promise. 이 모듈과 그 종속성의 평가에 대한 promise를 반환합니다. 평가가 성공하거나 이미 성공적으로 평가된 경우 resolve되고, 평가 오류가 발생하거나 이미 평가에 실패한 경우 reject됩니다. promise가 reject되면 이 메서드를 호출하기 전에 |
이 명세에서는 다음 타입에 정의가 있으며, |
Cyclic Module Record는
| 필드 이름 | 값 타입 | 의미 |
|---|---|---|
| [[Status]] |
|
처음에는 |
| [[EvaluationError]] |
a throw completion or |
평가 중 발생한 예외를 나타내는 |
| [[DFSAncestorIndex]] |
an integer or |
|
| [[RequestedModules]] |
a |
이 모듈의 import와 연결된 |
| [[LoadedModules]] |
a |
이 |
| [[CycleRoot]] |
a |
순환에서 처음 방문한 모듈, 즉 강연결 요소의 루트 DFS 조상입니다. 순환에 속하지 않는 모듈에서는 모듈 자신입니다. |
| [[HasTLA]] | a Boolean |
이 모듈 자체가 비동기인지 여부입니다(예: 최상위 await를 포함하는 |
| [[AsyncEvaluationOrder]] |
|
이 필드는 처음에 |
| [[TopLevelCapability]] |
a |
이 모듈이 어떤 순환의 [[CycleRoot]]이고 해당 순환의 어떤 모듈에 대해 |
| [[AsyncParentModules]] |
a |
이 모듈 또는 종속성의 [[HasTLA]]가 |
| [[PendingAsyncDependencies]] |
an integer or |
이 모듈에 비동기 종속성이 있으면 이 모듈을 위해 아직 실행해야 하는 비동기 종속 모듈의 수를 추적합니다. 비동기 종속성이 있는 모듈은 이 필드가 0에 도달하고 실행 오류가 없을 때 실행됩니다. |
| 메서드 | 목적 | 정의 |
|---|---|---|
| InitializeEnvironment ( ) | 추상 메서드 InitializeEnvironment. 인수 없음. 반환값: ( |
이 명세에서는 다음 타입에 정의가 있으며, |
| ExecuteModule ( [ capability ] ) | 추상 메서드 ExecuteModule. 선택적 인수 capability ( |
이 명세에서는 다음 타입에 정의가 있으며, |
GraphLoadingState Record는 모듈 그래프의 로딩 과정에 관한 정보를 포함하는
| 필드 이름 | 값 타입 | 의미 |
|---|---|---|
| [[PromiseCapability]] |
a |
로딩 과정이 끝날 때 resolve할 promise입니다. |
| [[IsLoading]] | a Boolean | 로딩 과정이 성공이나 오류 어느 쪽으로도 아직 완료되지 않았으면 true입니다. |
| [[PendingModulesCount]] | a non-negative integer |
대기 중인 |
| [[Visited]] |
a |
순환 종속성에 의한 무한 루프를 피하기 위해 현재 로딩 과정에서 이미 로드된 |
| [[HostDefined]] |
anything (default value is |
|
다음은
a
<link rel="preload" as="..."> 태그에 올바른 fetch destination을 설정합니다.
import() 표현식은 hostDefined 매개변수를 절대로 설정하지 않습니다.
a
a
모듈은 InnerModuleEvaluation이 순회하는 동안
비동기 순환이
루트 module의 비동기 실행이 이행되면 이 함수는 해당 완료에서 함께 동기적으로 실행할 수 있는 모듈 목록을 결정하여 execList에 채웁니다.
이 비규범적 절에서는 오류가 어떻게 발생할 수 있는지에 특히 초점을 맞추어 몇 가지 일반적인 모듈 그래프의 연결 및 평가 예를 제시합니다.
먼저 다음의 단순한 모듈 그래프를 살펴보겠습니다:
먼저 오류 조건이 없다고 가정하겠습니다.
그다음 A.
마지막으로
이제 다른 종류의 오류 조건을 살펴보겠습니다:
이 시나리오에서는 모듈 A가 다른 어떤 모듈에 대한 종속성을 선언하지만 해당 모듈에 대한
여기서 로딩, 연결 및 평가 오류가 서로 다른 이유는 다음 특성 때문입니다:
이제 순환이 있는 모듈 그래프를 살펴보겠습니다:
여기서는 진입점이 모듈 A라고 가정하므로
그다음
성공하는 경우 순환 모듈 그래프의 평가 단계에서도 이와 유사한 과정이 발생합니다.
이제 A에 연결 오류가 있는 경우를 생각해 보겠습니다. 예를 들어 A가 C에 존재하지 않는 바인딩을 가져오려고 할 수 있습니다. 이 경우 A에 대한 두 번째
또는 A에 평가 오류가 있는 경우를 생각해 보겠습니다. 예를 들어 소스 코드가 예외를 던질 수 있습니다. 이 경우 A에 대한 두 번째 await를 포함하거나 이에 의존하는 모듈의 체인을 형성합니다. 따라서 A와 B는 모두
마지막으로 모든 모듈이 비동기적으로 완료되는 순환 모듈 그래프를 살펴보겠습니다:
로딩과 연결은 이전과 동일하게 진행되며 모든 모듈은 [[Status]]가
A.
|
필드
|
A | B | C | D | E |
|---|---|---|---|---|---|
| [[DFSAncestorIndex]] | 0 | 0 | 0 | 0 | 4 |
| [[Status]] | |||||
| [[AsyncEvaluationOrder]] | 4 | 1 | 3 | 0 | 2 |
| [[AsyncParentModules]] | « » | « A » | « A » | « B, C » | « C » |
| [[PendingAsyncDependencies]] | 2 (B and C) | 1 (D) | 2 (D and E) | 0 | 0 |
E가 먼저 실행을 끝낸다고 가정하겠습니다. 이때
|
필드
|
C | E |
|---|---|---|
| [[DFSAncestorIndex]] | 0 | 4 |
| [[Status]] | ||
| [[AsyncEvaluationOrder]] | 3 | |
| [[AsyncParentModules]] | « A » | « C » |
| [[PendingAsyncDependencies]] | 1 (D) | 0 |
다음으로 D가 실행을 끝냅니다(여전히 실행 중인 유일한 모듈이었습니다). 이때 await가 포함되어 있다면 B와 병렬로 실행될 수 있습니다). 갱신된 모듈 필드는
|
필드
|
B | C | D |
|---|---|---|---|
| [[DFSAncestorIndex]] | 0 | 0 | 0 |
| [[Status]] | |||
| [[AsyncEvaluationOrder]] | 1 | 3 | |
| [[AsyncParentModules]] | « A » | « A » | « B, C » |
| [[PendingAsyncDependencies]] | 0 | 0 | 0 |
다음으로 C가 실행을 끝낸다고 가정하겠습니다. 이때
|
필드
|
A | C |
|---|---|---|
| [[DFSAncestorIndex]] | 0 | 0 |
| [[Status]] | ||
| [[AsyncEvaluationOrder]] | 4 | |
| [[AsyncParentModules]] | « » | « A » |
| [[PendingAsyncDependencies]] | 1 (B) | 0 |
그다음 B가 실행을 끝냅니다. 이때
|
필드
|
A | B |
|---|---|---|
| [[DFSAncestorIndex]] | 0 | 0 |
| [[Status]] | ||
| [[AsyncEvaluationOrder]] | 4 | |
| [[AsyncParentModules]] | « » | « A » |
| [[PendingAsyncDependencies]] | 0 | 0 |
마지막으로 A가 실행을 끝냅니다. 이때
|
필드
|
A |
|---|---|
| [[DFSAncestorIndex]] | 0 |
| [[Status]] | |
| [[AsyncEvaluationOrder]] | |
| [[AsyncParentModules]] | « » |
| [[PendingAsyncDependencies]] | 0 |
또는 B가 실행을 끝내기 전에 C의 실행이 실패하여 오류를 반환하는 실패 사례를 생각해 보겠습니다. 이때
|
필드
|
A | C |
|---|---|---|
| [[DFSAncestorIndex]] | 0 | 0 |
| [[Status]] | ||
| [[AsyncEvaluationOrder]] | ||
| [[AsyncParentModules]] | « » | « A » |
| [[PendingAsyncDependencies]] | 1 (B) | 0 |
| [[EvaluationError]] | C's evaluation error |
C가 C의 오류를 사용하여 A에
|
필드
|
A |
|---|---|
| [[DFSAncestorIndex]] | 0 |
| [[Status]] | |
| [[AsyncEvaluationOrder]] | |
| [[AsyncParentModules]] | « » |
| [[PendingAsyncDependencies]] | 0 |
| [[EvaluationError]] | C's |
그다음 B가 오류 없이 실행을 끝냅니다. 이때
|
필드
|
A | B |
|---|---|---|
| [[DFSAncestorIndex]] | 0 | 0 |
| [[Status]] | ||
| [[AsyncEvaluationOrder]] | 4 | 1 |
| [[AsyncParentModules]] | « » | « A » |
| [[PendingAsyncDependencies]] | 0 | 0 |
| [[EvaluationError]] | C's |
Source Text Module Record는
| 필드 이름 | 값 타입 | 의미 |
|---|---|---|
| [[ECMAScriptCode]] | a Parse Node |
|
| [[Context]] |
an |
이 모듈과 연결된 |
| [[ImportMeta]] |
an Object or |
import.meta 메타 프로퍼티를 통해 노출되는 객체입니다. ECMAScript 코드가 접근할 때까지 |
| [[ImportEntries]] |
a |
이 모듈의 코드에서 파생된 |
| [[LocalExportEntries]] |
a |
이 모듈 안에서 발생하는 선언에 대응하는, 이 모듈의 코드에서 파생된 |
| [[IndirectExportEntries]] |
a |
이 모듈 안에서 다시 내보내는 import 또는 export * as namespace 선언의 export에 대응하는, 이 모듈의 코드에서 파생된 |
| [[StarExportEntries]] |
a |
이 모듈 안의 export * 선언에 대응하는, 이 모듈의 코드에서 파생된 export * as namespace 선언은 포함하지 않습니다.
|
ImportEntry Record는 하나의 선언적 import에 관한 정보를 요약하는
| 필드 이름 | 값 타입 | 의미 |
|---|---|---|
| [[ModuleRequest]] |
a |
|
| [[ImportName]] |
a String or |
[[ModuleRequest]]가 식별하는 모듈에서 원하는 바인딩이 내보내지는 이름입니다. 값 |
| [[LocalName]] | a String | 가져오는 모듈 안에서 가져온 값에 로컬로 접근하는 데 사용하는 이름입니다. |
| Import 문 형식 | [[ModuleRequest]] | [[ImportName]] | [[LocalName]] |
|---|---|---|---|
import v from "mod";
|
|
|
|
import * as ns from "mod";
|
|
|
|
import {x} from "mod";
|
|
|
|
import {x as v} from "mod";
|
|
|
|
import "mod";
|
|
||
ExportEntry Record는 하나의 선언적 export에 관한 정보를 요약하는
| 필드 이름 | 값 타입 | 의미 |
|---|---|---|
| [[ExportName]] |
a String or |
이 모듈이 이 바인딩을 내보내는 데 사용하는 이름입니다. |
| [[ModuleRequest]] |
a |
|
| [[ImportName]] |
a String, |
[[ModuleRequest]]가 식별하는 모듈에서 원하는 바인딩이 내보내지는 이름입니다. export * as ns from "mod" 선언에 사용됩니다. export * from "mod" 선언에 사용됩니다.
|
| [[LocalName]] |
a String or |
모듈 안에서 내보낸 값에 로컬로 접근하는 데 사용하는 이름입니다. 모듈 안에서 내보낸 값에 로컬로 접근할 수 없으면 |
| Export 문 형식 | [[ExportName]] | [[ModuleRequest]] | [[ImportName]] | [[LocalName]] |
|---|---|---|---|---|
export var v;
|
|
|
|
|
export default function f() {}
|
|
|
|
|
export default function () {}
|
|
|
|
|
export default 42;
|
|
|
|
|
export {x};
|
|
|
|
|
export {v as x};
|
|
|
|
|
export {x} from "mod";
|
|
|
|
|
export {v as x} from "mod";
|
|
|
|
|
export * from "mod";
|
|
|
|
|
export * as ns from "mod";
|
|
|
|
|
다음 정의는
export * from을 통해 동일한 이름으로 같은 바인딩 또는 네임스페이스를 두 번 내보내 발생하는 충돌을 await로 둡니다.구현체는 해당 모듈 소스 텍스트에 ParseModule을 평가하기 전에 모듈 소스 텍스트를 파싱하고
다음은
a
a
정의 모듈을 찾으면
호출되면 다음 단계를 수행한다.
* export가 둘 이상 있습니다.다음은
a
a
Synthetic Module Record는 명세에 의해 정의된 모듈에 관한 정보를 나타내는 데 사용됩니다. 내보낸 이름은 생성 시 정적으로 정의되지만 대응 값은
| 필드 이름 | 값 타입 | 의미 |
|---|---|---|
| [[ExportNames]] | a |
모듈의 export 이름입니다. 이 목록에는 중복 항목이 없습니다. |
| [[EvaluationSteps]] | an |
모듈 평가 시 수행할 초기화 로직이며 |
다음은
a
a
a
a
a
호스트 정의 추상 연산 HostLoadImportedModule. 인수 referrer ((
referrer가
<button type="button" onclick="import('./foo.mjs')">Click me</button>
import()
HostLoadImportedModule 구현은 다음 요구 사항을 준수해야 합니다:
이 연산이 다음 조건을 만족하는 두 (referrer, moduleRequest) 쌍으로 여러 번 호출되는 경우:
result가
moduleRequest.[[Attributes]]에 entry.[[Key]]가
실제로 수행되는 과정은
호스트 정의 추상 연산 HostGetSupportedImportAttributes. 인수 없음. 반환값:
HostGetSupportedImportAttributes 구현은 다음 요구 사항을 준수해야 합니다:
HostGetSupportedImportAttributes의 기본 구현은 새로운 빈
GetModuleNamespace는 절대로 예외를 던지지 않습니다. 대신 해석할 수 없는 이름은 이 시점에서 네임스페이스에서 단순히 제외됩니다. 이러한 이름이 어디에서도 명시적으로 요청되지 않은 모호한 star export가 전부인 경우를 제외하면 나중에 실제 연결 오류를 일으킵니다.
위 규칙은
ExportedBindings는
다음 생성 규칙별로 정의된다.
ExportedNames는
다음 생성 규칙별로 정의된다.