我正在阅读 这个关于延迟加载的 NestJS 文档
我正在尝试在无服务器环境中使用nestjs之外的nestjs模块。人们这样做的文档参考。
下面的代码用于获取 AppService 以及注入的所有依赖项
"use server";
import { NestFactory } from "@nestjs/core";
import { AppModule } from "@api/app.module";
import { AppService } from "@api/app.service";
export async function getHelloAction() {
const app = await NestFactory.create(AppModule);
const appService = app.get(AppService);
const result = appService.getHello();
await app.close();
return result;
}
我的理解是,当我调用 NestFactory.create() 时,所有模块都会默认实例化。
因此,即使我的 Module 类有很多额外的模块,我也想仅在需要时才懒惰地解析模块。
根据文档,我似乎需要编写如下代码:
"use server";
import { AppModule } from "@api/app.module";
import { NestFactory } from "@nestjs/core";
import { LazyModuleLoader } from "@nestjs/core";
export async function getLazyHelloAction() {
const app = await NestFactory.create(AppModule);
// At this point, AppModule and all its dependencies are instantiated
const lazyModuleLoader = app.get(LazyModuleLoader);
// Later, when you need to load an additional module
const { AppService } = await import('@api/app.service');
const moduleRef = await lazyModuleLoader.load(() => AppService);
const appService = moduleRef.get(AppService);
// Now LazyModule is loaded and its providers are available
const result = appService.getHello();
return result;
}
上面的方法有效,但我收到此错误
⨯ Error: Classes annotated with @Injectable(), @Catch(), and @Controller() decorators must not appear in the "imports" array of a module.
Please remove "AppService" (including forwarded occurrences, if any) from all of the "imports" arrays.
Scope []
at async getLazyHelloAction (./src/app/lazy-action.ts:23:23)
更重要的是,我不明白这个延迟加载模块是如何实现的。如果我们进一步澄清术语,称之为“注册”模块和“解析”模块,那么这里的延迟加载是什么意思?
在上面的延迟加载代码中,我仍在调用 NestFactory.create(),因此我假设所有模块都已实例化。所以模块大的话启动时间会很长
在这种情况下,lazilyLoading 是否意味着 AppService 不在 AppModule 内部,并且在需要时延迟/手动注册?就“lazyLoad”这个术语而言,这似乎有点违反直觉,并且对我来说没有什么用处。
如何导入模块并仅在需要时才实例化它们,就像在典型的 di 容器中一样?
所以我意识到延迟加载意味着
registering
和resolving
。下面的代码用于延迟加载模块并使用模块内的服务。之前我懒惰地加载服务导致了错误。
延迟加载
"use server";
import { AppModule } from "@api/app.module";
import { NestFactory } from "@nestjs/core";
import { LazyModuleLoader } from "@nestjs/core";
export async function getLazyHelloAction() {
// AppModule should have minimal stuff in it
const app = await NestFactory.create(AppModule);
const lazyModuleLoader = app.get(LazyModuleLoader);
const { LazyModule } = await import("@api/lazy/lazy.module");
const { LazyService } = await import("@api/lazy/lazy.service");
const moduleRef = await lazyModuleLoader.load(() => LazyModule);
const lazyService = moduleRef.get(LazyService);
const result = lazyService.getLazyHello();
return result;
}
// lazy.module
import { Logger, Module } from '@nestjs/common';
import { LazyService } from './lazy.service';
@Module({
providers: [LazyService, Logger],
exports: [LazyService],
})
export class LazyModule {}
// lazy.service
import { Injectable, Logger } from '@nestjs/common';
@Injectable()
export class LazyService {
constructor(private readonly logger: Logger) {}
getLazyHello(): string {
const message = 'Lazy Hello World!';
this.logger.log(message);
return message;
}
}