#javascript #es6-modules
Вопрос:
Если у меня есть следующее:
<script type="module" src="one.js"></script>
<script type="module" src="two.js"></script>
<script type="module" src="three.js"></script>
- Прав ли я, говоря, что вы не можете быть на 100% уверены, что
three.js
это будет выполнено ПОСЛЕone.js
иtwo.js
?
Однако, если у меня есть:
<script type="module">
import 'one.js'
import 'two.js'
import 'three.js'
</script>
- Прав ли я, говоря, что могу быть уверен, что
three.js
это будет выполнено ПОСЛЕone.js
иtwo.js
? (это важно)
Комментарий о возможных дубликатах
Я знаю, что это выглядит как дублирующий вопрос, но, пожалуйста, имейте в виду, что цель этого вопроса-подтвердить совершенно другое поведение импорта с помощью HTML и JavaScript
Комментарии:
1. Если вы хотите убедиться , что
three
это выполняется послеone
иtwo
, импортируйте эти два вthree
себя (и избегайте циклических зависимостей). Не полагайтесь на порядок импорта в вашем основном модуле.2. IIRC, верхний уровень
await
нарушил предположение о том, что модули выполняются в порядке импорта.3. в ответе 0x6368656174 есть смысл-и ссылка на документацию…!
Ответ №1:
Прав ли я, говоря, что вы не можете быть на 100% уверены в том, что three.js будет выполнено ПОСЛЕ one.js и two.js?
Да, потому что, например three.js возможно, они уже были ввезены в one.js, и модули оцениваются только один раз.
Прав ли я, говоря, что могу быть уверен в том, что three.js будет выполнено ПОСЛЕ one.js и two.js? (это важно)
Нет, по той же причине, что и выше.
При обоих способах импорта модуля, если ни один из модулей не был импортирован ранее, они будут оцениваться в том же порядке, в каком они отображаются в разметке или коде.
В спецификации ECMAScript см. Метод оценки модуля, который выполняет итерацию по запрошенным модулям записи модуля исходного текста:
Список всех строк-спецификаторов модулей, используемых модулем, представленным этой записью, для запроса импорта модуля. Список является упорядоченным вхождением исходного кода.
При импорте модуля с использованием тега сценария с атрибутом src, если порядок оценки не важен, атрибут async можно использовать для его выполнения сразу после загрузки.
Ответ №2:
Нет, это не гарантирует, что он будет работать в том же порядке. Это зависит от всех других файлов и импорта.
Модули Es6 оцениваются только один раз. Это означает, что инструкция import не означает оценку. Когда выполняется первый хост-модуль (модуль, который импортирует Òne.js
или Two.js
), затем оцениваются импортированные модули. И тот же экземпляр будет предоставлен для дальнейшего импорта.
Скажем A.js
, импортирует Two.js
и сначала выполняется, а B.js
затем запускается и B.js
импортирует оба One.js
и Two.js
(предполагая, что только эти два файла импортируют эти модули). затем со временем B.js
выполняется Two.js
уже оцененная, но One.js
должна быть оценена сейчас.
https://262.ecma-international.org/6.0/#sec-hostresolveimportedmodule
Комментарии:
1. Вы отвечаете (1) или (2)?
2. Я думаю, вы путаете тот факт, что модули оцениваются только один раз, с вопросом о том, соблюдается ли порядок. Документация, по-видимому, подтверждает, что заказ сохранен (см. Ответ 0x6368656174).
3. Я ответил на вторую часть. Это гораздо сложнее, чем вы думаете. Как я уже сказал в своем ответе, порядок сохраняется только в том случае, если во всем вашем приложении есть один модуль, который импортирует one.js и two.js. в большинстве случаев существует более одного модуля, который импортирует модули. В этом случае порядок не гарантируется.
Ответ №3:
В общем случае, если все модули не имеют взаимного импорта, в обоих случаях модули выполняются в одних и тех же заказах.
В первом случае тип module
работает как defer
скрипт. Код выполняется в правильном порядке после загрузки DOM. Об этом говорится в документации defer
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#attr-defer (желтая клетка и следующий абзац).
Во втором случае импорт, как вы и ожидали, выполняется в порядке, определенном в файле.
Комментарии:
1. У вас есть источник для этого?
2. «В первом случае сценарии будут выполняться в том же порядке». Если это так, то не ГАРАНТИРУЕТСЯ, что оно будет выполнено в том же порядке. Я могу ошибаться-у вас есть источник для этого?
3. @Merc Да, это сказано в документации developer.mozilla.org/en-US/docs/Web/HTML/Element/… Прочитайте желтую рамку и следующий абзац.