2016-06-17 2 views
0

это довольно легко импорта файл в, если заявление так:Экспорт в, если заявление с помощью метеора

import { Meteor } from 'meteor/meteor'; 

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

Однако то, что мне интересно, если вы можете экспортировать элемента по умолчанию для модуль внутри оператора if, не привязывая его к глобальному охвату или окну

if (Meteor.isServer) { 
    export serverOnlyFunction = require('./blah').default; 
} 

Как это осуществить в метеор?

ответ

2

Это невозможно, поскольку вы написали его, так как экспорт должен быть определен на верхнем уровне (от §A.5 of the spec). Это связано с тем, как модули обрабатываются при возникновении ленивой загрузки или циклических зависимостей, и код не может быть выполнен во время или до загрузки.

Вы можете избежать этого беспорядка полностью экспортировать ветку, а не экспорт из в отрасли:

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

Кроме того, функция обертка будет работать точно так же:

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

Если вы используя exports непосредственно без ключевого слова ES6, вы можете назначить из внутри филиала:

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

Но, если вы не застряли на ES5, это плохая практика. Экспорт функции, способной решать, является гораздо более надежным решением.

Во-вторых:

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

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

require не импорт. Это две разные вещи с совершенно другим поведением. Кроме того, require - это вызов времени выполнения, выполняемый в API, предоставляемый средой выполнения (узел или requirejs) и возвращаемый синхронно.

Правильный ES6 эквивалент будет:

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

Как ни странно, 'system' существует в Метеор, но не имеет' import' функцию – corvid

+0

Насколько мне известно, ни одна среда не обеспечивает полностью функциональный 'system' объект сегодня , Вам необходимо использовать библиотеку или пакет, который ее реализует. – ssube