Используйте 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-адрес, возвращаемый интерфейсом командной строки, например:
.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
Используйте веб-фреймворк
В Cloud Functions можно использовать веб-фреймворки, такие как Express.js , для обслуживания динамического контента вашего приложения и упрощения разработки сложных веб-приложений.
В следующем разделе представлен пошаговый пример использования 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в формате JSON через API, доступный по адресу/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 .