Si vous utilisez l'option --build-optimizer
, le chargeur @angular-devkit/build-optimizer/webpack-loader
est ajouté à la liste des chargeurs Webpack.
@angular-devkit/build-optimizer/webpack-loader
supprime ctorParameters
définitions de types qui ne font pas partie de platformWhitelist
(source):
const platformWhitelist = [
'PlatformRef_',
'TestabilityRegistry',
'Console',
'BrowserPlatformLocation',
];
Je pense que ce comportement correct.
Pour travailler autour d'elle, vous pouvez initialiser ctorParameters
manuellement avant JitCompilerFactory
is created:
import {
Compiler, ɵConsole as Console,
Optional, Inject, Injector,
PACKAGE_ROOT_URL
} from '@angular/core';
import {
JitCompilerFactory,
TemplateParser, CompilerConfig, CompileReflector,
ElementSchemaRegistry, I18NHtmlParser, TEMPLATE_TRANSFORMS, DirectiveNormalizer,
ResourceLoader, UrlResolver, HtmlParser, CompileMetadataResolver, NgModuleResolver,
DirectiveResolver, SummaryResolver, PipeResolver, StaticSymbolCache,
ERROR_COLLECTOR_TOKEN,
StyleCompiler, ViewCompiler, NgModuleCompiler, JitCompiler
} from '@angular/compiler';
import * as compiler from '@angular/compiler';
export function compilerFactory() {
restoreDecorators();
return new JitCompilerFactory([{ useDebug: false, useJit: true }]).createCompiler();
}
function restoreDecorators() {
(compiler.Parser as any).parameters = [compiler.Lexer];
(TemplateParser as any).parameters = [
CompilerConfig, CompileReflector, compiler.Parser, ElementSchemaRegistry,
I18NHtmlParser, Console, [new Optional(), new Inject(TEMPLATE_TRANSFORMS)]
];
(DirectiveNormalizer as any).parameters = [
ResourceLoader, UrlResolver,
HtmlParser, CompilerConfig
];
(CompileMetadataResolver as any).parameters = [
CompilerConfig, NgModuleResolver, DirectiveResolver, PipeResolver, SummaryResolver,
ElementSchemaRegistry,
DirectiveNormalizer, Console,
[new Optional(), StaticSymbolCache],
CompileReflector,
[new Optional(), new Inject(ERROR_COLLECTOR_TOKEN)]
];
(StyleCompiler as any).parameters = [UrlResolver];
(ViewCompiler as any).parameters = [CompileReflector];
(NgModuleCompiler as any).parameters = [CompileReflector];
(NgModuleResolver as any).parameters = [CompileReflector];
(DirectiveResolver as any).parameters = [CompileReflector];
(PipeResolver as any).parameters = [CompileReflector];
(JitCompiler as any).parameters = [
Injector,
CompileMetadataResolver,
TemplateParser,
StyleCompiler,
ViewCompiler,
NgModuleCompiler,
SummaryResolver,
CompilerConfig,
Console
];
(UrlResolver as any).parameters = [[new Inject(PACKAGE_ROOT_URL)]];
}
Et il semble risqué que compilateur est soumis à des changements internes. Cela fonctionne pour @angular/[email protected]
mais peut ne pas fonctionner pour d'autres versions.
Je ne sais pas ce que 'ctorParameters' ne sont que du contexte que je rassemble, c'est la façon dont DI sait ce qu'il faut injecter aux constructeurs de service (et ect). Cela pourrait-il être aussi simple que d'ajouter 'Compiler' à' platformWhitelist' si vous avez forké https://github.com/angular/devkit ou fait une demande de fonctionnalité? –
Nous ne devrions pas le faire. – yurzui