# Модули EcmaScript
Модули EcmaScript - официальный формат модулей для языка JavaScript. ESM
поддерживается ES4X с помощью одного из двух вариантов:
- Исходный скрипт имеет расширение
.mjs
- Исходный скрипт имеет префикс
mjs:
# Исходный скрипт
На первый взгляд, исходный скрипт не отличается от commonjs скрипта, например index.mjs
:
import { Router } from '@vertx/web';
import { someRoute } from './routes';
const app = Router.router(vertx);
app.route('/').handler(someRoute);
vertx.createHttpServer()
.requestHandler(app)
.listen(8080);
В данном случае someRoute
импортируется из файла routes.mjs
:
export function someRoute(ctx) {
ctx.response()
.end('Hello from ES4X!');
}
# Совместимость
Вы могли заметить, что по причинам совместимости выражение import
в исходном скрипте не содержит расширение:
import { Router } from '@vertx/web';
import { someRoute } from './routes';
// ...
Это маленькое расхождение с официальной спецификацией, по которой загрузчик ES4X будет искать модули в следующем порядке:
- Искать по точному имени файла:
./routes
- Искать с суффиксом
.mjs
:./routes.mjs
- Искать с суффиксом
.js
:./routes.js
WARNING
При работе с ESM
функция require()
недоступна!
# Скачивание модулей
Также возможно скачивание модулей во время выполнения. Эта возможность не ES4X
-специфична. На деле она просто полагается на официальный загрузчик модулей из GraalJS
. Импорт таких модулей очень прост:
import { VertxOptions } from 'https://unpkg.io/@vertx/[email protected]/mod.mjs';
Следует помнить несколько правил:
- HTTP модули не будут скачаны, если менеджер безопасности не работает.
- Если у модуля есть аналогичный
maven
модуль, он НЕ будет скачан. - Скачивание исполняемого кода во время выполнения может привести к проблемам с безопасностью.
Данная возможность может быть полезной в некоторых случаях, например, чтобы избежать зависимости npm
, если код не является публичным.
WARNING
Скачанные модули не будут обрабатывать зависимости или аналогичные maven модули.