firebase.json — главный конфигурационный файл проекта Firebase, который определяет поведение сервисов при локальной разработке и деплое. Это JSON-файл в корне репозитория, в котором вы указываете, какие ресурсы нужно деплоить (hosting, functions, firestore, database, storage и т.д.), правила, пред- и пост-скрипты и настройки эмуляторов.
Без корректного firebase.json вы рискуете:
Далее — разбор ключевых секций и конкретные примеры.
Типичная структура (сокращённо):
```json { "hosting": { ... }, "functions": { ... }, "firestore": { ... }, "database": { ... }, "storage": { ... }, "emulators": { ... } } ```
Коротко по полям:
По умолчанию в hosting часто включены: "public", "ignore" и "rewrites". Поле "public" обязательно для одного сайта.
Ключевые опции:
Пример:
```json "hosting": { "public": "build", "ignore": ["firebase.json", "/.*", "/node_modules/"], "cleanUrls": true, "trailingSlash": false } ```
cleanUrls и trailingSlash применяются до rewrites/redirects — полезно для SEO и UX.
Примеры:
SPA-rewrite (один из самых распространённых случаев):
```json "rewrites": [ { "source": "/api/", "function": "api" }, { "source": "", "destination": "/index.html" } ] ```
Redirect с кодом 301:
```json "redirects": [ { "source": "/old-page", "destination": "/new-page", "type": 301 } ] ```
Cache-Control Header (статические ассеты на 1 год):
```json "headers": [ { "source": "/static/", "headers": [ { "key": "Cache-Control", "value": "public, max-age=31536000, immutable" } ] } ] ```
Важно: правила применяются по порядку и specificity — более "узкие" пути должны идти раньше широких.
rewrites поддерживают перенаправления на:
Пример mix hosting + functions:
```json "hosting": { "public": "dist", "rewrites": [ { "source": "/api/", "function": "api" }, { "source": "/run/", "run": { "serviceId": "web-worker", "region": "europe-west1" } }, { "source": "", "destination": "/index.html" } ] } ```
Для функций также можно указать predeploy-команды в раздел functions:
```json "functions": { "source": "functions", "predeploy": ["npm --prefix \"$RESOURCE_DIR\" run build"] } ```
Указывайте файлы правил и индексы, чтобы при deploy Firebase применил их автоматически:
```json "firestore": { "rules": "firestore.rules", "indexes": "firestore.indexes.json" }, "database": { "rules": "database.rules.json" }, "storage": { "rules": "storage.rules" } ```
Это удобнее и безопаснее, чем ручной импорт правил через консоль.
Раздел emulators позволяет настроить порты и UI. Стандартные порты (часто используемые):
Пример конфигурации:
```json "emulators": { "hosting": { "port": 5000 }, "functions": { "port": 5001 }, "firestore": { "port": 8080 }, "ui": { "enabled": true, "port": 4000 } } ```
Запуск: firebase emulators:start — этот файл позволит воспроизвести окружение локально, включая predeploy-скрипты и подключения.
Полный пример, объединяющий основные элементы:
```json { "hosting": [ { "target": "web-app", "public": "build", "ignore": ["firebase.json", "/.*", "/node_modules/"], "cleanUrls": true, "trailingSlash": false, "headers": [ { "source": "/static/", "headers": [ { "key": "Cache-Control", "value": "public, max-age=31536000, immutable" } ] }, { "source": "", "headers": [ { "key": "Strict-Transport-Security", "value": "max-age=63072000; includeSubDomains; preload" } ] } ], "rewrites": [ { "source": "/api/", "function": "api" }, { "source": "", "destination": "/index.html" } ], "redirects": [ { "source": "/old", "destination": "/new", "type": 301 } ] } ], "functions": { "source": "functions", "predeploy": ["npm --prefix \"$RESOURCE_DIR\" run build"] }, "firestore": { "rules": "firestore.rules", "indexes": "firestore.indexes.json" }, "storage": { "rules": "storage.rules" }, "emulators": { "hosting": { "port": 5000 }, "functions": { "port": 5001 }, "firestore": { "port": 8080 }, "ui": { "enabled": true, "port": 4000 } } } ```
Обратите внимание: "target" используется для таргетного деплоя вместе с .firebaserc (firebase target:apply).
1. SPA-ошибка 404 при перезагрузке страницы: забудьте rewrite "**" -> "/index.html". Это вызывает большинство проблем. 2. Неправильные правила ignore: случайно исключили index.html или assets — файлы не будут загружены. 3. Predeploy-команды падают при CI — убедитесь, что зависимости установлены и скрипт корректный. В CI команды выполняются в каталоге $RESOURCE_DIR. 4. Неправильный Cache-Control: для часто изменяемых ресурсов ставьте короткий max-age (например, 60), для assets с content-hash — 31536000. 5. Конфиденциальные данные: в firebase.json обычно нет секретов. Не храните ключи/пароли в этом файле.
Если нужно увидеть, какие изменения будут задеплоены, используйте firebase deploy --only hosting --dry-run (если доступно) или сначала firebase deploy --only hosting --message "..." в CI.
Перед деплоем проверьте: