CJS
exports['foo-bar'] = {} // -> OK
ESM-
exports['foo-bar'] = {}; // -> NG
export['foo-bar'] = {}; // -> NG
export { 'foo-bar': {} }; // -> NG
export { fooBar as foo-bar }; // -> NG
export { fooBar as 'foo-bar' }; // -> NG
通常我不会这么做,所以这不是问题,但我遇到了麻烦,因为Firebase Functions v2只允许在名称中使用小写字母、数字和连字符,并要求我导出它。
抛弃typescript获得后我发现了什么
export { endpoint as "my-dashed-endpoint-name" }
我发现firebase仍然不让我调用my-dashed-endpoint-name
,给了我错误Failed to find function my.dashed.endpoint.name in the loaded module
。。嗯
所以firebase实际上希望你做的是导出一个对象,它会将名称变成对象路径的虚线版本!
因此,要获得一个名为my-dashed-endpoint-name
的函数,必须执行
export let my = {
dashed: {
endpoint: {
name: onCall(...),
}
}
}
不是最符合人体工程学的。。。但当使用时,它确实更有意义
export * as post from "./post-endpoints.js"
其将用post-
(例如post-delete
、post-add
(作为来自post-endpoints.js
的所有导出的前缀
没有比这更简单的方法了,这对我来说太疯狂了。尽管如此,扩展Michiel的答案以使其更可重复使用:
import { CallableFunction } from "firebase-functions/v2/https";
function exportFn<T = any, Return = any | Promise<any>>(
name: string,
func: CallableFunction<T, Return>
) {
const words = name.split("-");
let target = exports;
for (let i = 0; i < words.length - 1; i++) {
if (!target[words[i]]) {
target[words[i]] = {};
}
target = target[words[i]];
}
target[words[words.length - 1]] = func;
}
然后你可以称之为
exportFn("my-firebase-function", myFirebaseFunction);