Powiedzmy, że mam moduł ( ./my-module.js
), który ma obiekt, który powinien być jego wartością zwracaną:
let values = { a: 1, b: 2, c: 3 }
// "export values" results in SyntaxError: Unexpected token
Więc mogę je zaimportować na przykład:
import {a} from './my-module' // a === 1
import * as myModule from './my-module' // myModule.a === 1
Jedyny sposób, jaki znalazłem, to zakodowanie eksportu:
export let a = values.a
export let b = values.b
export let c = values.c
// or:
export let {a, b, c} = values
Co nie jest dynamiczne.
Czy można wyeksportować wszystkie wartości z obiektu?
module
export
ecmascript-6
mauvm
źródło
źródło
interface { a: number, b: number, c: number }
? Teoretycznie powinno to być możliwe, prawda?export const {a, b, c} = values
to właśnie składnia deklarująca ten statyczny interfejsOdpowiedzi:
Nie wydaje się. Cytat z modułów ECMAScript 6: ostateczna składnia :
źródło
Naprawdę nie mogę polecić obejścia tego
rozwiązania,ale działa. Zamiast eksportować obiekt, możesz użyć nazwanego eksportu każdego członka. W innym pliku zaimportuj nazwane eksporty pierwszego modułu do obiektu i wyeksportuj ten obiekt jako domyślny. Wyeksportuj również wszystkie nazwane eksporty z pierwszego modułu za pomocąexport * from './file1';
wartości / wartość.js
wartości / index.js
index.js
źródło
{ a, b, c }
, dlaczego muszę ponownie eksportować? Prawdziwe pytanie brzmi: co, jeśli mam tylkoconst obj = { a, b, c }
i czy mogę wyeksportować wszystkie składowe obj? Myślę, że odpowiedź brzmi NIE.wypróbuj to brzydkie, ale wykonalne rozwiązanie:
źródło
Po prostu musiałem to zrobić dla pliku konfiguracyjnego.
Możesz to zrobić w ten sposób
To jest używanie maszynopisu.
źródło
import config from './config';
To zadziała z dzisiejszymi transformacjami Babel i powinno wykorzystać wszystkie zalety modułów ES2016, ilekroć ta funkcja faktycznie pojawi się w przeglądarce.
Możesz także dodać,
export default {a, b, c};
co pozwoli zaimportować wszystkie wartości jako obiekt bez* as
, tjimport myModule from 'my-module';
Źródła:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export
http://www.2ality.com/2014/09/es6-modules-final.html
źródło
Proponuję co następuje, spodziewajmy się module.js :
a potem możesz zrobić w pliku index.js :
Więcej przykładów niszczących obiektów: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destruecting_assignment#Object_destruecting
źródło
Każda odpowiedź wymaga zmiany instrukcji importu.
Jeśli chcesz móc korzystać z:
jak w pytaniu, aw swoim
my-module
masz wszystko, czego potrzebujesz do wyeksportowania w jednym obiekcie (co może być przydatne np. jeśli chcesz zweryfikować wyeksportowane wartości za pomocą schematu Joi lub JSON) tomy-module
musiałbyś być albo:Lub:
Niezbyt ładne, ale kompiluje się do tego, czego potrzebujesz.
Zobacz: przykład Babel
źródło
Z javascriptem można zrobić wiele głupich rzeczy. Zostawię ten cytat z książki YDKJS.
Wspomniana strona książki ->
https://books.google.com.tr/books?id=iOc6CwAAQBAJ&pg=PT150&lpg=PT150&dq=JS+engine+cannot+statically+analyze+the+contents+of+plain+object&source=bl&lpg=PT150&dq=JS+engine+cannot+statically+analyze+the+contents+of+plain+object&source=bl&ots=7v8fMUgwhP3&sWIYvig=Hvig=hldk X & ved = 2ahUKEwi4qseXyrDdAhUS-6QKHZYTAEQQ6AEwAHoECAEQAQ # v = onepage & q = JS% 20engine% 20cannot% 20statically% 20analyze% 20the% 20contents% 20of% 20plain% 20object & f = false
źródło
Eksportowanie każdej zmiennej z pliku zmiennych. Następnie zaimportowanie ich z * tak jak w innym pliku i wyeksportowanie jako stałej z tego pliku da ci dynamiczny obiekt z nazwanymi eksportami z pierwszego pliku będącymi atrybutami obiektu wyeksportowanego z drugiego.
Variables.js
Other.js
Third.js
źródło