使用 meteor 在 if 语句中导出

Export in an if statement using meteor

在 if 语句中 导入 文件相当容易:

import { Meteor } from 'meteor/meteor';

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

但是,我想知道是否可以在 if 语句中导出模块的默认成员而不将其绑定到全局范围或 window

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

这在 meteor 中是如何实现的?

这是不可能的,因为您已经写了它,因为导出必须在顶层定义(来自 §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 是对运行时(节点或 requirejs)和 return 同步提供的 API 进行的运行时调用。

正确的 ES6 等价物是:

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