Объедините Cloud Functions с Firebase Hosting для генерации и обслуживания динамического контента или создавайте REST API в качестве микросервисов.
Cloud Functions for Firebase позволяют автоматически запускать бэкенд-код в ответ на HTTPS-запросы. Ваш код хранится в облаке Google и работает в управляемой среде. Вам не нужно управлять собственными серверами и масштабировать их.
Примеры использования и примеры Cloud Functions интегрированных с Firebase Hosting , можно найти в нашем обзоре бессерверных решений .
Подключите Cloud Functions к Firebase Hosting
В этом разделе представлен пошаговый пример подключения функции к Firebase Hosting .
Обратите внимание, что для повышения производительности обслуживания динамического контента вы можете дополнительно настроить параметры кэширования .
Шаг 1: Настройка Cloud Functions
Убедитесь, что у вас установлена последняя версия Firebase CLI и вы инициализировали Firebase Hosting .
Подробные инструкции по установке CLI и инициализации Hosting см. в руководстве по началу работы с Hosting .
Убедитесь, что вы настроили Cloud Functions :
Если вы уже настроили Cloud Functions , вы можете перейти к Шагу 2: Создание и тестирование HTTPS-функции .
Если вы не настроили Cloud Functions :
Инициализируйте Cloud Functions , выполнив следующую команду из корня каталога вашего проекта:
firebase init functions
При появлении запроса выберите JavaScript (в этом пошаговом примере используется JS).
Убедитесь, что в локальном каталоге проекта (созданном командой Firebase, которую вы только что выполнили) есть каталог
functions. В этом каталоге находится код Cloud Functionsfunctions
Шаг 2: Создайте и протестируйте функцию HTTPS для вашего Hosting сайта.
Откройте
/functions/index.jsв вашем любимом редакторе.Замените содержимое файла следующим кодом.
Этот код создает HTTPS-функцию (с именем
bigben), которая отвечает на HTTPS-запросы звукомBONGдля каждого часа дня, как часы.const functions = require('firebase-functions/v1'); exports.bigben = functions.https.onRequest((req, res) => { const hours = (new Date().getHours() % 12) + 1 // London is UTC + 1hr; res.status(200).send(`<!doctype html> <head> <title>Time</title> </head> <body> ${'BONG '.repeat(hours)} </body> </html>`); });Протестируйте свои функции локально, используя Firebase Local Emulator Suite .
Из корня локального каталога проекта выполните следующую команду:
firebase emulators:start
Доступ к функции осуществляется через локальный URL-адрес, возвращаемый CLI, например:
.http://localhost:5001/ PROJECT_ID /us-central1/bigben
Подробнее о HTTPS-запросах можно узнать в документации Cloud Functions .
На следующем шаге вы узнаете, как получить доступ к этой функции HTTPS из URL-адреса Firebase Hosting чтобы она могла генерировать динамический контент для вашего сайта, размещенного в Firebase.
Шаг 3: Прямые HTTPS-запросы к вашей функции
С помощью правил перезаписи вы можете направлять запросы, соответствующие определённым шаблонам, в один пункт назначения. Следующие шаги показывают, как направить все запросы с пути ../bigben на вашем Hosting сайте для выполнения функции bigben .
Откройте файл
firebase.json.Добавьте следующую конфигурацию
rewriteв разделhosting:"hosting": { // ... // Add the "rewrites" attribute within "hosting" "rewrites": [ { "source": "/bigben", "function": { "functionId": "bigben", "region": "us-central1" // optional (see note below) "pinTag": true // optional (see note below) } } ] }Убедитесь, что перенаправление работает так, как и ожидалось, повторив тестирование с помощью эмуляторов Firebase.
Из корня локального каталога проекта выполните следующую команду:
firebase emulators:start
Перейдите по локально размещенному URL-адресу вашего сайта, возвращаемому CLI (обычно
localhost:5000), но добавьте к URL-адресуbigben, например:http://localhost:5000/bigben
Проведите итерации функции и её функционала для вашего сайта. Используйте эмуляторы Firebase для тестирования этих итераций.
Если
regionне указан вfunctionблоке конфигурацииhosting.rewrites, Firebase CLI попытается автоматически определить регион из исходного кода функции, который, если он не указан, по умолчанию будетus-central1. Если исходный код функции недоступен, CLI попытается определить регион из развёрнутой функции. Если функция находится в нескольких регионах, CLI требует указатьregionв конфигурацииhosting.rewrites.
Функция
pinTagдоступна только в Cloud Functions for Firebase (2-го поколения). С её помощью вы можете гарантировать синхронизацию каждой функции генерации динамического контента вашего сайта со статическими Hosting и конфигурацией Hosting . Кроме того, эта функция позволяет просматривать переписанные функции на каналах предварительного просмотра Hosting .Если добавить
"pinTag": trueв блокfunctionконфигурацииhosting.rewrites, то функция "pinned" будет развернута вместе со статическими ресурсами и конфигурацией Hosting , даже при выполнении. При откате версии сайта функция "pinned" также будет откачена.firebase deploy --only hosting Эта функция использует теги Cloud Run , которые имеют ограничение в 1000 тегов на сервис и 2000 тегов на регион. Это означает, что после сотен развёртываний самые старые версии сайта могут перестать работать.
Для лучшей производительности разместите свои функции на Hosting , выбрав один из следующих регионов:
-
us-west1 -
us-central1 -
us-east1 -
europe-west1 -
asia-east1
Подробнее о правилах перезаписи можно узнать на странице конфигурации Hosting . Вы также можете узнать о приоритете ответов для различных конфигураций Hosting .
Обратите внимание, что для повышения производительности обслуживания динамического контента вы можете дополнительно настроить параметры кэширования .
Шаг 4: Разверните свою функцию
Как только ваша функция заработает в эмуляторе должным образом, вы можете приступить к её развертыванию, тестированию и запуску с использованием ресурсов реального проекта. Сейчас самое время рассмотреть возможность настройки параметров среды выполнения для управления масштабированием функций, работающих в рабочей среде.
Разверните свою функцию, а также содержимое и конфигурацию Hosting на своем сайте, выполнив следующую команду из корня локального каталога проекта:
firebase deploy --only functions,hosting
Доступ к вашему работающему сайту и вашей функции осуществляется по следующим URL-адресам:
Ваши поддомены Firebase:
PROJECT_ID .web.app/bigbenиPROJECT_ID .firebaseapp.com/bigbenЛюбые подключенные пользовательские домены :
CUSTOM_DOMAIN /bigben
Используйте веб-фреймворк
Вы можете использовать веб-фреймворки, такие как Express.js , в Cloud Functions для обслуживания динамического содержимого вашего приложения и упрощения написания сложных веб-приложений.
В следующем разделе представлен пошаговый пример использования Express.js с Firebase Hosting и Cloud Functions .
Установите Express.js в свой локальный проект, выполнив следующую команду из каталога
functions:npm install express --save
Откройте файл
/functions/index.js, затем импортируйте и инициализируйте Express.js:const functions = require('firebase-functions/v1'); const express = require('express'); const app = express();
Добавьте следующие две конечные точки:
Добавьте первую конечную точку для обслуживания индекса нашего веб-сайта в
/.app.get('/', (req, res) => { const date = new Date(); const hours = (date.getHours() % 12) + 1; // London is UTC + 1hr; res.send(` <!doctype html> <head> <title>Time</title> <link rel="stylesheet" href="/style.css"> <script src="/script.js"></script> </head> <body> <p>In London, the clock strikes: <span id="bongs">${'BONG '.repeat(hours)}</span></p> <button onClick="refresh(this)">Refresh</button> </body> </html>`); });И еще одна конечная точка для возврата счетчика
BONGкак API в формате JSON в/api:app.get('/api', (req, res) => { const date = new Date(); const hours = (date.getHours() % 12) + 1; // London is UTC + 1hr; res.json({bongs: 'BONG '.repeat(hours)}); });
Экспортируйте приложение Express.js как функцию HTTPS:
exports.app = functions.https.onRequest(app);
В файле
firebase.jsonнаправьте все запросы к функцииapp. Это изменение позволит Express.js обслуживать другой подпуть, который мы настроили (в этом примере/и/api).{ "hosting": { // ... // Add the "rewrites" attribute within "hosting" "rewrites": [ { "source": "**", "function": "app" } ] } }
Добавить промежуточное программное обеспечение
Продолжая наш пример: теперь, когда вы используете Express.js, вы можете добавить промежуточное ПО Express.js обычным способом. Например, вы можете включить запросы CORS на наших конечных точках.
Установите промежуточное программное обеспечение
cors, выполнив следующую команду:npm install --save cors
Откройте файл
/functions/index.js, затем добавьтеcorsв ваше приложение Express.js, вот так:const cors = require('cors')({origin: true}); app.use(cors);
Дополнительную информацию об использовании Firebase с приложениями Express и модулями промежуточного программного обеспечения можно найти в документации Cloud Functions .
Следующие шаги
Настройте кэширование вашего динамического контента на глобальной CDN.
Взаимодействуйте с другими службами Firebase с помощью Firebase Admin SDK .
Ознакомьтесь с ценами , квотами и ограничениями для Cloud Functions .