在if语句中导入文件非常容易,如下所示:
import { Meteor } from 'meteor/meteor';
if (Meteor.isServer) {
const thing = require('./blah').default;
}
但是,我想知道的是,如果您可以在if语句中导出模块的默认成员而不将其绑定到全局范围或窗口
if (Meteor.isServer) {
export serverOnlyFunction = require('./blah').default;
}
如何在流星中实现这一目标?
答案 0 :(得分: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);
}
}
如果您在没有ES6关键字的情况下直接使用exports
,则可以在分支内进行分配:
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
是对运行时(node或requirejs)提供的API进行的运行时调用,并同步返回。
正确的ES6等价物是:
if (Meteor.isServer) {
System.import('./blah').then((thing) => {
// do something with thing
});
}