Поскольку Nrwl выпустил поддержку узловых приложений, я с нетерпением ждал аналогичной поддержки функций Firebase. Я даже создал для этого выпуск на GitHub. На момент написания он все еще открыт, поэтому я решил создать собственное решение.
Эта проблема
Когда вы инициализируете функции Firebase с помощьюfirebase init
, он создает подкаталог функций со своими собственными package.json
и node_modules
. Это не хорошо. Мы хотим поделиться кодом с функциями и управлять им с помощью Nx.
Цель
- Функции Firebase существуют как приложение узла
- Есть только по одному
package.json
иnode_modules
- Функции могут использовать общий код from
libs
Предпосылки
Мы предполагаем, что у вас есть рабочий проект 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. Исходный код для этого можно найти здесь. Однако он активно развивается, поэтому, если вы хотите просмотреть ДАННУЮ версию, проверьте этот коммит.