2016-01-12 3 views
5

Ich möchte ein ganzes Modul re-exportieren und nur eine bestimmte Funktion des reexportierten Moduls überschreiben. Aber es scheint, dass das Exportieren der Überschreibungsfunktion nicht verarbeitet wird, wenn die gleiche Funktion bereits erneut reexportiert wird.es2015 Modul erneut exportieren und einzelne Exportfunktion des reexportierten Moduls überschreiben

(http://www.ecma-international.org/ecma-262/6.0/#sec-module-semantics-static-semantics-early-errors: ‚Es ist ein Syntaxfehler, wenn die ExportedNames von ModuleItemList alle doppelten Einträge enthält.‘)

Die Motivation hinter meinem Ansatz ist explizit Reexport eine sehr große oder lange Modul zu minimieren, wenn ich Sie möchten nur eine bestimmte Funktion oder Methode im wieder exportierten Modul überschreiben.

Gibt es eine Möglichkeit meinen Ansatz in es6/es2015 zu implementieren?

Mein Code so weit:

Modul-a.js

export class MyFirstStandardClass { 
    sendMeMessages() { 
    return `hello, I'm a standard implementation`; 
    } 
} 
export function talkToMe() { 
    return `standard talking: how are you doing?`; 
} 

Modul-b.js

import * as StandardModule from 'module-a'; 

export function talkToMe(condition = true) { 
    if (condition) { 
    return `project conditional talking: ${StandardModule.talkToMe()}`; 
    } 
    return `project without a condition!`; 
} 

export * from 'module-a'; 

Modul-c.js

import * as MyModule from 'module-b'; 
import React, { Component } from 'react'; 

export default class App extends Component { 

    componentWillMount() { 
    console.log(MyModule); 
    this.myFirstStandardInstance = new MyModule.MyFirstStandardClass(); 
    } 

    render() { 
    return (
     <div> 
     <label> 
      Class 
     </label> 
     <div> 
      { this.myFirstStandardInstance.sendMeMessages() } 
     </div> 
     <label> 
      Function 
     </label> 
     <div> 
      { MyModule.talkToMe(true) } // returns 'standard talking: how are you doing?'; expected 'project conditional talking: standard talking: how are you doing?' 
     </div> 
     </div> 
    ); 
    } 
} 

Antwort

0

Sie kann auswählen welche Module von module-a zu exporieren sind t auf einer Linie. Also in Ihrem module-b.js Sie tun können:

// export all modules excluding `talkToMe` 
export { MyFirstStandardClass, someOtherModule } from 'module-a'; 

export function talkToMe(condition = true) { 
    // ... 
} 

Oder Sie können Standardobjekt exportieren und wählen, was zum Ausschluss/außer Kraft setzen mit Object.assign():

import * as StandardModule from 'module-a'; 

const overridenExports = { 
    talkToMe: function(condition = true) { 
     // ... 
    } 
} 

const myModule = Object.assign({}, StandardModule, overridenExports); 

export default myModule; 

und Import Standard wie:

import MyModule from 'module-b'; 
+0

2 Danke für die Antwort. Ich habe es schon ausprobiert und es funktioniert. Aber wenn Sie viele Untermodule in Modul-a haben, wäre die Liste sehr lang. –

Verwandte Themen