Catch up on highlights from Firebase at Google I/O 2023. Learn more

Организуйте несколько функций


Когда вы интегрируете облачные функции в свой проект, ваш код может расширяться, чтобы содержать множество независимых функций. У вас может быть слишком много функций, чтобы их можно было разумно поместить в один файл, или разные команды могут развертывать разные группы функций, создавая риск того, что одна команда перезапишет или случайно удалит функции другой команды. Cloud Functions предлагает различные способы организации вашего кода, чтобы упростить навигацию и поддержку ваших функций.

Организация функций в кодовых базах

Вы можете использовать свойство codebase объекта конфигурации functions в firebase.json для управления большой коллекцией функций в нескольких репозиториях или подпакетах в рамках настройки монорепозитория с одним репозиторием:

# firebase.json
"functions": {
  "codebase": "my-codebase"
  # NOTE: Codebase must be less than 63 characters and can contain only
  # lowercase letters, numeric characters, underscores, and dashes.
}

Свойство codebase поддерживается в Firebase CLI версии 10.7.1 и выше.

Управление несколькими репозиториями

Свойство codebase может помочь упростить управление несколькими репозиториями. Давайте рассмотрим случай, когда у вас есть два разных репозитория, которые развертывают функции в одном и том же проекте Firebase:

$  tree .
├── repoA
│   ├── firebase.json
│   └── functions
│       ├── index.js
│       └── package.json
└── repoB
    ├── firebase.json
    └── functions
        ├── index.js
        └── package.json

Без аннотаций кодовой базы интерфейс командной строки Firebase предложил бы вам удалить функции, определенные в другом репозитории во время развертывания:

$ (cd repoA && firebase deploy --only functions)
...
i  functions: preparing functions directory for uploading...
✔  functions: functions folder uploaded successfully
The following functions are found in your project but do not exist in your local source code:
        fn1FromRepoB
        fn2FromRepoB
        ...
? Would you like to proceed with deletion? Selecting no will continue the rest of the deployments. (y/N)

Вы можете избежать этой проблемы, добавив уникальную аннотацию базы кода в разделе конфигурации функций firebase.json в каждом репозитории проекта:

# repoA/firebase.json
"functions": {
  "codebase": "repo-a"
}

# repoB/firebase.json
"functions": {
  "codebase": "repo-b"
}

Благодаря аннотации кодовой базы интерфейс командной строки Firebase больше не предлагает вам удалить функции, определенные за пределами вашего непосредственного репозитория:

$ (cd repoA && firebase deploy --only functions)
...
i  functions: preparing functions directory for uploading...
✔  functions: functions folder uploaded successfully
#  Gleefully ignores functions from repoB
i  functions: creating Node.js 16 function fnFromRepoA (us-central1)...
✔  Deploy Complete!

Управление несколькими исходными пакетами (monorepo)

Свойство codebase может помочь упростить управление несколькими исходными пакетами в одном репозитории. Давайте рассмотрим случай, когда у вас есть каталог проекта firebase с определениями функций, распределенными по нескольким подпакетам:

$  tree .
├── firebase.json
├── teamA
│   ├── index.js
│   └── package.json
└── teamB
    ├── index.js
    └── package.json

Эта установка подходит для следующих случаев использования:

  • У вас настроен монорепозиторий , и разные команды управляют своими собственными определениями функций в изолированном пакете.
  • У вас есть функция с сильной внешней зависимостью и длительной инициализацией, и вы хотите изолировать эту функцию от других функций, чувствительных к задержкам.

Чтобы поддерживать такую ​​настройку monrepo, определите несколько конфигураций функций в firebase.json :

"functions": [
  {
    "source": "teamA",
    "codebase": "team-a"
  },
  {
    "source": "teamB",
    "codebase": "team-b"
  },
]

В этой конфигурации интерфейс командной строки Firebase развертывает функции из всех пакетов с помощью одной команды развертывания:

$ firebase deploy --only functions
i  deploying functions
i  functions: preparing codebase team-a for deployment
i  functions: preparing codebase team-b for deployment
i  functions: creating Node.js 16 function team-a:helloATeam(us-central1)...
i  functions: creating Node.js 16 function team-b:helloBTeam(us-central1)...
...

Вы также можете развернуть конкретную кодовую базу:

$ firebase deploy --only functions:team-b
i  deploying functions
i  functions: preparing codebase team-b for deployment
i  functions: updating Node.js 16 function team-b:helloBTeam(us-central1)...
...

Запись функций в несколько файлов

Приступая к работе с Cloud Functions, вы можете поместить свои первые несколько функций в один файл:

index.js


const functions = require('firebase-functions');
exports.foo = functions.https.onRequest((request, response) => {
  // ...
});
exports.bar = functions.https.onRequest((request, response) => {
  // ...
});

Это может стать трудным для управления более чем несколькими функциями. Вместо этого вы можете поместить всю свою логику для каждой функции в отдельный файл и использовать файл index.js как простой список экспорта:

foo.js


const functions = require('firebase-functions');
exports.foo = functions.https.onRequest((request, response) => {
  // ...
});

bar.js


const functions = require('firebase-functions');
exports.bar = functions.https.onRequest((request, response) => {
  // ...
});

index.js


const foo = require('./foo');
const bar = require('./bar');
exports.foo = foo.foo;
exports.bar = bar.bar;

Групповые функции

Во многих проектах функции могут быть разделены на логические группы, которые следует развертывать и поддерживать вместе. Например, у вас может быть группа функций, используемых для создания отчетов:

metrics.js


const functions = require('firebase-functions');
exports.usageStats = functions.https.onRequest((request, response) => {
  // ...
});
exports.nightlyReport = functions.https.onRequest((request, response) => {
  // ...
});

Вы можете поместить эти функции в группу при их экспорте в файл index.js :

index.js


// Export both functions from metrics.js in the "metrics" group:
//  - metrics-usageStats
//  - metrics-nightlyReport
exports.metrics = require('./metrics');

При развертывании функции будут иметь префикс имени своей группы, поэтому в этом примере функции будут называться metrics-usageStats и metrics-nightlyReport .

При развертывании функций вы можете ограничить действие одной группой:


firebase deploy --only functions:metrics

Следующие шаги

Чтобы узнать больше об облачных функциях, см.: