2017-08-04 36 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財產進口代碼。