在Firebase Functions和React之间共享代码

时间:2019-04-26 05:53:25

标签: node.js reactjs firebase google-cloud-functions

我正在将Firebase函数与React应用程序一起使用。我有一些我不想重复的简单代码,所以我想在部署的函数和我的React客户端之间共享它们。我已经在我的React客户端中本地工作了(尽管我还没有尝试部署)-但是我无法部署我的功能。

我尝试的第一件事是npm链接。这在本地有效,但是功能无法部署(这很有意义,因为这在package.json中没有依赖项)。然后我尝试了npm install ../shared/-这看起来很有希望,因为它确实在package.json中保留了一个文件前缀:依赖-但是​​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文档中)来显示外观。感谢您提供帮助进行此操作的任何提示。

2 个答案:

答案 0 :(得分:0)

我找到了解决方案。我不确定这是唯一的还是最好的解决方案,但它似乎适用于这种情况,并且很简单。正如Doug上面指出的那样,Firebase不想上传不在functions目录中的任何内容。解决方案是简单地使我的共享模块成为函数(即./functions/shared/index.js)下的子目录。然后,我可以像普通的js文件一样导入我的函数中。但是,我的共享文件夹还具有package.json,用作对react应用程序的依赖。我使用以下方法安装它:

npm install ./functions/shared

这会在我的应用程序中创建一个依赖关系,似乎可以正确解决。我创建了没有错误的生产版本。我尚未部署react应用,但我认为这不会成为问题。

答案 1 :(得分:0)

另一种解决方案是创建符号链接。在终端的/ ProjectDir下,执行:

ln -s shared functions/shared
cd functions
npm i ./shared