В веб‑разработке тег 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 | Загружается параллельно с разбором HTML | Запускается сразу после загрузки, до завершения построения DOM | Независимые скрипты, аналитика, рекламные пиксели |
defer | Загружается параллельно с разбором HTML | Запускается после полной постройки DOM, в порядке появления в документе | Код, зависящий от DOM, модули приложения |
Если скрипт не взаимодействует с элементами страницы, лучше ставить async
. Если нужен доступ к уже построенному DOM, выбирайте 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 будет скомпрометирован, вредоносный код не выполнится.

Практические советы и типичные ошибки
- Не ставьте тег 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 допускает загрузку из данного источника.