gpt4 book ai didi

javascript - 使用meteor在if语句中导出

转载 作者:行者123 更新时间:2023-12-02 14:30:28 25 4
gpt4 key购买 nike

在 if 语句中导入文件相当容易,如下所示:

import { Meteor } from 'meteor/meteor';

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

但是,我想知道是否可以在 if 语句中导出模块的默认成员而不将其绑定(bind)到全局作用域或窗口

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是对运行时(node或requirejs)提供的API进行运行时调用并同步返回。

正确的 ES6 等效项是:

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

关于javascript - 使用meteor在if语句中导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37885952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com