import может быть использован только в модуле. А почему?

340
05 февраля 2018, 06:35

К странице подключены 2 скрипта:

<script src="script.js"></script>
<script src="DOMOperations.js" type="module"></script>

DOMOperations является модулем, предоставляющим какие-то обертки над DOM операциями:

// DOMOperations.js
export function printToBody(str) {
    let textNode = document.createTextNode(str);
    document.body.appendChild(textNode);
}

script является главным скриптом, который импортирует некоторый функционал, предоставляемый модулем:

// script.js
import {printToBody} from "./DOMOperations.js";
printToBody("Hello!");

Но при таком подключении скриптов ничего не работает, потому что, как говорит FireFox, import выражения могут быть только в верхнем уровне модуля:

SyntaxError: import declarations may only appear at top level of a module

ОК, укажем, что главный скрипт - это модуль:

<script src="script.js" type="module"></script>
<script src="DOMOperations.js"></script>

Но теперь, даже несмотря на то, что все, вроде бы, работает, в консоли все равно есть ошибка, правда уже другая:

SyntaxError: export declarations may only appear at top level of a module

То есть еще и export выражения могут быть только в верхнем уровне модуля. Выходит, надо оба файла подключить как модули?

<script src="script.js" type="module"></script>
<script src="DOMOperations.js" type="module"></script>

Так тоже все работает, и ошибок никаких нет. Но возникает вполне закономерный вопрос: а где логика?

Почему import выражения могут появляться только в модуле? Ведь куда более вероятно, что я захочу импортировать какой-то функционал, предоставляемый модулем, то есть из модуля, а не наоборот.

Я бы подумал, что так происходит из за того, что реализация модулей находится еще в ранней стадии (более того, доступна только при определенных настройках браузера), но даже те немногие примеры, что мне удалось найти в интернете, тоже используют такой подход:

<script type="module">
  import {addTextToBody} from './utils.js'; // импорты в модуле!
  addTextToBody('Modules are pretty cool.');
</script>

Прошу объяснить, почему это реализовано именно так.

READ ALSO
Angular.js ng-show не обновляется в модальном окне

Angular.js ng-show не обновляется в модальном окне

У при нажатии на кнопку появляться модальное окно

242
Modx не позволяет создавать php файлы

Modx не позволяет создавать php файлы

Привет! Пытаюсь как администратор создать php файл в админкеПри попытке сохранить новый файл вижу "Расширение php не допускается"

172
Работа с двумя таблицами php mysql

Работа с двумя таблицами php mysql

Всем привет! нуждаюсь в помощи и совете) вообщем есть две таблицы, продажа и складВ обоих таблицах есть столбец koll (количество) нужно каким...

260