Я экспериментировал с новой поддержкой модуля ECMAScript, которая недавно была добавлена в браузеры. Приятно, наконец, возможность напрямую и чисто импортировать скрипты из JavaScript.
/example.html 🔍
<script type="module">
import {example} from '/example.js';
example();
</script>
/example.js
export function example() {
document.body.appendChild(document.createTextNode("hello"));
};
Однако, это только позволяет мне импортировать модули, которые определяются отдельными файлами JavaScript external. Обычно я предпочитаю встроить некоторые скрипты, используемые для первоначального рендеринга, поэтому их запросы не блокируют остальную часть страницы. С традиционной неофициально-структурированной библиотекой это может выглядеть так:
/inline-traditional.html 🔍
<body>
<script>
var example = {};
example.example = function() {
document.body.appendChild(document.createTextNode("hello"));
};
</script>
<script>
example.example();
</script>
Однако, наивно встраивание файлов модулей, очевидно, не будет работать, поскольку он удалит имя файла, используемое для идентификации модуля для других модулей. Нагрузка HTTP/2-сервера может быть каноническим способом обработки этой ситуации, но она по-прежнему не является вариантом во всех средах.
Можно ли выполнить эквивалентное преобразование с модулями ECMAScript?
Есть ли способ для <script type="module">
импортировать модуль, экспортированный другим в том же документе?
Я предполагаю, что это может сработать, разрешив script указать путь к файлу и вести себя так, как если бы он уже был загружен или вытолкнут с пути.
/inline-name.html 🔍
<script type="module" name="/example.js">
export function example() {
document.body.appendChild(document.createTextNode("hello"));
};
</script>
<script type="module">
import {example} from '/example.js';
example();
</script>
Или, может быть, совершенно другая эталонная схема, например, используется для локальных ссылок SVG:
/inline-id.html 🔍
<script type="module" id="example">
export function example() {
document.body.appendChild(document.createTextNode("hello"));
};
</script>
<script type="module">
import {example} from '#example';
example();
</script>
Но ни одна из этих гипотез действительно не работает, и я не видел альтернативы, которая делает.