Среда выполнения кода

Среда выполнения кода

Технический фундамент выбора runtime

Инженерное правило простое: сначала определи среду, потом проектируй решение.

  • браузерный код ориентирован на UI, события и DOM;
  • серверный код — на обработку данных, API и инфраструктуру;
  • одинаковый синтаксис JS не гарантирует одинаковый набор API;
  • проверка контекста до реализации дешевле, чем отладка после релиза.

Это снижает класс ошибок "код корректный, но выполняется не там".

Почему среда выполнения — часть архитектуры

Когда пишешь код, важно понимать не только "что он делает", но и "где он должен жить". Ошибка в выборе среды часто приводит к багам, которые сложно отловить по тексту программы: синтаксис может быть идеальным, а контекст — неверным.

Ключевой момент: один и тот же JavaScript-код может быть валидным, но бессмысленным в неправильном runtime.

Проверь себя: почему вызов API вроде document в Node.js — это не "мелкая ошибка", а сигнал, что логика оказалась не там?

Что такое runtime простыми словами

Runtime — это окружение, где работает JavaScript и где доступны дополнительные API. Браузер дает window, document, работу с DOM. Node.js дает файловую систему, серверные модули и другой набор API.

const runtime = 'browser';
const api = runtime === 'browser' ? 'document' : 'fs';

console.log('Текущий runtime:', runtime);
console.log('Типичный API:', api);

Практическая логика выбора среды

Сценарий «обновить интерфейс» почти всегда должен жить в браузере. Сценарий «сохранить прогресс в хранилище» обычно идет на сервер. Разделение по ответственности уменьшает хаос в коде.

function chooseRuntime(taskType) {
  if (taskType === 'ui-update') return 'browser';
  if (taskType === 'save-progress') return 'node';
  return 'review';
}

console.log(chooseRuntime('ui-update'));
console.log(chooseRuntime('save-progress'));

Проверь себя: что вернет функция для taskType = 'send-email' и почему это полезно на старте?

Глобальные объекты среды: быстрый ориентир

Полезно помнить минимум:

  • браузер: window, document
  • Node.js: global, process
function detectRuntime() {
  if (typeof window !== 'undefined') return 'browser';
  if (typeof process !== 'undefined') return 'node';
  return 'unknown';
}

console.log(detectRuntime());

Это не универсальная магия (в разных окружениях могут быть полифиллы), но хороший beginner-паттерн для осознанной проверки контекста.

Частые ошибки новичков

Одна из самых частых ошибок — перенести паттерн из браузера на сервер (или наоборот) без проверки доступности API.

const runtime = 'node';
const needsDom = true;

const canRun = runtime === 'browser' || !needsDom;
console.log(canRun ? 'OK' : 'Ошибка контекста');

Если задача требует DOM, а runtime — node, это архитектурная ошибка, а не «мелкий баг».

Анти-провал: прежде чем "чинить ошибку", зафиксируй, в каком окружении этот код действительно запускается.

Что будет, если изменить входные данные

Edge case возникает, когда локальное окружение отличается от прод-окружения. Например, в локальной сборке есть полифилл, а в бою нет. Поэтому полезно закладывать явную проверку зависимости от среды.

function needsFallback(runtime, hasApi) {
  if (runtime === 'browser' && !hasApi) {
    return 'add-fallback';
  }
  return 'run-main-flow';
}

console.log(needsFallback('browser', false));

Проверь себя: что вернет функция для needsFallback('node', false) и почему?

Анти-провал: не вызывай API "напрямую", пока не проверил, что оно реально доступно в текущем runtime.

Краткий итог

  • Runtime определяет набор доступных API поверх языка JavaScript.
  • Выбор среды — архитектурное решение: UI-логика обычно в браузере, серверные сценарии — в Node.js.
  • Один и тот же синтаксис не гарантирует одинаковое поведение в разных окружениях.
  • Явная проверка контекста дешевле, чем отладка багов после релиза.
  • Прод-окружение может отличаться от локального, поэтому полезны проверки и fallback-логика.