- Первый скрипт состоит из трех шагов: регистрация, перехват события и сохранение его в папку скриптов.
- Хост предоставляет GraalVM, поэтому вы пишете настоящий JavaScript и никогда не устанавливаете его самостоятельно.
- Скрипты мгновенно обновляются без перекомпиляции Java.
- Скрипт может вызывать только объекты, которые хост предоставляет через белый список доступа к хосту.
Написание первого скрипта GraalVM на JavaScript включает в себя три небольших шага: регистрацию скрипта в точке входа хоста, привязку его к событию или модулю и сохранение в папку скриптов, чтобы движок мог его загрузить. Движок работает на Polyglot API GraalVM, поэтому скрипт является настоящим JavaScript и перезагружается без перекомпиляции какого-либо Java.
Где используется Opal
Opal — это мод для Fabric, использующий движок скриптов GraalVM JavaScript, поэтому эти шаги применяются напрямую. Чтобы начать, ознакомьтесь с документацией по скриптам.
Что вам понадобится в первую очередь
Программа-хост, которая встраивает движок. Хост поставляется с GraalVM JavaScript, предоставляет набор объектов для вызова скриптами и отслеживает папку со скриптами. GraalVM вам устанавливать не нужно; он включен в хост. Вы пишете обычный JavaScript, используя объекты, которые предоставляет хост.
Понимание того, что эти объекты представляют, полезно, но для начала вам не потребуется писать ни строчки на Java.
Три шага
Найдите папку со скриптами
Создайте файл скрипта
Создайте новый файл .js (или .mjs) в этой папке. Хост обнаружит его при следующей загрузке скриптов.
Зарегистрировать и подключить
Внутри файла зарегистрируйте скрипт с точкой входа хоста, затем подключите поведение к событию или определите модуль.
Минимальный пример
Большинство хостов предоставляют сценарию одну точку входа для регистрации и несколько прокси-объектов, которые связывают JavaScript с программой. Точные имена зависят от хоста, но структура одинакова. Первый сценарий обычно просто объявляет о себе и реагирует на одно событие:
// Register the script with the host (names vary by host).
script.register({
name: "hello-world",
version: "1.0.0",
});
// React to an event the host exposes.
script.on("enable", () => {
client.print("Hello from my first script.");
});Обратитесь к собственной документации API хоста, чтобы узнать реальные имена объектов и методов. Суть в следующем: зарегистрируйтесь, затем перехватите событие или определите модуль
Горячая перезагрузка во время работы
Сохраните файл и перезагрузите скрипты (или перезапустите хост, если он не поддерживает живую перезагрузку). Изменения вступают в силу без перекомпиляции. Этот быстрый цикл — основная причина использования скриптов вместо компиляции мода: скрипт перезагружается за секунды, а скомпилированный мод необходимо пересобрать и перезапустить.
| Подход | Цикл итерации | Язык | Когда подходит |
|---|---|---|---|
| Скрипт JavaScript GraalVM | Редактировать, сохранить, перезагрузить | JavaScript | Быстрые изменения, пользовательское поведение |
| Скомпилированный мод | Пересобрать, перезапустить | Java или Kotlin | Более крупные функции, глубокая интеграция |
Что могут и чего не могут сценарии
Скрипт может обращаться к объектам, предоставляемым хостом, и ни к каким другим. Хост определяет, к каким классам и методам скрипт может получить доступ, используя белый список доступа хоста GraalVM Polyglot, а по умолчанию доступ запрещен. Это обеспечивает безопасность и предсказуемость скриптов. Если нужный объект не предоставлен, хост должен добавить его; получить доступ к объектам за пределами белого списка со стороны скрипта невозможно.
Часто задаваемые вопросы
Нет. Основная программа включает в себя GraalVM и его JavaScript-движок. Вам нужно только написать JavaScript-файл и поместить его в папку со скриптами.
Да. Движок поддерживает последние возможности ECMAScript, включая модули с import и export, поэтому вы не ограничены старым подмножеством.
Убедитесь, что файл находится в папке скриптов хоста, имеет ожидаемое расширение и регистрируется в точке входа хоста. Наиболее частая причина — опечатка в вызове регистрации.
Нет. Движок встроен во встроенную JVM, поэтому ваш скрипт взаимодействует с хост-программой, а не с автономной средой выполнения Node.js.