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

Firebase deploy failed because javascript file inside of node module cannot be found

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

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

我肯定已经将 bs-express 依赖项添加到我的 functions 文件夹的 里面 package.json 文件中,并且我已经验证手动确认该文件存在于我的开发箱中。

当我使用命令 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 文件夹中存在的内容?

事情是这样的:

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

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

可能的解决方案:

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