У меня есть приложение Angular 8, и оно хорошо работает в режиме разработки, но если я выполняю 'ng serve --prod', оно компилируется без ошибок, но при запуске приложения я получаю эту ошибку в консоли:
Ошибка: «Uncaught (в обещании): TypeError: токен не определен getOrCreateInjectable / bloomHa sh <@ <a href="http://localhost:4200/main.cf6fe5006f05f980ad3b.js:1:249524" rel="nofollow noreferrer">http://localhost: 4200 / main.cf6fe5006f05f980ad3b. js: 1: 249524 getOrCreateInjectable @ http://localhost: 4200 / main.cf6fe5006f05f980ad3b. js: 1: 249614 get @ http://localhost: 4200 / main.cf6fe5006f05f980ad3b. js: 1: 254632 PlayerComponent @ http://localhost: 4200 / main.cf6fe5006f05f980ad3b. js: 1: 726594 factory @ http://localhost: 4200 / main.cf6fe5006f05f980ad3b. js: 1: 728189 getNodeInjectable @ http://localhost: 4200 / main.cf6fe5006f05f980ad3b. js: 1: 253710 ...
У вас есть представление о том, как определить, что идет не так? ошибка, у меня вызван PlayerComponent, но в
import { Game, IsoScene } from 'src/app/tars/classes';
import { NavigatorService } from 'src/app/tars/services';
import { DataProvider, ElementProvider } from 'src/app/tars/providers';
import { ElementProvider as POCElementProvider } from 'src/app/services/element.provider';
import { IsoPlayerScene } from 'src/app/classes/scenes/iso';
import { InteractionsMenu } from 'src/app/interfaces';
import { DataProviderFactory } from 'src/app/services/dataProviders/factory.service';
import { OnReadyRenderer2DEvent, Interaction } from 'src/app/tars/interfaces';
import { TitleScene } from 'src/app/classes/scenes/title';
@Component({
selector: 'tars-player',
templateUrl: './player.component.html',
styleUrls: ['./player.component.scss']
})
export class PlayerComponent {
private rendererW: number;
private rendererH: number;
public get rendererHeight(): number {
return this.rendererH;
}
public get rendererWidth(): number {
return this.rendererW;
}
private game: Game;
private navigatorService: NavigatorService;
private dataProvider: DataProvider;
private elementProvider: ElementProvider;
private isoPlayer: IsoPlayerScene;
public menuStructure: InteractionsMenu;
constructor(
private injector: Injector,
private ngZone: NgZone
) {
this.navigatorService = injector.get(NavigatorService);
this.dataProvider = injector.get(DataProvider);
this.dataProvider.set(injector.get(DataProviderFactory.factory()));
this.elementProvider = injector.get(ElementProvider);
this.elementProvider.set(injector.get(POCElementProvider));
this.resetInteractionsMenu();
}
rendererOnReady(event: OnReadyRenderer2DEvent) {
// Create the game object
this.game = new Game(this.injector, event.context);
this.game.onLoaded.subscribe((res: boolean) => {
// Ask current client size
this.refreshClientSize();
// Run the game (when ready inside)
this.ngZone.runOutsideAngular(() => this.game.run());
});
// Specific link
this.isoPlayer = new IsoPlayerScene(this.injector, {name: 'world'}, event.context);
this.isoPlayer.onInteractionsMenu.subscribe((structure: InteractionsMenu) => {
this.ngZone.run(() => {
if (structure) {
this.menuStructure = structure;
} else {
this.resetInteractionsMenu();
}
});
});
this.game.load([
this.isoPlayer,
new TitleScene(this.injector, {name: 'title'}, event.context),
new IsoScene(this.injector, {name: 'loader'}, event.context),
], 'title', 'loader');
}
// Listen the window resize event
@HostListener('window:resize', ['$event'])
onResize(event: any) {
this.refreshClientSize();
this.resetInteractionsMenu();
}
// Get the window/body size to set the graph size
public refreshClientSize() {
const browserSize = this.navigatorService.getClientSizeFromBrowser();
this.rendererW = browserSize.width;
this.rendererH = browserSize.height;
this.navigatorService.setClientSize(browserSize.width, browserSize.height);
}
// Keyboard management
@HostListener('window:keydown', ['$event'])
onKeyPress(event: any) {
this.navigatorService.keyDown(event);
}
private resetInteractionsMenu() {
this.menuStructure = {
interactions: [],
screenCoord: { screenX: 0, screenY: 0 }
};
}
// Do interaction when menu selection is done and reset menu
menuOnSelect(interaction: Interaction) {
this.isoPlayer.doInteraction(interaction);
this.resetInteractionsMenu();
}
}
нет ничего особенного * Как я уже сказал, он работает в dev и я не понимаю почему --prod дает этот результат.
РЕДАКТИРОВАТЬ:
Кажется, что это строка this.dataProvider.set(injector.get(DataProviderFactory.factory()));
о заводе с кодом ниже, который разрывается на --prod
@Injectable()
export class DataProviderFactory {
public static factory() {
if (environment.dataOrigin === DataOrigin.Fake) {
return Faker;
} else {
// ...
}
}
}
Если я заменю DataProviderFactory.factory()
на Faker напрямую, это сработает. Я читал о какой-то проблеме с Ivy и creatInjector, но, кажется, не работает.
Есть идеи?