Тег script в HTML: зачем он нужен и как правильно использовать

Свежие новости

Тег script в HTML: зачем он нужен и как правильно использовать

В веб‑разработке тег script - элемент HTML, позволяющий запускать JavaScript‑код непосредственно в документе или подключать внешние файлы. Он - один из самых используемых способов добавить интерактивность на страницу.

Тег script нужен почти в любой динамичной веб‑странице: от простых анимаций до сложных одностраничных приложений.

Что именно делает тег script?

Когда браузер встречает тег script, он переключает режим разборки HTML в режим выполнения JavaScript. Код может быть встроенным (inline) или загружаться из внешнего файла через атрибут src. После выполнения скрипт может манипулировать DOM, реагировать на события, отправлять запросы и многое другое.

Где размещать тег script?

Традиционно скрипты помещали в <head>, но это замедляет отрисовку страницы, потому что браузер останавливает построение DOM, пока не загрузит и не выполнит скрипт. Современный подход - ставить тег в конец <body> или использовать атрибуты async и defer, которые позволяют параллельно загружать ресурсы.

Подключение внешних скриптов через src

Для повторного использования кода и уменьшения размера HTML часто применяют внешний файл:

<script src="/js/app.js"></script>

Атрибут src принимает URL, который может быть абсолютным или относительным. При загрузке браузер сначала скачивает файл, затем исполняет его в контексте текущей страницы.

Атрибуты async и defer: когда и какой использовать

Оба атрибута позволяют не блокировать построение DOM, но работают по‑разному:

Сравнение async и defer
АтрибутКогда загружаетсяКогда выполняетсяПодходит для
asyncЗагружается параллельно с разбором HTMLЗапускается сразу после загрузки, до завершения построения DOMНезависимые скрипты, аналитика, рекламные пиксели
deferЗагружается параллельно с разбором HTMLЗапускается после полной постройки DOM, в порядке появления в документеКод, зависящий от DOM, модули приложения

Если скрипт не взаимодействует с элементами страницы, лучше ставить async. Если нужен доступ к уже построенному DOM, выбирайте defer.

Схема сравнения async и defer: скрипты ветвятся и исполняются разное время.

Типы скриптов: type и module

По умолчанию браузер считает содержимое тег script JavaScript‑ом. Атрибут type позволяет менять интерпретатор. Самый актуальный вариант - использовать модульный синтаксис:

<script type="module" src="/js/main.mjs"></script>

Модули поддерживают import/ export, изолируют область видимости и автоматически работают в режиме strict. Если нужен старый способ, указывают type="text/javascript", но это уже избыточно.

Влияние загрузки скриптов на производительность

Неправильное размещение скриптов может привести к «зависанию» страницы, особенно на мобильных устройствах с медленным соединением. Совет: комбинировать несколько мелких файлов в один, использовать минификацию и кешировать через HTTP‑заголовки. Кроме того, важно проверять размер загружаемых библиотек; иногда достаточно подключить только нужные функции вместо полного пакета.

Безопасность: CSP и Subresource Integrity

Современные сайты защищаются с помощью Content Security Policy (CSP). Политика позволяет указать, откуда браузер может загружать скрипты:

Content-Security-Policy: script-src 'self' https://cdn.example.com;

Для внешних CDN удобно добавить атрибут integrity (Subresource Integrity). Он содержит хеш загрузки, и браузер проверит неизменность ресурса:

<script src="https://cdn.jsdelivr.net/npm/vue@2" integrity="sha384-..." crossorigin="anonymous"></script>

Таким образом, даже если CDN будет скомпрометирован, вредоносный код не выполнится.

Защищённая веб‑страница с щитом и блоком скрипта из CDN.

Практические советы и типичные ошибки

  • Не ставьте тег script внутрь <title> или внутри атрибутов - это приведёт к синтаксическим ошибкам.
  • Избегайте использования document.write() после полной загрузки страницы - это перезаписывает весь документ.
  • Если скрипт нужен только для определённого браузера, используйте условные комментарии или проверку if (window.Promise) вместо отдельного файла.
  • Не забывайте задавать type="module" для современных ES‑модулей - иначе браузер не поймёт import/export.
  • Для больших проектов включайте сборщики (Webpack, Vite) - они автоматически разбивают код на чанки и ставят нужные атрибуты.

Краткие выводы

  • Тег script - основной способ добавить JavaScript на страницу.
  • Размещайте скрипты в конце body или используйте async/defer для ускорения загрузки.
  • Для модульного кода указывайте type="module".
  • Защитите внешние скрипты с помощью CSP и атрибута integrity.
  • Следите за размером и количеством файлов - оптимизация повышает скорость.

Часто задаваемые вопросы

Можно ли разместить несколько тегов script подряд?

Да, браузер выполнит их в том порядке, в котором они встречаются в документе, если не указаны атрибуты async или defer. При использовании этих атрибутов порядок может измениться в зависимости от скорости загрузки.

Что произойдет, если забыть закрыть тег script?

Браузер будет считать весь оставшийся HTML‑контент частью JavaScript‑кода, что приведёт к ошибкам парсинга и полной потере разметки страницы.

Можно ли подключить CSS‑файл через тег script?

Нет. Для стилей используется тег <link rel="stylesheet"> или <style>. Попытка загрузить CSS через script вызовет ошибку.

Как проверить, работает ли атрибут defer?

Откройте инструменты разработчика, поставьте точку останова в начале скрипта и посмотрите, вызывается ли она после события DOMContentLoaded. Если да - defer работает корректно.

Что делать, если скрипт не загружается из CDN?

Проверьте консоль на ошибки CORS и CSP. Убедитесь, что в заголовке Access-Control-Allow-Origin разрешён ваш домен, а политика CSP допускает загрузку из данного источника.