\n\n\n
Приложение
\n \n \n \n \n \n \n\n\n```\n\n### Подробный процесс для синхронного скрипта\n\n#### Этап 1: Запрос\n\n```\nБраузер находит \n |\n v\nОтправляет HTTP запрос к серверу:\nGET /bundle.js HTTP/1.1\nHost: example.com\nAccept: */*\n```\n\n#### Этап 2: Загрузка\n\n```\nСервер отправляет файл по TCP/IP\n |\n v\nБраузер получает данные в chunks (куски)\n |\n v\nДанные буферизируются (временно сохраняются)\n |\n v\nКогда весь файл загружен, переходит к парсингу\n```\n\n**Это может быть долго**, особенно для больших файлов:\n\n```javascript\n// Пример: загрузка 500KB файла\n// На 2G (0.5 Mbps): ~8 секунд\n// На 4G (10 Mbps): ~0.4 секунда\n// На Wi-Fi (50 Mbps): ~0.08 секунда\n```\n\n#### Этап 3: Парсинг (Parsing)\n\nБраузер преобразует текст JavaScript в структуру, которую он может выполнить.\n\n```javascript\n// Исходный код\nconst greeting = \"Hello\";\nfunction sayHi() {\n console.log(greeting);\n}\nsayHi();\n\n// Браузер парсит это в AST (Abstract Syntax Tree):\n// Program\n// ├── VariableDeclaration\n// │ └── name: \"greeting\"\n// │ value: \"Hello\"\n// ├── FunctionDeclaration\n// │ └── name: \"sayHi\"\n// │ body: [...]\n// └── CallExpression\n// └── callee: \"sayHi\"\n```\n\nЭтот этап может быть медленный:\n\n```\nВремя парсинга примерно:\n- 100KB файла: ~5ms\n- 1MB файла: ~50ms\n- 5MB файла: ~250ms\n```\n\n#### Этап 4: Компиляция (JIT Compilation)\n\nСовременные браузеры используют **Just-In-Time (JIT)** компиляцию для оптимизации.\n\n```\nAST (Abstract Syntax Tree)\n |\n v\nИнтерпретация (Baseline compilation)\n |\n v\nОптимизирующая компиляция (TurboFan, IonMonkey и т.д.)\n |\n v\nMachine code\n```\n\n**V8 (Chrome, Node.js) процесс:**\n\n```\nSource code\n |\n v (Parser)\nAST\n |\n v (Ignition - базовый интерпретатор)\nBytecode (промежуточный код)\n |\n v (TurboFan - оптимизирующий компилятор)\nOptimized Machine code (быстро исполняется)\n```\n\n#### Этап 5: Исполнение (Execution)\n\nОптимизированный machine code выполняется процессором.\n\n```javascript\n// Исходный код\nfor (let i = 0; i < 1000000; i++) {\n sum += i;\n}\n\n// Браузер исполняет оптимизированный machine code,\n// который работает очень быстро\n```\n\n### Синхронный vs Асинхронный vs Отложенный скрипт\n\n#### 1. Синхронный скрипт\n\n```html\n\n```\n\n**Временная шкала:**\n\n```\n1. Браузер начинает парсить HTML\n2. Встречает \n```\n\n**Временная шкала:**\n\n```\n1. Браузер парсит HTML\n2. Встречает \n```\n\n**Временная шкала:**\n\n```\n1. Браузер парсит HTML\n2. Встречает \n \n My App\n\n\n

Loading...

\n \n \n \n \n \n \n\n\n```\n\n### Что происходит внутри исполнения\n\nКогда скрипт исполняется, браузер выполняет операции **в контексте глобального объекта**:\n\n```javascript\n// Глобальная переменная\nvar globalVar = \"I'm global\";\n\n// Это создаёт window.globalVar\nconsole.log(window.globalVar); // \"I'm global\"\n\n// Функция добавляется в window\nfunction myFunction() {\n console.log(\"Hello\");\n}\nwindow.myFunction(); // \"Hello\"\n\n// Event listeners добавляются\ndocument.addEventListener('click', () => {\n console.log(\"Clicked\");\n});\n```\n\n### Порядок исполнения нескольких скриптов\n\n```html\n\n\n\n\n```\n\n**Порядок исполнения:**\n\n```\n1. first.js (синхронный) - сразу\n2. third.js (defer) - после парсинга HTML\n3. second.js или fourth.js (async) - когда готовы (порядок не гарантирован)\n```\n\n### Ошибки при загрузке скрипта\n\n```javascript\n// Если скрипт не найден\n\n// Браузер отправляет 404, но не выбрасывает ошибку\n// (или выбрасывает, зависит от контекста)\n\n// Обработка ошибки\n\n\n// Или\nconst script = document.createElement('script');\nscript.src = '/app.js';\nscript.onerror = () => console.error('Failed to load');\ndocument.body.appendChild(script);\n```\n\n### Оптимизация загрузки скриптов\n\n#### 1. Используйте defer для основного скрипта\n\n```html\n\n\n\n\n\n```\n\n#### 2. Разделение больших файлов (code splitting)\n\n```javascript\n// Вместо одного большого bundle.js\n// Разделите на несколько файлов\n\n// main-bundle.js (критичный)\n\n\n// analytics-bundle.js (не критичный)\n\n\n// vendor-bundle.js (зависимости)\n\n```\n\n#### 3. Использование service workers для кэширования\n\n```javascript\n// Service worker может кэшировать скрипты\nself.addEventListener('install', (event) => {\n event.waitUntil(\n caches.open('v1').then((cache) => {\n return cache.addAll([\n '/app.js',\n '/vendor.js'\n ]);\n })\n );\n});\n```\n\n#### 4. Приоритет загрузки (Resource Hints)\n\n```html\n\n\n\n\n\n\n\n\n```\n\n### Вывод\n\n**После получения script по сети браузер:**\n\n1. **Загружает** файл по HTTP\n2. **Парсит** текст в AST\n3. **Компилирует** в оптимизированный machine code (JIT)\n4. **Исполняет** код в контексте window\n\n**Время может быть затрачено на:**\n- Сетевую задержку (network latency)\n- Загрузку (download)\n- Парсинг (parsing)\n- Компиляцию (compilation)\n- Исполнение (execution)\n\n**Для оптимизации:**\n- Используйте `defer` для основных скриптов\n- Используйте `async` для независимых скриптов\n- Разделяйте большие файлы на несколько\n- Предзагружайте критичные ресурсы\n- Минимизируйте размер скриптов","dateCreated":"2026-04-02T21:51:43.208010","upvoteCount":0,"author":{"@type":"Person","name":"claude-haiku-4.5"}}}}
← Назад к вопросам

Что происходит после получения script по сети?

2.0 Middle🔥 241 комментариев
#JavaScript Core#Браузер и сетевые технологии

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что происходит после получения script по сети

Когда браузер загружает JavaScript файл по сети (через тег <script src="..."> или динамически), происходит серия этапов: загрузка, парсинг, компиляция и исполнение. Понимание этого процесса критично для оптимизации производительности страницы.

Общий процесс

1. Запрос (Request)
2. Загрузка (Download)
3. Парсинг (Parsing)
4. Компиляция (Compilation)
5. Исполнение (Execution)

Пример HTML

<!DOCTYPE html>
<html>
<head>
  <!-- Синхронный скрипт - блокирует парсинг HTML -->
  <script src="/bundle.js"></script>
</head>
<body>
  <div id="app">Приложение</div>
  
  <!-- Асинхронный скрипт - НЕ блокирует парсинг -->
  <script src="/analytics.js" async></script>
  
  <!-- Отложенный скрипт - загружается, но выполняется после парсинга -->
  <script src="/app.js" defer></script>
</body>
</html>

Подробный процесс для синхронного скрипта

Этап 1: Запрос

Браузер находит <script src="/bundle.js"></script>
        |
        v
Отправляет HTTP запрос к серверу:
GET /bundle.js HTTP/1.1
Host: example.com
Accept: */*

Этап 2: Загрузка

Сервер отправляет файл по TCP/IP
        |
        v
Браузер получает данные в chunks (куски)
        |
        v
Данные буферизируются (временно сохраняются)
        |
        v
Когда весь файл загружен, переходит к парсингу

Это может быть долго, особенно для больших файлов:

// Пример: загрузка 500KB файла
// На 2G (0.5 Mbps): ~8 секунд
// На 4G (10 Mbps): ~0.4 секунда
// На Wi-Fi (50 Mbps): ~0.08 секунда

Этап 3: Парсинг (Parsing)

Браузер преобразует текст JavaScript в структуру, которую он может выполнить.

// Исходный код
const greeting = "Hello";
function sayHi() {
  console.log(greeting);
}
sayHi();

// Браузер парсит это в AST (Abstract Syntax Tree):
// Program
//   ├── VariableDeclaration
//   │   └── name: "greeting"
//   │       value: "Hello"
//   ├── FunctionDeclaration
//   │   └── name: "sayHi"
//   │       body: [...]
//   └── CallExpression
//       └── callee: "sayHi"

Этот этап может быть медленный:

Время парсинга примерно:
- 100KB файла: ~5ms
- 1MB файла: ~50ms
- 5MB файла: ~250ms

Этап 4: Компиляция (JIT Compilation)

Современные браузеры используют Just-In-Time (JIT) компиляцию для оптимизации.

AST (Abstract Syntax Tree)
    |
    v
Интерпретация (Baseline compilation)
    |
    v
Оптимизирующая компиляция (TurboFan, IonMonkey и т.д.)
    |
    v
Machine code

V8 (Chrome, Node.js) процесс:

Source code
    |
    v (Parser)
AST
    |
    v (Ignition - базовый интерпретатор)
Bytecode (промежуточный код)
    |
    v (TurboFan - оптимизирующий компилятор)
Optimized Machine code (быстро исполняется)

Этап 5: Исполнение (Execution)

Оптимизированный machine code выполняется процессором.

// Исходный код
for (let i = 0; i < 1000000; i++) {
  sum += i;
}

// Браузер исполняет оптимизированный machine code,
// который работает очень быстро

Синхронный vs Асинхронный vs Отложенный скрипт

1. Синхронный скрипт

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

Временная шкала:

1. Браузер начинает парсить HTML
2. Встречает <script>
3. ОСТАНАВЛИВАЕТ парсинг HTML
4. Загружает /bundle.js
5. Парсит и компилирует bundle.js
6. ИСПОЛНЯЕТ bundle.js
7. Продолжает парсить HTML
8. Встречает <body> и его содержимое

Проблема: Если скрипт долго загружается или исполняется, страница "зависает".

2. Асинхронный скрипт (async)

<script src="/analytics.js" async></script>

Временная шкала:

1. Браузер парсит HTML
2. Встречает <script async>
3. ПРОДОЛЖАЕТ парсить HTML (не останавливается)
4. Одновременно загружает analytics.js в фоне
5. Когда analytics.js загружен:
   - Останавливает парсинг HTML
   - Исполняет analytics.js
   - Продолжает парсить HTML

Использование: Для независимых скриптов (аналитика, реклама).

3. Отложенный скрипт (defer)

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

Временная шкала:

1. Браузер парсит HTML
2. Встречает <script defer>
3. ПРОДОЛЖАЕТ парсить HTML (не останавливается)
4. Одновременно загружает app.js в фоне
5. ПАРСИТ весь HTML полностью
6. Встречает событие DOMContentLoaded
7. Исполняет app.js
8. Встречает событие load

Использование: Для основного приложения (главный bundle).

Диаграмма временной шкалы

  Без атрибутов (синхронный):
  |---HTML---|WAIT|---JS---|---HTML---|
             (блокировка)
  
  async:
  |---HTML---|---HTML---|---HTML---|
        (JS загружается отдельно)
        |---JS---|
  
  defer:
  |---HTML---|---HTML---|---HTML---|---JS---|

Практический пример

<!DOCTYPE html>
<html>
<head>
  <!-- Синхронный - блокирует рендер -->
  <script src="/heavy-library.js"></script>
  
  <title>My App</title>
</head>
<body>
  <h1>Loading...</h1>
  
  <!-- Асинхронный - не блокирует -->
  <script src="/google-analytics.js" async></script>
  
  <!-- Главный бандл - выполнится после парсинга HTML -->
  <script src="/app.js" defer></script>
</body>
</html>

Что происходит внутри исполнения

Когда скрипт исполняется, браузер выполняет операции в контексте глобального объекта:

// Глобальная переменная
var globalVar = "I'm global";

// Это создаёт window.globalVar
console.log(window.globalVar);  // "I'm global"

// Функция добавляется в window
function myFunction() {
  console.log("Hello");
}
window.myFunction();  // "Hello"

// Event listeners добавляются
document.addEventListener('click', () => {
  console.log("Clicked");
});

Порядок исполнения нескольких скриптов

<script src="first.js"></script>
<script src="second.js" async></script>
<script src="third.js" defer></script>
<script src="fourth.js" async></script>

Порядок исполнения:

1. first.js (синхронный) - сразу
2. third.js (defer) - после парсинга HTML
3. second.js или fourth.js (async) - когда готовы (порядок не гарантирован)

Ошибки при загрузке скрипта

// Если скрипт не найден
<script src="/nonexistent.js"></script>
// Браузер отправляет 404, но не выбрасывает ошибку
// (или выбрасывает, зависит от контекста)

// Обработка ошибки
<script src="/app.js" onerror="console.error('Failed to load')"></script>

// Или
const script = document.createElement('script');
script.src = '/app.js';
script.onerror = () => console.error('Failed to load');
document.body.appendChild(script);

Оптимизация загрузки скриптов

1. Используйте defer для основного скрипта

<!-- Хорошо -->
<script src="/app.js" defer></script>

<!-- Не очень (блокирует парсинг) -->
<script src="/app.js"></script>

2. Разделение больших файлов (code splitting)

// Вместо одного большого bundle.js
// Разделите на несколько файлов

// main-bundle.js (критичный)
<script src="/main-bundle.js" defer></script>

// analytics-bundle.js (не критичный)
<script src="/analytics-bundle.js" async></script>

// vendor-bundle.js (зависимости)
<script src="/vendor-bundle.js" defer></script>

3. Использование service workers для кэширования

// Service worker может кэшировать скрипты
self.addEventListener('install', (event) => {
  event.waitUntil(
    caches.open('v1').then((cache) => {
      return cache.addAll([
        '/app.js',
        '/vendor.js'
      ]);
    })
  );
});

4. Приоритет загрузки (Resource Hints)

<!-- Hint браузеру предзагрузить скрипт -->
<link rel="preload" href="/app.js" as="script" />

<!-- Hint браузеру предсоединиться к серверу -->
<link rel="preconnect" href="https://api.example.com" />

<!-- Hint браузеру предварительно загрузить ресурс -->
<link rel="prefetch" href="/heavy-library.js" />

Вывод

После получения script по сети браузер:

  1. Загружает файл по HTTP
  2. Парсит текст в AST
  3. Компилирует в оптимизированный machine code (JIT)
  4. Исполняет код в контексте window

Время может быть затрачено на:

  • Сетевую задержку (network latency)
  • Загрузку (download)
  • Парсинг (parsing)
  • Компиляцию (compilation)
  • Исполнение (execution)

Для оптимизации:

  • Используйте defer для основных скриптов
  • Используйте async для независимых скриптов
  • Разделяйте большие файлы на несколько
  • Предзагружайте критичные ресурсы
  • Минимизируйте размер скриптов