Совместное использование кода между функциями Firebase и React - PullRequest
0 голосов
/ 26 апреля 2019

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

Первым делом я попробовал ссылку npm. Это работало локально, но функции не развертываются (что имеет смысл, поскольку это не оставляет зависимости в вашем package.json). Затем я попытался установить npm ../shared/ - это выглядело многообещающе, потому что оно оставило зависимость в package.json с префиксом file: - но Firebase все равно не будет развертываться с этим (ошибка ниже).

Структура каталогов моего проекта выглядит следующим образом:

/ProjectDir
  firebase.json
  package.json (for the react app)
  /src
    * (react source files)
  /functions
    package.json (for firebase functions)
    index.js
  /shared
    package.json (for the shared module)
    index.js

Мой общий модуль package.json (лишние детали опущены):

{
  "name": "myshared",
  "scripts": {
  },
  "dependencies": {
  },
  "devDependencies": {
  },
  "engines": {
    "node": "8"
  },
  "private": true,
  "version": "0.0.1"
}

Мои функции firebase package.json (лишние детали опущены):

{
  "name": "functions",
  "scripts": {
  },
  "dependencies": {
    "myshared": "file:../shared",
  },
  "devDependencies": {
  },
  "engines": {
    "node": "8"
  },
  "private": true
}

Когда я пытаюсь выполнить развертывание с помощью:

firebase deploy --only functions

Он говорит, что не может загрузить модуль:

Function failed on loading user code. Error message: Code in file index.js can't be loaded.
Did you list all required modules in the package.json dependencies?

И я не думаю, что проблема в том, как я экспортирую / импортирую свой код, но на всякий случай: Экспорт:

exports.myFunc = () => { some code };

Импорт (functions / index.js)

const myFunc = require('myshared');

И в моем коде реакции:

import { myFunc } from 'myshared';

Пока что поиск, который я провел, не дал ничего, что работает. Кто-то упоминал о введении пути общего модуля в firebase.json, но я не смог найти какие-либо подробности (в том числе и в документации по firebase), которые показывают, как это будет выглядеть. Спасибо за любые советы, чтобы получить это.

1 Ответ

0 голосов
/ 26 апреля 2019

Я нашел решение.Я не уверен, что это единственное или даже лучшее решение, но, похоже, оно подходит для этого сценария и легко.Как отметил Дуг выше, Firebase не хочет загружать что-либо, находящееся не в каталоге функций.Решение состояло в том, чтобы просто сделать мой общий модуль подкаталогом под функциями (т.е. ./functions/shared/index.js).Затем я могу импортировать в мои функции, как обычный файл JS.Однако в моей общей папке также есть package.json для использования в качестве зависимости от приложения реагирования.Я устанавливаю его, используя:

npm install ./functions/shared

Это создает зависимость в моем приложении реакции, которая, кажется, разрешается правильно.Я создал производственную сборку без ошибок.Я еще не развернул приложение реагирования, но не думаю, что это будет проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...