2016-06-17 8 views
0

es ist ziemlich einfach zu Import eine Datei innerhalb eines if-Anweisung wie folgt:Export in einer if-Anweisung Meteor mit

import { Meteor } from 'meteor/meteor'; 

if (Meteor.isServer) { 
    const thing = require('./blah').default; 
} 

Doch was ich frage mich, wenn Sie ein Standardelement eines exportieren Modul innerhalb einer if-Anweisung, ohne es an den globalen Bereich oder Fenster zu binden

Wie würde dies in Meteor erreicht werden?

Antwort

2

Dies ist nicht möglich, wie Sie es geschrieben haben, da die Exporte auf der obersten Ebene (von §A.5 of the spec) definiert werden müssen. Dies hängt damit zusammen, wie Module gehandhabt werden, wenn Lazy-Loading- oder zirkuläre Abhängigkeiten auftreten und der Code während oder vor dem Laden nicht ausgeführt werden kann.

Sie dieses Chaos vermeiden kann vollständig durch den Zweig zu exportieren, anstatt den Export aus einem Zweig:

export function getTheFunction() { 
    if (Meteor.isServer) { 
    return serverOnlyFunction; 
    } else { 
    return functionForEverybody; 
    } 
} 

Alternativ wird eine Wrapper-Funktion genauso gut funktionieren:

export function wrapTheFunction(...args) { 
    if (Meteor.isServer) { 
    return serverOnlyFunction.apply(this, args); 
    } else { 
    return functionForEverybody.apply(this, args); 
    } 
} 

Wenn Sie ‚re mit exports direkt ohne das ES6 Stichwort, könnten Sie aus dem Zweig zuweisen:

if (Meteor.isServer) { 
    module.exports = serverOnlyFunction; 
} else { 
    module.exports = functionForEverybody; 
} 

Aber es sei denn, Sie stecken in ES5 fest, dies ist eine schlechte Übung. Eine funktionsfähige Entscheidung zu exportieren, ist eine weitaus robustere Lösung.

Zweitens:

import { Meteor } from 'meteor/meteor'; // <- is an import 

if (Meteor.isServer) { 
    const thing = require('./blah').default; // <- is *not* an import 
} 

require ist kein Import. Sie sind zwei sehr unterschiedliche Dinge mit sehr unterschiedlichem Verhalten. Darüber hinaus ist require ein Laufzeitaufruf, der an eine API gestellt wird, die von der Laufzeitumgebung (node ​​oder requirejs) bereitgestellt wird, und die synchron zurückkehrt.

Die äquivalente richtige ES6 wäre:

if (Meteor.isServer) { 
    System.import('./blah').then((thing) => { 
    // do something with thing 
    }); 
} 
+0

Merkwürdigerweise 'System' in Meteor existiert, aber nicht über eine' import' Funktion – corvid

+0

Mein Wissen bietet keine Laufzeit ein voll funktionsfähigen 'heute Objekt system' . Sie müssen eine Bibliothek oder einen Bundler verwenden, der sie implementiert. – ssube