我简化的服务器代码如下所示。
server.ts
import google from "googleapis";
const androidPublisher = google.androidpublisher("v3");
app.use('something', function(req, res, n){
...
})
...(only one of the dozens of other methods use androidPublisher)为了设置androidpublisher变量,我正在导入googleapis库。但是,这个googleapis库很大,完全导入文件需要400ms~700ms,而导入其他库文件需要10ms~30ms。
因为我的环境是无服务器架构(firebase函数),并且大约每100个请求中就有一个实际需要androidPublisher,所以我希望在需要时利用动态导入来导入googleapis。否则,上面的设置实际上会增加400ms/700ms的延迟,即使在不需要androidPublisher的情况下,每个请求也会产生新的无服务器实例。
所以我做了如下修改。
server.ts
let androidPublisherInstance:any;
async function getAndroidPublisher() {
const googleapis = await import("googleapis");
if (androidPublisherInstance === undefined) {
const ap = googleapis.google.androidpublisher("v3");
androidPublisherInstance = ap;
}
return androidPublisherInstance;
}
...(one of methods use getAndroidPublisher() to get androidPublisher instance)在上面的设置中,我使用全局变量和助手函数仅在需要时初始化androidPublisher。这可以正常工作,当第一次需要androidPublisher时,会增加400ms~700ms的延迟。但是,我最终将androidPublisherInstance类型设置为any。我无法正确定义类型,因为类型定义在googleapis中可用,而它驻留在getAndroidPublisher函数中。
因此,我失去了使用typescript的所有好处,当我使用androidPublisherInstance时,我不得不在使用方法/属性时玩猜谜游戏。
而且我认为必须使用全局变量,因为我不想在函数调用getAndroidPublisher()时多次初始化androidPublisher (googleapis.google.androidpublisher("v3")
我是不是遗漏了什么?有没有一种方法可以使用动态导入&让客户端只初始化一次,而不需要使用全局变量?
发布于 2020-01-13 03:46:40
您可以只导入类型。只要您只在类型定义中使用它,而不是在值表达式中使用它,编译后的JavaScript就永远不会加载模块:
import { androidpublisher_v3 } from "googleapis";
let androidpublisher: androidpublisher_v3 | undefined;或者,为了确保您不会意外地在错误的位置引用它,请仅使用import types
let androidpublisher: import("googleapis").androidpublisher_v3 | undefined;https://stackoverflow.com/questions/59706951
复制相似问题