Скрипты и обработка событий
Вы можете добавить интерактивность к Astro компонентам, не используя UI фреймворк такой как React, Svelte, Vue и т.д. Интерактивности можно достичь, используя стандартный HTML тег <script>
. Это позволит вам отправить JavaScript в браузер и добавить функциональности вашим Astro компонентам.
Клиентские скрипты
Заголовок раздела Клиентские скриптыСкрипты могут использоваться для того, чтобы добавить обработчики событий, отправить аналитические данные, анимировать элементы и многого другого, что JavaScript может делать на веб-сайтах.
По умолчанию, Astro обрабатывает и собирает <script>
теги, добавляя поддержку импортов, TypeScript’а и другие функции.
Использование <script>
в Astro
Заголовок раздела Использование <script> в AstroВ .astro
файлах вы можете добавить клиентский JavaScript, добавив <script>
тег (может быть несколько <script>
тегов).
В примере ниже добавляется <Hello />
компонент, который залогирует сообщение в браузерную консоль.
Сборка скриптов
Заголовок раздела Сборка скриптовПо умолчанию, <script>
теги обрабатываются Astro.
- Любые импорты будут добавлены в прод-сборку, позволяя использовать внешние зависимости, такие как локальные файлы и Node модули.
- Обработанный скрипт будет добавлен на страницу в
<head>
тег с типомtype="module"
. - TypeScript полностью поддерживается, включая импорт TypeScript файлов.
- Если ваш компонент используется несколько раз на странице, скрипт будет добавлен в сборку и на страницу только единожды.
Для того, чтобы избежать сборки скрипта, вы можете добавить директиву is:inline
.
Поведение Astro сборки по умолчанию может быть отключено в некоторых случаях. А именно, добавление type="module"
или любого другого атрибута кроме src
к тегу <script>
приведёт к тому, что Astro будет интепретировать этот тег так же, как имеющий is:inline
директиву. То же самое произойдет, если скрипт будет описан в JSX выражении.
📚 Обратитесь к нашему описанию директив за более подробной информацией о доступных директивах для тегов <script>
.
Загрузка скриптов
Заголовок раздела Загрузка скриптовВам может потребоваться описать свой скрипт в отдельном .js
/.ts
файле или подключить внешний скрипт с другого сервера. Этого можно достичь, добавив путь до файла в атрибут src
тега <script>
.
Импорт локальных скриптов
Заголовок раздела Импорт локальных скриптовКогда использовать: Если ваш скрипт расположен в папке src/
.
Astro соберёт, оптимизирует и добавит эти скрипты на страницу, в соответствии с правилами сборки.
Загрузка внешних скриптов
Заголовок раздела Загрузка внешних скриптовКогда использовать: Если ваш JavaScript файл расположен в локальной директории public/
, или, например, на CDN.
Для того, чтобы загрузить скрипты, которые расположены вне проектной директории src
, используйте директиву is:inline
. Этот подход позволяет пропустить JavaScript обработку, сборку и оптимизацию, которые предоставляются Astro.
Распространнёные примеры использования скриптов
Заголовок раздела Распространнёные примеры использования скриптовОбработка onclick
и других событий
Заголовок раздела Обработка onclick и других событийНекоторые UI фреймворки используют особый синтаксис для обработки событий, как, например, onClick={...}
(React/Preact) или @click="..."
(Vue). Astro следует стандартам HTML и не использует собственный синтаксис обработки событий.
Вместо этого, для обработки пользовательских взаимодействий вы можете использовать addEventListener
внутри <script>
тега
Если на вашей странице несколько <AlertButton />
, Astro не будет запускать скрипт несколько раз. Скрипты собраны и добавлены на страницу единожды. С помощью querySelectorAll
можно убедиться, что скрипт добавит обработчики событий на всех кнопки с alert
классом на странице.
Веб-компоненты с кастомными элементами
Заголовок раздела Веб-компоненты с кастомными элементамиВы можете создавать свои собственные HTML элементы с произвольным поведением, используя стандарт Веб-компонент (Web Components). Определение своего элемента в .astro
файле позволяет создавать интерактивные компоненты без необходимости использования UI фреймворка.
В этом примере, мы определяем новый <astro-heart>
HTML элемент, который отслеживает количество нажатий на кнопку сердца и обновляет <span>
актуальным значением.
Есть 2 преимущества использования кастомных элементов здесь:
-
Вместо того, чтобы искать элементы через
document.querySelector()
, здесь можно использоватьthis.querySelector()
, который ищет только внутри текущего экземпляра элемента. Это позволяет упростить работу с дочерними элементами внутри элемента. -
Хотя
<script>
будет выполнен единожды, браузер будет вызыватьconstructor()
кастомного элемента каждый раз, когда он встретит<astro-heart>
на странице. Это значит, что вы можете безопасно разрабатывать для одного компонента, даже если на странице таких компонентов будет множество.
📚 Вы можете получить больше информации о кастомных элементах на странице гайда web.dev’s Reusable Web Components и MDN’s Введение в кастомные компоненты.
Передать frontmatter переменные в скрипты
Заголовок раздела Передать frontmatter переменные в скриптыВ компонентах Astro, код frontmatter, заключенный в конструкцию ---
, запускается на сервере и не доступен в браузере. Для того, чтобы отправить данные с сервера на клиент, нам нужен способ сохранения данных внутри HTML, с возможностью чтения в JavaScript рантайме в браузере.
Один из возможных путей — использование data-*
атрибутов для хранения данных в HTML документе. Скрипты, включая кастомные элементы, затем могут получить доступ к атрибутам, используя dataset
свойство, как только HTML будет полностью загружен.
В этом примере компонента свойство message
хранится в data-message
атрибуте, таким образом кастомный элемент может получить значение свойства через this.dataset.message
.
Теперь можно использовать компонент множество раз и увидеть разные приветственные сообщения.
Это как раз то, что Astro делает под капотом, когда вы передаёте свойства компонентам, написанным на UI фреймворке (например, React)! Для компонентов с директивой client:*
Astro создаёт кастомный элемент <astro-island>
с атрибутом props
, который и хранит все серверные данные в HTML.