ES6交换模块在运行时

时间:2017-08-04 19:45:46

标签: javascript node.js ecmascript-6

我有api.js加载mock.js或server.js并导出它。结果是,基于服务器环境变量,我可以在后端之间进行交换。

问题,我想在运行时执行此操作,而不会影响已使用" api"的所有代码mock.js和server.js模块。

我希望我的应用根据连接状态使用mock.js或server.js。以下代码仅在初始化期间工作,而不是运行时。

import server from './server'
import mock from './mock'

let backend = null
if (process.env.NODE_ENV === 'development' && Math.random() > 0.5 ) {
  backend = mock
} else {
  backend = server
}

export default backend

2 个答案:

答案 0 :(得分:4)

如果需要,您可以利用ES6实时绑定,例如

import server from './server';
import mock from './mock';

export { backend as default };

let backend = server;

setInterval(() => {
    backend = Math.random() > 0.5 ? mock : server;
}, 1000);

将每秒随机更改默认导出。

在ES6中,导入的变量是导出值的模块中变量的实时引用,因此您可以

import backend from "./api";

并且backend值会随着时间的推移而变化。

特别是在你的情况下,改变

export default backend;

export { backend as default};

至关重要,因为第一个不起作用,因为它是

的缩写
const uniqueTempVal = backend;
export { uniqueTempVal as default };

您可以看到意味着稍后重新分配backend不会影响导出值。

答案 1 :(得分:1)

将要导出的对象放在导出对象的属性中:

import server from './server'
import mock from './mock'

let backend = { api: null };
if (process.env.NODE_ENV === 'development' && process.env.NODE_MOCK === true) {
  backend.api = mock;
} else {
  backend.api = server;
}

export default backend;

现在只需在导入代码中使用api属性。