2017-10-13 5 views
2

Je suis la solution here d'utiliser le JitCompilerFactory pour charger le compilateur d'exécution et les décorateurs personnalisés pour préserver les métadonnées des composants et des modules. Mais avec le angulaire cli --build-optimizer drapeau Je reçois:AOT et JIT avec build-optimizer

ERROR Error: Cannot resolve all parameters for 'Parser'(?). Make sure that all the parameters are decorated with Inject or have valid type annotations and that 'Parser' is decorated with Injectable.

Here est ma reproduction minimale, lancez ng serve --aot --build-optimizer. Comme un contrôle ng serve --aot fonctionne.

Répondre

0

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 JitCompilerFactoryis 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.

+0

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é? –

+0

Nous ne devrions pas le faire. – yurzui