我们有一个服务器端 Typescript 项目,它有许多服务,目前通过静态导入导入:
import MyService from './services/MyService';
我们现在需要向服务添加 init()
方法,以便可以在应用启动期间完成服务的任何初始化。因此,我们创建了 services/index.ts
,其内容如下:
const services = [
'Admin', 'KeyCloak', 'User', 'Group'
];
async function initServices () {
for (let i = 0; i < services.length; i++) {
console.log(`Loading and initialising ${services[i]} service`);
const service = await import(`./${services[i]}Service`);
if (!service) {
throw new Error(`Unable to import service ${service[i]}`);
}
const instance = service.default;
if (instance.init) {
await instance.init();
}
}
}
虽然这有效,但任何需要初始化并通过静态导入加载的服务在该上下文中都不会被视为已初始化。进一步检查发现模块被构造了两次,一次通过静态导入,一次通过动态导入。
我们可以通过添加一个函数 getService (name: string)
并使用动态加载的实例来解决这个问题,但是如果有一种方法可以混合静态和动态导入,那么我们很想知道。