2017-10-13 70 views
2

我正在關注使用JitCompilerFactory加載運行時編譯器和自定義裝飾器以保留組件和模塊元數據的解決方案here。但隨着角CLI --build-optimizer標誌,我得到:使用構建優化器的AOT和JIT

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是我最小的再現,運行ng serve --aot --build-optimizer。作爲控件ng serve --aot的作品。

回答

0

如果使用選項--build-optimizer,則會將@angular-devkit/build-optimizer/webpack-loader加載程序添加到webpack加載程序列表中。

@angular-devkit/build-optimizer/webpack-loader去除類型不是platformWhitelistsource)部分ctorParameters定義:

const platformWhitelist = [ 
    'PlatformRef_', 
    'TestabilityRegistry', 
    'Console', 
    'BrowserPlatformLocation', 
]; 

我認爲這是正確的行爲。

要解決它,你可以ctorParameters之前手動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)]]; 
} 

而且它似乎是有風險的編譯器是受到內部變化。它適用於@angular/[email protected],但可能無法用於其他版本。

+0

我不知道'ctorParameters'是從上下文中我收集到的,它是如何知道如何注入服務的(和ect)構造函數。如果分叉https://github.com/angular/devkit或發出了功能請求,是否可以像在'platformWhitelist'中添加'Compiler'一樣簡單? –

+0

我們不應該這樣做。 – yurzui