2

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

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

我确实已将bs-express依赖项添加到我的文件夹内的package.json文件functions,并且我已经手动验证了该文件是否存在于我的开发盒中。

当我使用 commandfirebase 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

有没有办法获得外壳访问权限或正在部署的容器上的某些内容,以便我可以看到 node_modules 文件夹中存在的内容?

4

1 回答 1

1

这是发生的事情:

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

这就是运行时缺少编译好的 JS 文件的原因。

可能的解决方案:

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