Поле inlineSourcesContent

Параметр **inlineSourcesContent** в конфигурации SWC управляет тем, будет ли исходный код включаться внутрь генерируемых source map или оставляться вне их. Это один из ключевых механизмов, влияющих на удобство отладки, размер сборки и безопасность распространения исходников. ## Назначение поля inlineSourcesContent Source map в SWC служит связующим звеном между скомпилированным JavaScript-кодом и исходным кодом, написанным разработчиком. Внутри source map хранится информация о соответствиях строк, столбцов и файлов. Поле **inlineSourcesContent** определяет поведение поля `sourcesContent` внутри source map: * если включено — исходные файлы вставляются прямо в map; * если отключено — source map содержит только ссылки на исходники без их содержимого. Это напрямую влияет на структуру итогового `.map` файла и возможности инструментов разработки. ## Формат и расположение в конфигурации SWC В SWC настройка обычно задаётся в разделе генерации source map: ```json { "jsc": { "target": "es2020" }, "sourceMaps": true, "inlineSourcesContent": true } ``` Также поле может быть частью расширенных конфигураций, где управление source map вынесено отдельно или комбинируется с другими параметрами генерации. ## Поведение при включённом inlineSourcesContent При значении `true` SWC помещает содержимое каждого исходного файла прямо в поле `sourcesContent` внутри source map. Структура source map в этом случае включает: * список исходных файлов (`sources`) * содержимое каждого файла (`sourcesContent`) * mapping между оригинальным и сгенерированным кодом Пример упрощённой структуры: ```json { "version": 3, "file": "bundle.js", "sources": ["src/index.js"], "sourcesContent": [ "const sum = (a, b) => a + b;" ], "mappings": ";;;;;AAAA" } ``` ### Особенности такого режима: * отладка возможна без доступа к файловой системе; * DevTools браузера могут восстанавливать исходный код полностью; * увеличивается размер `.map` файлов; * упрощается диагностика ошибок в удалённых окружениях. ## Поведение при отключённом inlineSourcesContent При значении `false` SWC исключает содержимое исходных файлов из source map. В результате: * поле `sourcesContent` отсутствует или пустое; * DevTools пытаются загружать исходники по путям из `sources`; * требуется доступ к оригинальным файлам (локально или через сервер исходников). Пример структуры: ```json { "version": 3, "file": "bundle.js", "sources": ["src/index.js"], "mappings": ";;;;;AAAA" } ``` ### Особенности такого режима: * значительно уменьшается размер source map; * повышается безопасность (исходный код не распространяется вместе с билдом); * отладка зависит от наличия исходников в окружении разработчика. ## Влияние на производительность и размер сборки При больших проектах разница становится заметной: ### Включённый inlineSourcesContent * увеличивает размер `.map` файлов пропорционально размеру исходников; * повышает нагрузку на передачу артефактов (CI/CD, CDN); * ускоряет локальную отладку. ### Отключённый inlineSourcesContent * уменьшает общий размер артефактов сборки; * снижает сетевые затраты при деплое; * может усложнить диагностику ошибок в production. ## Поведение в браузерных DevTools DevTools используют поле `sourcesContent` как приоритетный источник восстановления исходного кода. При наличии inline content: * исходники отображаются мгновенно; * не требуется дополнительная загрузка файлов; * корректно работают breakpoints даже без исходного сервера. При отсутствии inline content: * браузер пытается загрузить файлы по `sources`; * при отсутствии доступа отображается только скомпилированный код; * debugging experience зависит от настройки сервера и путей. ## Связь с безопасностью Поле **inlineSourcesContent** часто рассматривается в контексте утечки исходного кода. ### Потенциальные риски: * попадание бизнес-логики в публичные source map; * возможность восстановления архитектуры приложения; * раскрытие комментариев и вспомогательных функций. Поэтому в production-сборках нередко применяют: * `inlineSourcesContent: false` * генерацию source map только для внутренних окружений * отдельное хранение `.map` файлов вне публичного доступа ## Взаимодействие с другими настройками SWC ### sourceMaps Без включённого `sourceMaps: true` поле inlineSourcesContent не имеет смысла, так как source map не генерируется. ### minify При минификации влияние inlineSourcesContent сохраняется: map может быть маленьким по структуре, но содержать полный исходный код, что увеличивает итоговый размер. ### jsc.parser и трансформации Преобразования AST не влияют напрямую на inlineSourcesContent, но изменяют содержимое, которое может быть включено в map. ## Практические сценарии использования ### Локальная разработка Чаще всего используется: ```json { "sourceMaps": true, "inlineSourcesContent": true } ``` Позволяет полностью воспроизводить исходный код в браузере без дополнительной инфраструктуры. ### CI/CD сборка Часто применяется: ```json { "sourceMaps": true, "inlineSourcesContent": false } ``` Снижает размер артефактов и исключает утечку исходников. ### Debug сборки Иногда используется гибридный подход: * inlineSourcesContent включён только для staging; * production сборка полностью отключает содержимое. ## Ограничения и особенности реализации в SWC * SWC не всегда различает частичные source map сценарии на уровне отдельных модулей; * inlineSourcesContent применяется глобально ко всему бандлу; * поведение может отличаться в зависимости от интеграции (webpack, next.js, rspack); * при транспиляции больших monorepo влияние на размер map становится критичным. ## Типичные ошибки при использовании ### Ожидание уменьшения размера map при включённом параметре Частая ошибка — ожидание, что inlineSourcesContent не влияет существенно на размер. На практике он может удваивать или утраивать размер source map. ### Потеря отладки в production При отключении параметра без альтернативного хостинга source map возникает ситуация, когда DevTools не могут восстановить исходники. ### Несогласованность окружений Разные значения inlineSourcesContent в dev и prod приводят к различному поведению breakpoints и stack traces. ## Оптимизационные стратегии Для крупных приложений применяются следующие подходы: * разделение конфигураций SWC по окружениям; * генерация external source maps с загрузкой по требованию; * хранение map файлов в защищённом storage; * использование sourcemap fallback только для internal debugging; * отключение inlineSourcesContent в публичных релизах при сохранении доступности внешних map.