> For the complete documentation index, see [llms.txt](https://aleksandra-hrevtsova.gitbook.io/senior-front-end-javascript/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://aleksandra-hrevtsova.gitbook.io/senior-front-end-javascript/podklyuchenie-faila-skripta.md).

# Подключение файла скрипта

В рабочем проекте обычно более одного файла с кодом JavaScript.

В любой проекте всегда самым главным является файл index.html. \
Именно его ищет, видит и считывает браузер. Именно в этот файл поключаются все другие файлы стилей и файлы скриптов.

Вспомним базовую разметку файла index.html

```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
```

А теперь вспомним, как к нему подключаются файлы стилей (CSS) - внутри тега head.

```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./style.css">
</head>
<body>
    
</body>
</html>
```

Важно помнить, что файл скрипта - то есть файл с расширением .js всегда подключается после всей разметки в самый конец тега body - перед его закрывающим тегом.&#x20;

Как показано на примере:

```
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <link rel="stylesheet" href="./style.css" />
  </head>
  <body>
    <section>
      <h2>My section</h2>
      <p>
        Lorem ipsum dolor sit amet consectetur adipisicing elit. Nam, excepturi.
      </p>
    </section>
    <script src="./index.js"></script>
  </body>
</html>
```

Если у нас несколько файлов с .js, подключаем их по отдельности, в той последовательности, как они должны работать.

```
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <link rel="stylesheet" href="./style.css" />
  </head>
  <body>
    <section>
      <h2>My section</h2>
      <p>
        Lorem ipsum dolor sit amet consectetur adipisicing elit. Nam, excepturi.
      </p>
    </section>
    <script src="./index.js"></script>
    <script src="./modal.js"></script>
    <script src="./burger-menu.js"></script>
  </body>
</html>
```

## Подключение скриптов

Загрузка и выполнение скрипта указанного в теге `<script>` без каких-либо атрибутов, блокируют обработку HTML-документа и построение DOM. Это проблема.

```
<script src="path-to-script.js"></script>
```

Когда анализатор встречает такой тег, обработка HTML-документа приостанавливается и начинается загрузка файла скрипта указанного в атрибуте `src`. После загрузки скрипт выполняется, и только потом возобновляется обработка HTML. Это называется «блокирующий» скрипт.

Атрибуты `defer` и `async` были введены чтобы дать разработчикам возможность лучше контролировать как загружать скрипты и когда именно их выполнять.

### Атрибут `defer`[​](https://goit.global/textbooks/javascript-yk5evp/v2/docs/lesson-11/scripts#%D0%B0%D1%82%D1%80%D0%B8%D0%B1%D1%83%D1%82-defer) <a href="#atribut-defer" id="atribut-defer"></a>

```
<script defer src="path-to-script.js"></script>
```

Атрибут `defer` указывает браузеру загружать файл скрипта в фоновом режиме, паралельно обработке HTML-документа и построению DOM. Скрипт будет выполнен только после того как HTML-документ обработан, а DOM построен. Такие скрипты не блокируют построение DOM-дерева и гарантированно выполняются в том порядке, в котором указаны в HTML-документе.

![defer attribute](https://goit.global/textbooks/javascript-yk5evp/v2/img/lesson-11/defer.png)

### Атрибут `async`[​](https://goit.global/textbooks/javascript-yk5evp/v2/docs/lesson-11/scripts#%D0%B0%D1%82%D1%80%D0%B8%D0%B1%D1%83%D1%82-async) <a href="#atribut-async" id="atribut-async"></a>

```
<script async src="path-to-script.js"></script>
```

Загрузка скрипта с атрибутом `async` не блокирует построение DOM, но он выполняется сразу после загрузки. Это значит, что такие скрипты могут заблокировать построение DOM, и выполняются в произвольном порядке.

![async attribute](https://goit.global/textbooks/javascript-yk5evp/v2/img/lesson-11/async.png)
