2017-03-01 9 views
11

को हटाते हुए पेड़ हिलाते हुए मुझे लगता है कि Angular-cli tree-shaking exclude component from removal पर सवाल बहुत समान है लेकिन मुझे इससे कुछ भी नहीं मिल रहा है।एंगुलर 2 (सीएलआई) वृक्ष गतिशील रूप से बनाए गए NgModule

अनिवार्य रूप से मेरे पास How can I use/create dynamic template to compile dynamic Component with Angular 2.0? में वर्णित एक गतिशील घटक कारखाना है।

जब मैं इसे गैर-उत्पादन सेटिंग के साथ नवीनतम कोणीय सीएलआई का उपयोग करके बनाता हूं, तो यह सब ठीक काम करता है।

@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 कैसे बना सकता हूं और अभी भी कोणीय सीएलआई के उत्पादन मोड का उपयोग कर सकता हूं?

संस्करण:
Angular2: 2.4.8
कोणीय CLI: 1.0.0-beta.32.3
टाइपप्रति: 2.1.6

उत्तर

0

मैं एक ही त्रुटि संदेश है। मैंने पाया कि कामकाज रनटाइम मॉड्यूल के लिए सजावट का उपयोग नहीं है।

protected createComponentModule(componentType: any, additionalModules: any[]): Type<any> { 
    return NgModule({ 
    imports: [ 
     FormsModule, 
     ReactiveFormsModule, 
     BrowserModule, 
     PipesModule, 
     ...additionalModules 
    ], 
    declarations: [ 
     componentType 
    ], 
    schemas:[CUSTOM_ELEMENTS_SCHEMA] 
    })(class RuntimeComponentModule {}); 
} 

ठीक है, मुझे पूरी तरह से समझ में नहीं आया कि त्रुटि क्यों होती है। त्रुटि संदेश मूल रूप से कहता है कि मॉड्यूल e में मेटाडेटा नहीं है। कोणीय में एक मॉड्यूल का मेटाडाटा आमतौर पर सजावटी के रूप में घोषित किया जाता है।

ईएस 7 में सजावटी करी कार्यों के बराबर हैं। इसका मतलब यह है

@NgModule({}) 
class A {} 

NgModule({})(class A {}) 

निजी तौर पर मुझे लगता है कि जिस तरह से करी बेहतर है के बराबर होता है ...

अपडेट किया गया 22 मैच: आधिकारिक रेपो से जवाब https://github.com/angular/angular-cli/issues/5359#issuecomment-287500703 है बस एओटी का उपयोग नहीं कर रहा है। कृपया ng build --prod --no-aot के साथ कोड बनाएं मेरे मामले में, सब कुछ हल हो गया है।

+0

मुझे डर है कि यह ठीक से काम नहीं करता है। कोड ठीक संकलित करता है और पारदर्शी जेएस में शामिल है, हालांकि, अब एक नई समस्या है। कोणीय को नए 'NgModule' में कोई कस्टम आयातित मॉड्यूल नहीं मिल रहा है। तो उपरोक्त उदाहरण में 'फॉर्म मॉड्यूल', 'प्रतिक्रियाशीलफॉर्म मॉड्यूल' और 'ब्राउज़र मॉड्यूल' पाया जा सकता है, हालांकि 'पाइप्स मॉड्यूल' नहीं हो सकता है। त्रुटि 'CompileMetadataResolver.getNgModuleMetadata' में है। – Sebastian

+0

वास्तव में मुझे एक ही समस्या है। ऐसा लगता है कि जेआईटी संकलन सजावट को संकलित नहीं कर रहा है। न केवल 'रनटाइम कॉम्पोनेंट मॉड्यूल'। यदि आप संकलित 'main.js' को पढ़ते हैं तो इसमें' PipesModule' के लिए मेटाडेटा नहीं होता है। मैं इस टीएमआर पर जारी रखूंगा। मुझे कोणीय मॉड्यूल बताए जाने के लिए Thx ठीक है। –

+0

यह एक बार में jit + aot काम कर रहा है। V4 में –

0

दुर्भाग्य से ऐसा लगता है कि इस समय यह असंभव है (मैं जवाब को अद्यतित रखने की कोशिश करूंगा), न तो कोणीय 2.x के साथ और न ही कोणीय 4 बीटा के साथ।
समस्या यह है कि एक गतिशील घटक परिभाषा में फ़ाइल संदर्भ (टेम्पलेट, स्टाइल शीट) शामिल हैं जिन्हें पहले चलाने वाले एओटी कंपाइलर के साथ रन टाइम पर हल नहीं किया जा सकता है।
लेकिन अगर घटक या मॉड्यूल में फाइल संदर्भ नहीं होंगे तो वर्तमान कोणीय कोड वास्तव में घटकों के गतिशील निर्माण की अनुमति नहीं देता है। यह सिर्फ रनटाइम पर बनाए जा रहे मेटाडेटा को नहीं ढूंढता है।

  1. एक घटक स्थिर परिभाषित करें और यह एक NgModule में शामिल है कि AOT संकलक समय संकलन AOT पर पा सकते हैं:

    समस्या को संक्षेप में वहाँ गतिशील घटक निर्माण के 3 स्तरों हैं। इस तरह का एक घटक बिना किसी समस्या के तत्काल हो सकता है। (ComponentFactoryResolver आदि देखें)

  2. स्थिर रूप से एक घटक के शरीर को परिभाषित करें (कोड इत्यादि) लेकिन गतिशील टेम्पलेट्स और/या शैलियों (यानी टेम्पलेट को आवश्यक होने पर कोड में बनाया जा रहा है) की अनुमति दें। इसे रनटाइम पर संकलित करने के लिए एक NgModule भी आवश्यक है। यह वर्तमान में केवल तब संभव है जब एओटी कंपाइलर का उपयोग न किया जाए और मैंने यहां पोस्ट किए गए मुद्दे का प्रतिनिधित्व किया हो।
  3. कोड और टेम्पलेट सहित गतिशील रूप से पूर्ण घटक को परिभाषित करें। यह यहां नहीं है और यहां तक ​​कि यहां तक ​​कि यहां तक ​​कि यहां तक ​​कि यहां तक ​​कि यहां तक ​​कि यहां तक ​​कि यहां तक ​​कि यहां तक ​​कि यहां तक ​​कि यहां तक ​​कि यहां तक ​​कि यहां तक ​​कि यहां तक ​​कि यहां तक ​​कि यहां तक ​​कि यहां तक ​​कि यहां तक ​​कि यहां तक ​​कि यहां तक ​​कि यहां तक ​​कि यहां तक ​​कि यहां तक ​​कि यहां तक लेकिन संभवतः किसी के पास भी यह समस्या है।

मेरी राय में नंबर 2 अंक हल किया जा सकता है। एंगुलर टीम का कहना है कि चूंकि यह एओटी है, यह केवल उन चीजों को संकलित कर सकता है जो एओटी संकलन समय पर स्थिर रूप से ज्ञात हैं, लेकिन मैं असहमत हूं।
मैं एओटी को इस तरह के एक घटक के 'स्टब' को संकलित करने की संभावना के बारे में सोच सकता हूं जिसे तब आवश्यक गतिशील टेम्पलेट या शैली शीट के साथ तत्काल किया जा रहा है। @Component एनोटेशन या @DynamicComponent जैसी पूरी तरह से नई एनोटेशन के लिए नई संपत्ति का उपयोग करने की आवश्यकता हो सकती है लेकिन यह मेरे लिए व्यवहार्य लगता है। मुझे नहीं पता कि @NgModule घोषणा के लिए एक ही बदलाव की आवश्यकता होगी, लेकिन मुझे लगता है कि वे करेंगे।

+0

मैं इसका उपयोग कर रहा हूं। jit + aot एक बार :) –

+0

हाँ, जिथूब पर अपना धागा देखा! अब हमें इसे सीएलआई में काम करने की जरूरत है। – Sebastian

+0

सीओओ सेबेस्टियन! –

संबंधित मुद्दे