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
});
}
Merkwürdigerweise 'System' in Meteor existiert, aber nicht über eine' import' Funktion – corvid
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