Поскольку Nrwl выпустил поддержку узловых приложений, я с нетерпением ждал аналогичной поддержки функций Firebase. Я даже создал для этого выпуск на GitHub. На момент написания он все еще открыт, поэтому я решил создать собственное решение.

Эта проблема

Когда вы инициализируете функции Firebase с помощьюfirebase init, он создает подкаталог функций со своими собственными package.json и node_modules. Это не хорошо. Мы хотим поделиться кодом с функциями и управлять им с помощью Nx.

Цель

  • Функции Firebase существуют как приложение узла
  • Есть только по одному package.json и node_modules
  • Функции могут использовать общий код fromlibs

Предпосылки

Мы предполагаем, что у вас есть рабочий проект Nrwl с приложением Angular. Также рекомендуется иметь учетную запись Firebase и понимать, что такое функции Firebase.

Решение

Настроить Firebase

Если вы еще этого не сделали, установите firebase-tools и войдите в систему:

yarn global add firebase-tools
firebase login

Также добавьте .firebaserc в корневой каталог, чтобы сделать его проектом Firebase:

{
  "projects": {
    "default": "your-firebase-project-name"
  }
}

Создать приложение-узел

Как указано в цели, функции должны быть основаны на node-app. Для этого создайте node-app с именем «функции»:

ng add @nrwl/node # Adds Node capabilities
ng g @nrwl/node:application functions

Настроить функции Firebase

Установить зависимости Firebase Functions

yarn add firebase firebase-admin firebase-functions

Заменить содержимое apps/functions/src/main.ts на:

import * as functions from 'firebase-functions';

// // Start writing Firebase Functions
// // https://firebase.google.com/docs/functions/typescript
//
export const helloWorld = functions.https.onRequest((request, response) => {
  response.send('Hello from Firebase!');
});

В приведенном выше фрагменте показано, что Firebase генерирует при использовании firebase init.

Чтобы настроить функции Firebase так, чтобы они были понятны, создайте firebase.json в корневом каталоге:

{
  "functions": {
    "predeploy": [
      "yarn lint functions",
      "yarn build functions --prod"
    ],
    "source": "/"
  }
}
  • predeploy просто определяет, что запускается, когда вы вводите команду firebase deploy --only functions. В этом случае он будет запускать линтер и производственную сборку для нашего «функционального» проекта.
  • source указывает на корень проекта. Поскольку у нас есть только один package.json, и он находится в корневом каталоге, он должен указывать туда.

В package.json добавить следующее:

"main": "dist/apps/functions/main.js",
"engines": {
  "node": "10"
},
  • main требуется, чтобы Firebase знала, что начать после развертывания. Я создал запрос функции, чтобы переместить его в firebase.json, но на момент написания он должен быть там.
  • engine сообщает Firebase, на какой версии узла он должен быть запущен. На момент написания node v10 - это самая новая поддерживаемая версия. Также вы НЕ МОЖЕТЕ указать здесь версию yarn или npm, потому что она будет конфликтовать с firebase.

использование

Обслуживание функций Firebase немного сложнее, чем типичное приложение узла. Добавьте эту зависимость от разработчика:

yarn add concurrently -D

И эти скрипты для package.json:

"firebase:serve": "concurrently --kill-others \"yarn run build functions --watch\" \"firebase serve --only functions\"",
"firebase:shell": "concurrently --kill-others \"yarn run build functions --watch\" \"firebase functions:shell\" --raw",
"firebase:deploy": "firebase deploy",
  • yarn firebase:serve - запускать функции локально
  • yarn firebase:shell - запускать оболочку функций локально
  • yarn firebase:deploy --only functions - функции развертывания

Объяснение

На момент написания firebase serve обслуживает функции только из каталога dist. Чтобы заставить его работать, мы используем concurrently для запуска build с флагом watch и serve «одновременно».

Резюме

Это в значительной степени покрывает это. Простой и элегантный способ включить функции Firebase в проект Nx. Исходный код для этого можно найти здесь. Однако он активно развивается, поэтому, если вы хотите просмотреть ДАННУЮ версию, проверьте этот коммит.