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-world
为 node_modules
目录内的 node_modules
中的库保留已编译的资产。它不会将它们复制到 lib
,即使 in_source
在 bs-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 可能是更好的选择。
我有一个使用模块 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-world
为node_modules
目录内的node_modules
中的库保留已编译的资产。它不会将它们复制到lib
,即使in_source
在bs-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 可能是更好的选择。