Объедините 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 .