Firebase部署失败,因为无法找到节点模块内的javascript文件

时间:2018-03-13 20:54:38

标签: firebase google-cloud-functions bucklescript

我有一个使用模块https://www.npmjs.com/package/bs-express的项目(用Reason编写,但编译为JS)。编译代码时,该模块的require语句如下所示:

var Express = require("bs-express/src/Express.js");

我确实已将bs-express依赖项添加到package.json文件夹中的functions文件,并且我已通过请将文件存在于我的开发箱中。

当我使用命令firebase deploy时,使用该文件的任何函数的部署都会失败,并显示以下错误:

Function load error: Code in file index.js can't be loaded.
Did you list all required modules in the package.json dependencies?
Detailed stack trace: Error: Cannot find module 'bs-express/src/Express.js'
    at Function.Module._resolveFilename (module.js:469:15)
    at Function.Module._load (module.js:417:25)
    at Module.require (module.js:497:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (/user_code/src/Endpoints.bs.js:10:15)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)

但是,就像我之前说的那样,我的开发者工具箱上的firebase serve --only functions工作得很好。

firebase --version: 3.17.4

Mac OS 10.13.3

有没有办法让shell访问或部署容器上的东西,以便我可以看到node_modules文件夹中存在什么?

1 个答案:

答案 0 :(得分:1)

以下是发生的事情:

  • bs-express仅在其NPM包中包含.re个文件,而不包括已编译的js工件。
  • firebase deploy在容器上执行了新的npm install,它不会从开发计算机复制node_modules文件夹。
  • bsb -make-worldnode_modules目录内的node_modules中的库保留已编译资产。即使在lib
  • 中禁用了in_source,它也不会将其复制到bs-config.json

这就是编译后的JS文件在运行时丢失的原因。

可能的解决方案:

  • 在容器上运行bsb并在postInstall npm挂钩中编译代码。 (但这不起作用,因为bsb很大并且超出了容器的200MB的数据大小限制。在部署期间安装依赖项需要花费很多时间。
  • 在部署(Webpack或Rollup)之前,将一些捆绑步骤添加到javascript代码中。目前,Bucklescript编译器的工作方式与Rollup的标准(https://github.com/BuckleScript/bucklescript/issues/2456#issuecomment-372900255)存在一些冲突,因此Webpack可能是更好的选择。