如何在ESM中导出用连字符命名的变量



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-deletepost-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);

相关内容

  • 没有找到相关文章

最新更新