/ / reeksportuj lub dynamicznie eksportuj obiekt na podstawie warunków - javascript, ecmascript-6, ecmascript-5, es6-moduły

reeksportuj lub dynamicznie eksportuj obiekt na podstawie warunku - javascript, ecmascript-6, ecmascript-5, es6-modules

Oto prosty scenariusz, z którym walczę

apicontainer.js

import mockApi from "./mock-api";
import realApi from "./api";
function getApi() {
return Cookies.get("isMock") ? mockApi: realApi;
}
let api = getApi();
export function changeApi() {
api = getApi();
}
export default api

somepage.js

import api from "./path-to/apicontainer";

Po załadowaniu aplikacji, Jeśli ustaw / usuń plik cookie i zadzwoń changeApi , czy zmieni dynamicznie referencję i zwróci właściwy interfejs API, czy jest lepsze rozwiązanie?

Odpowiedzi:

2 dla odpowiedzi № 1

Tak, importowane powiązania są tylko odniesieniami do eksportowanych zmiennych. Nie eksportuje się wartości, udostępnia się samą zmienną (tylko do odczytu z zewnątrz).

Więc możesz to zrobić

// apicontainer.js
import mockApi from "./mock-api";
import realApi from "./api";
function getApi() {
return Cookies.get("isMock") ? mockApi: realApi;
}
let api = getApi();
export { api as default }
export function changeApi() {
api = getApi();
}

// somepage.js
import api, {changeApi} from "apicontainer"
changeApi();

1 dla odpowiedzi nr 2

Tak, jest to możliwe, ponieważ moduły ES6 eksportują powiązania (połączenia na żywo). Czytaj więcej tutaj

apicontainer.js

import mockApi from "./mock-api";
import realApi from "./api";

function getApi() {
return Cookies.get("isMock") ? mockApi: realApi;
}

export function changeApi() {
api = getApi();
}
export let api = getApi();

somepage.js

import { api, changeApi }  from "./path-to/apicontainer";
// whenever you change the condition (cookie in this case)
changeApi(); // must call the `changeApi` to update the api reference value

Przeczytaj więcej o tym, jak to zrobić Moduły ES6 Prace


0 dla odpowiedzi № 3

Tak, zmienny eksport może być w tym używany (nadużywany)sposób - jeśli eksport zostanie ponownie przypisany w oryginalnym module, zostanie ponownie przypisany wszędzie tam, gdzie jest importowany, ale nie jest to tak naprawdę zalecane. Lepiej byłoby mieć moduły trawiący API, aby wykonać odpowiedni test, aby zidentyfikować, które plikiAPI (pozorne lub rzeczywiste) do użycia i do zaimportowania wspomnianego API bezpośrednio ze źródła. Naprawdę nie chcesz, aby zmienna używana przez jeden moduł została po cichu ponownie przypisana (z perspektywy tego modułu) - jest to niejasne.