Za pomocą ES6 mogę zaimportować kilka eksportów z pliku takiego jak ten:
import {ThingA, ThingB, ThingC} from 'lib/things';
Jednak podoba mi się organizacja posiadania jednego modułu na plik. Skończyło się na takich importach:
import ThingA from 'lib/things/ThingA';
import ThingB from 'lib/things/ThingB';
import ThingC from 'lib/things/ThingC';
Chciałbym móc to zrobić:
import {ThingA, ThingB, ThingC} from 'lib/things/*';
lub coś podobnego, przy założeniu, że każdy plik zawiera jeden domyślny eksport, a każdy moduł ma taką samą nazwę jak jego plik.
czy to możliwe?
javascript
ecmascript-6
es6-modules
Frambot
źródło
źródło
lib/math
znajduje się plik zawierający wiele eksportów. W moim pytaniulib/math/
jest katalog zawierający kilka plików, z których każdy zawiera jeden eksport.Odpowiedzi:
Nie sądzę, że jest to możliwe, ale afaik rozdzielczość nazw modułów zależy od modułów ładujących, więc może istnieć implementacja modułu ładującego, która to obsługuje.
Do tego czasu można użyć pośredniego „pliku modułu”,
lib/things/index.js
który zawiera tylkoi pozwoliłoby ci to zrobić
źródło
index.js
wyglądające jak:import ThingA from 'things/ThingA'; export {ThingA as ThingA}; import ThingB from 'things/ThingB'; export {ThingB as ThingB};
. Inne zaklęciaindex.js
nie drgnęły.export * from
powinno działać. Próbowałeś…from './ThingA'
lubexport ThingA from …
? Jakiego modułu ładującego używasz?Tylko wariacja na temat już podana w odpowiedzi, ale co z tym:
W sposób
Thing
,w
things/index.js
,Następnie, aby skonsumować wszystkie rzeczy gdzie indziej,
Lub konsumować tylko niektóre rzeczy,
źródło
index.js
dla mnie rozwiązaniem . Używam SystemJs + Babelexport ThingA from './ThingA'
zamiastexport {default as ThingA} from './ThingA'
Obecne odpowiedzi sugerują obejście tego problemu, ale denerwuje mnie, dlaczego tak nie jest, dlatego stworzyłem
babel
wtyczkę, która to robi.Zainstaluj za pomocą:
następnie dodaj go do
.babelrc
:zobacz repozytorium, aby uzyskać szczegółowe informacje na temat instalacji
To pozwala ci to zrobić:
ponownie, repozytorium zawiera dalsze informacje na temat tego, co dokładnie robi, ale robienie tego w ten sposób pozwala uniknąć tworzenia
index.js
plików, a także dzieje się w czasie kompilacji, aby uniknąć robieniareaddir
w czasie wykonywania.Również dzięki nowszej wersji możesz zrobić dokładnie tak, jak twój przykład:
działa tak samo jak powyżej.
źródło
./lib/things;
i nie jest on pobierany. Problemy, które powoduje, są absurdalne. Właśnie byłem świadkiem sytuacji, gdy zmiana pliku zimport *
powoduje, że babel pobiera dodany plik, ale zmiana go z powrotem, przywraca problem, tak jakby ponownie używał pamięci podręcznej sprzed zmiany. Używaj ostrożnie.~/.babel.json
który powoduje takie dziwne zachowanie. Również jeśli używasz jak obserwator lub gorący przeładowywacz, musisz zapisać nowy plik, aby został ponownie skompilowany z nową listą katalogówbpwc clear-cache
ponieważŚwietne gugly muglys! To było trudniejsze niż trzeba.
Eksportuj jedno domyślne mieszkanie
Jest to świetna okazja, aby korzystać z rozprzestrzeniania (
...
w{ ...Matters, ...Contacts }
poniżej:Następnie, aby uruchomić skompilowany kod Babel z wiersza poleceń (z katalogu głównego projektu /):
Wyeksportuj jedno domyślne drzewo
Jeśli nie chcesz zastępować właściwości, zmień:
Wyjście będzie:
Eksportuj wiele nazwanych eksportów bez domyślnego
Jeśli poświęcasz się DRY , zmienia się również składnia importu:
Spowoduje to utworzenie 2 nazwanych eksportów bez domyślnego eksportu. Następnie zmień:
A wynik:
Zaimportuj wszystkie nazwane eksporty
Zwróć uwagę na destrukcję
import { Matters, Contacts } from './collections';
w poprzednim przykładzie.W praktyce
Biorąc pod uwagę te pliki źródłowe:
Tworząc
/myLib/index.js
pakietu wszystkich plików przeczy celowi importu / eksportu. Łatwiej byłoby uczynić wszystko globalnym w pierwszej kolejności, niż uczynić wszystko globalnym poprzez import / eksport za pomocą „plików otokowych” index.js.Jeśli chcesz konkretnego pliku,
import thingA from './myLib/thingA';
we własnych projektach.Utworzenie „pliku opakowania” z eksportami dla modułu ma sens tylko wtedy, gdy pakujesz dla npm lub w wieloletnim projekcie wielozadaniowym.
Dotarłeś tak daleko? Więcej informacji można znaleźć w dokumentacji .
Poza tym Stackoverflow w końcu wspiera trzy `s jako znaczniki ogrodzenia kodu.
źródło
Możesz użyć importu asynchronicznego ():
i wtedy:
źródło
Podobne do zaakceptowanego pytania, ale umożliwia skalowanie bez potrzeby dodawania nowego modułu do pliku indeksu za każdym razem, gdy go tworzysz:
./modules/moduleA.js
./modules/index.js
./example.js
źródło
./example.js
Użyłem ich kilka razy (w szczególności do budowania masywnych obiektów dzielących dane na wiele plików (np. Węzłów AST)), aby je zbudować, stworzyłem mały skrypt (który właśnie dodałem do npm, więc wszyscy inni można go użyć).
Użycie (obecnie musisz użyć Babel, aby użyć pliku eksportu):
Generuje plik zawierający:
Następnie możesz po prostu użyć pliku:
źródło
\` instead of
/) also as an improvment you may want to allow two options like
--nazwa_pliku &&,--dest
aby umożliwić dostosowanie miejsca, w którym utworzony plik powinien być przechowywany i pod jaką nazwą. Nie działa również z nazwami plików zawierającymi.
(jakuser.model.js
)To tylko inne podejście do odpowiedzi @ Bergi
Używa
źródło
export '...' was not found in '....
.Możesz użyć również wymagają:
Następnie użyj modułu moduleHolder z dynamicznie ładowanymi kontrolerami:
źródło
Nie jest to dokładnie to, o co prosiłeś, ale dzięki tej metodzie mogę iterować
componentsList
po innych plikach i korzystać z funkcji,componentsList.map(...)
które są dla mnie bardzo przydatne!źródło
Jeśli używasz webpacka. To automatycznie importuje pliki i eksportuje jako przestrzeń nazw interfejsu API .
Więc nie trzeba aktualizować przy każdym dodaniu pliku.
Dla użytkowników maszynopisu;
źródło
Byłem w stanie wziąć z podejścia użytkownika atilkan i nieco go zmodyfikować:
Dla użytkowników maszynopisu;
źródło
jeśli nie eksportujesz domyślnie w A, B, C, ale po prostu eksportujesz {}, możesz to zrobić
źródło
./thing
), a nawet gdyby tak było, nie działałoby. (Próbowałem, ale to nie zadziałało)