Проверка корректности Source Maps в браузере

Поведение Source Maps в DevTools и базовые ожидания

Source Map представляет собой связующий слой между скомпилированным кодом и исходными файлами проекта. В браузере он используется для восстановления оригинальной структуры JavaScript, TypeScript, CSS и других ресурсов при отладке. Корректность Source Map определяется тем, насколько точно DevTools способен сопоставить:

  • строку и столбец ошибки в бандле
  • исходный файл и позицию в нём
  • исходный стек вызовов (stack trace)
  • структуру модулей (webpack modules)

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

Проверка включения Source Maps в сборке Webpack

Первый этап валидации — убедиться, что Source Maps действительно генерируются Webpack.

Основные варианты конфигурации:

  • devtool: "source-map" — полный отдельный .map файл
  • devtool: "eval-source-map" — встроенные карты для dev-режима
  • devtool: "hidden-source-map" — карты генерируются, но не подключаются автоматически
  • SourceMapDevToolPlugin — ручная настройка генерации

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

  • наличие строки sourceMappingURL
  • наличие .map файлов в output директории
  • отсутствие обрезания sourcemap на этапе CI/CD

Пример признака корректной сборки:

//# sourceMappingURL=bundle.js.map

Если этой строки нет (при ожидаемой генерации), браузер не сможет загрузить карту.

Проверка загрузки Source Map в Network

Вкладка Network DevTools позволяет определить, был ли запрошен .map файл.

Корректное поведение:

  • появляется запрос bundle.js.map
  • статус запроса 200 OK
  • размер файла соответствует ожидаемому (не 0 bytes)

Типичные проблемы:

  • 404 Not Found — файл не попал в сборку или не развернут
  • 403 Forbidden — ограничение доступа на сервере
  • отсутствие запроса — отсутствует ссылка sourceMappingURL

Особое внимание требуется при использовании CDN: карты часто не деплоятся вместе с JS.

Валидация отображения исходных файлов в Sources

После загрузки карты необходимо проверить отображение структуры модулей:

  • наличие оригинальных файлов (например, src/index.ts)
  • корректные пути (без дублирования или обрезания)
  • отсутствие “webpack:///” ошибок без вложенных модулей

Если Source Map корректен, DevTools показывает дерево:

webpack://
  └── project-name
      └── src
          └── index.js

Некорректные случаи:

  • все файлы слиты в один module без структуры
  • отсутствуют исходные файлы, только bundle
  • отображаются пути, не существующие в проекте

Проверка стека ошибок (Stack Trace Mapping)

Один из ключевых критериев корректности — отображение стека ошибок.

При корректной Source Map:

  • стек указывает на исходные файлы
  • номера строк соответствуют исходникам
  • вызовы функций отражают структуру модулей

При проблемах:

  • стек указывает на bundle.js
  • строки смещены (offset mismatch)
  • отсутствует mapping для async функций

Особенно часто ошибки возникают при:

  • минификации (Terser)
  • транспиляции TypeScript
  • Babel transforms

Проверка корректности Source Map при минификации

Минификация часто ломает соответствие, если карта построена неправильно.

Основные сценарии проверки:

  • сравнение строки ошибки в production bundle и dev build
  • проверка совпадения логики исполнения
  • анализ смещения строк (line offset drift)

Типичная ошибка:

  • исходная строка console.log(user.name)
  • в bundle превращается в a.a.b

Если mapping корректный — DevTools показывает оригинальную строку.

Проверка Source Map для TypeScript и Babel

При использовании TypeScript и Babel важно учитывать цепочку трансформаций:

TypeScript → Babel → Webpack → Terser

Каждый этап может нарушить mapping.

Критические проверки:

  • tsconfig.json содержит "sourceMap": true
  • Babel не отключает генерацию maps (sourceMaps: true)
  • Webpack не перезаписывает карты без devtoolModuleFilenameTemplate

Типичная проблема — двойная генерация Source Maps:

  • TS генерирует .map
  • Babel генерирует новый .map, не учитывая исходный

Результат — смещение координат.

Проверка CSS Source Maps

Source Maps применяются не только к JS, но и к CSS через loaders:

  • css-loader
  • sass-loader
  • less-loader

В DevTools проверяется:

  • отображение .scss или .less файлов
  • корректные строки стилей
  • соответствие селекторов

Типичная ошибка:

  • стили показываются в styles.css
  • отсутствует привязка к SCSS источнику

Причина часто в отключённом sourceMap: true в loader’ах.

Проверка hidden-source-map и внешних карт

При использовании hidden-source-map карта генерируется, но не подключается автоматически.

Проверка выполняется вручную:

  • наличие .map файла на сервере
  • соответствие имени файла бандлу
  • ручная подстановка sourceMappingURL

Если карта существует, но не используется:

  • DevTools не показывает исходники
  • стек остаётся в bundle

Проверка корректности путей и devtoolModuleFilenameTemplate

Webpack может искажать пути файлов при неправильной конфигурации:

  • дублирование папок (src/src/index.js)
  • потеря относительных путей
  • некорректный webpack:// namespace

Ключевая настройка:

output: {
  devtoolModuleFilenameTemplate: info =>
    `webpack:///${info.resourcePath}`
}

При неверной настройке Source Map становится формально валидным, но бесполезным.

Проверка соответствия версий бандла и карты

Одна из частых ошибок — рассинхронизация файлов:

  • JS обновился
  • .map остался от старой сборки

Признаки:

  • ошибки указывают на несуществующие строки
  • отображаются странные функции
  • stack trace не соответствует коду

Методы проверки:

  • сравнение hash бандла и карты
  • контроль CI/CD артефактов
  • очистка cache перед деплоем

Проверка в реальных сценариях ошибок

Корректность Source Maps проверяется через искусственно созданные ошибки:

  • throw new Error("test")
  • обращение к несуществующему полю
  • ошибка в async функции
  • ошибка внутри модуля

Критерий:

  • DevTools должен показать точный файл и строку
  • стек должен быть читаемым
  • отсутствует привязка к bundle

Проверка через Performance и Debugger stepping

Дополнительный уровень валидации — пошаговая отладка:

  • breakpoints ставятся в исходных файлах
  • step over/into работает по исходникам
  • call stack соответствует структуре модулей

Если stepping ведёт в bundle — Source Map частично или полностью сломан.

Проверка влияния кеширования браузера

Source Maps часто ломаются из-за кеша:

  • старый .map остаётся в cache storage
  • JS обновляется, но карта нет

Проверка:

  • отключение cache в DevTools
  • hard reload
  • сравнение network timestamps

Проверка безопасности и доступности карт

В production окружении важно учитывать:

  • карты могут быть недоступны публично
  • CDN может блокировать .map
  • сервер может отдавать MIME-type некорректно

Корректная диагностика:

  • проверка HTTP headers
  • проверка Content-Type (application/json)
  • отсутствие редиректов при загрузке карты