Angular-cli tree-shaking exclude component from removal에 대한 질문은 매우 유사하다고 생각되지만 그 중 아무 것도 얻을 수없는 것으로 보입니다.동적으로 생성 된 NgModule을 제거하는 Angular2 (CLI) 트리
기본적으로 나는 How can I use/create dynamic template to compile dynamic Component with Angular 2.0?에서 설명한 동적 구성 요소 팩토리를 가지고 있습니다.
비 생산 설정으로 최신 Angular CLI를 사용하여 빌드하면 모든 것이 올바르게 작동합니다.
@Injectable()
export class DynamicTypeBuilder {
constructor() {
}
private _cacheOfFactories: {[templateKey: string]: ComponentFactory<any>} = {};
private compiler: Compiler = new JitCompilerFactory([{useDebug: false, useJit: true}]).createCompiler();
public createComponentFactory<COMPONENT_TYPE>(type: any, template: string, additionalModules: any[] = []): Observable<ComponentFactory<COMPONENT_TYPE>> {
let factory = this._cacheOfFactories[template];
if (factory) {
return Observable.of(factory);
}
// unknown template ... let's create a Type for it
let module = this.createComponentModule(type, additionalModules);
// compiles and adds the created factory to the cache
return Observable.of(this.compiler.compileModuleAndAllComponentsSync(module))
.map((moduleWithFactories: ModuleWithComponentFactories<COMPONENT_TYPE>) => {
factory = moduleWithFactories.componentFactories.find(value => value.componentType == type);
this._cacheOfFactories[template] = factory;
return factory;
});
}
protected createComponentModule(componentType: any, additionalModules: any[]): Type<any> {
@NgModule({
imports: [
FormsModule,
ReactiveFormsModule,
BrowserModule,
PipesModule,
...additionalModules
],
declarations: [
componentType
],
schemas:[CUSTOM_ELEMENTS_SCHEMA]
})
class RuntimeComponentModule {
}
return RuntimeComponentModule;
}
}
: 여기
내 부품 공장 클래스입니다 : 내가 생산 설정을 사용하면 동적으로 컨텐츠 생성 한 페이지를로드 할 때, 나는 즉시 브라우저에서 다음과 같은 오류 추적을 얻을EXCEPTION: No NgModule metadata found for 'e'.
ORIGINAL STACKTRACE:
main.dc05ae9….bundle.js:formatted:4731
Error: No NgModule metadata found for 'e'.
at f (vendor.c18e6df….bundle.js:formatted:76051)
at t.resolve (vendor.c18e6df….bundle.js:formatted:20624)
at t.getNgModuleMetadata (vendor.c18e6df….bundle.js:formatted:20169)
at t._loadModules (vendor.c18e6df….bundle.js:formatted:40474)
at t._compileModuleAndAllComponents (vendor.c18e6df….bundle.js:formatted:40462)
at t.compileModuleAndAllComponentsSync (vendor.c18e6df….bundle.js:formatted:40436)
at e.createComponentFactory (main.dc05ae9….bundle.js:formatted:4789)
var _ = function() {
function e() {
this._cacheOfFactories = {},
this.compiler = new i.a([{
useDebug: !1,
useJit: !0
}]).createCompiler()
}
return e.prototype.createComponentFactory = function(e, t, n) {
var i = this;
var _ = this._cacheOfFactories[t];
if (_)
r.Observable.of(_);
var a = this.createComponentModule(e, n);
return r.Observable.of(this.compiler.compileModuleAndAllComponentsSync(a)).map(function(n) {
return _ = n.componentFactories.find(function(t) {
return t.componentType == e
}),
i._cacheOfFactories[t] = _,
_
})
}
,
e.prototype.createComponentModule = function(e, t) {
var n = function() {
function e() {}
return e
}();
return n
}
,
e.ctorParameters = function() {
return []
}
,
e
}()
오류 메시지의 '예'로되고 transpiled
는 createComponentModule
WHI에서 함수이다 e()
ch는 (볼 수 있듯이) @NgModule
콘텐츠가 포함되어 있어도 비어 있습니다.
어떻게 새로운 NgModule을 동적으로 생성하고 Angular CLI의 생산 모드를 사용할 수 있습니까?
버전 :
Angular2 : 2.4.8
각도 CLI : 1.0.0-beta.32.3
타이프 : 2.1.6
제대로 작동하지 않을 까봐 걱정됩니다. 코드가 잘 컴파일되고 이동 된 JS에 포함되어 있지만 이제는 새로운 문제가 있습니다. Angular는 새'NgModule'에서 가져온 사용자 정의 모듈을 찾을 수 없습니다. 그래서 위의 예제에서'FormsModule','ReactiveFormsModule'과'BrowserModule'을 찾을 수 있습니다 만,'PipesModule'은 찾을 수 없습니다. 오류는'CompileMetadataResolver.getNgModuleMetadata'에 있습니다. – Sebastian
실제로 동일한 문제가 발생합니다. JIT 컴파일에서 데코레이터를 전혀 컴파일하지 않는 것 같습니다. 뿐만 아니라'RuntimeComponentModule'. 컴파일 된'main.js'를 읽었을 때'PipesModule'에 대한 메타 데이터를 포함하고 있지 않습니다. 나는이 시간에 계속할 것이다. 각도 모듈이 괜찮다는 것을 알려준 Thx. –
지금 당장 jit + aot를 사용하고 있습니다. v4에서 –