2017-08-04 61 views
0

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

问题是,我想这样做在运行时,而不影响所有已在使用的mock.js和server.js模块的“API”的代码。

我希望我的应用根据连接状态使用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 
+0

不确定什么问题或问题是? – guest271314

+0

是的,我很困惑,那么你的代码有什么问题? – loganfsmyth

+0

@loganfsmyth表示我想要根据当前分钟是奇数还是偶数来改变导出...这是一个愚蠢的例子,我真正想要的是当连接掉落 –

回答

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不会影响导出的值。

+0

但是,如果路由已经基于模拟或服务器进行了注册,那么在事实之后这不会做任何事情来交换这些变量。这只是一个疯狂的猜测。直到我们理解OP在加载模拟或服务器模块后所做的工作之后,我们才能真正知道问题的答案。 – jfriend00

+0

你的意思是说,如果有东西缓存对特定后端的引用,而不是每次引用回导入?我想我假设他们一贯引用导入。像'backend.query(“/ foo”)'或其他。 – loganfsmyth

+0

我们需要看看OP如何使用这个结果,然后才可能知道什么可以或不可以工作。你根据一个假设做出猜测。可能是对的,可能是错的。我们应该让OP了解他们在这个模块中做了什么,并将其作为一个不需要猜测或假设的问题。 – jfriend00

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财产进口代码。