Nie z importoświadczeniem. importi exportsą zdefiniowane w taki sposób, że można je analizować statycznie, więc nie mogą zależeć od informacji o czasie wykonywania.
Właśnie sprawdziłem, to trochę działa (próbuje załadować plik), ale potem psuje ścieżki dla innych modułów ... Szkoda, że nie jest obsługiwany natywnie ..
Szkoda, że nie zostało to rozszerzone o conststring literals. Można je analizować statycznie, prawda? Umożliwiłoby to ponowne wykorzystanie lokalizacji zależności. (np. zaimportuj szablon i miej dostęp do szablonu i lokalizacji szablonu).
Chociaż w rzeczywistości nie jest to import dynamiczny (np. W moich okolicznościach wszystkie pliki, które importuję poniżej, zostaną zaimportowane i dołączone do pakietu internetowego, a nie wybrane w czasie wykonywania), wzorzec, którego używam, który może pomóc w pewnych okolicznościach to :
// index.jsexport{default as Template1}from'./Template1';export{default as Template2}from'./Template2';// OtherComponent.jsimport* as templates from'./index.js'...// handy to be able to fall back to a default!return templates[name]|| templates.Template1;
Nie sądzę, żebym mógł tak łatwo wrócić do wartości domyślnej za pomocą require(), co powoduje błąd, jeśli spróbuję zaimportować skonstruowaną ścieżkę szablonu, która nie istnieje.
Powinienem był o tym pomyśleć. Świetne rozwiązanie, bez względu na to, w jaki sposób importujesz rzeczy (i nawet jeśli niczego nie importujesz). Masz listę elementów, które chcesz później uzyskać nazwę lub nazwę? Umieść je w literale obiektu zamiast literału tablicowego i pozwól składni obiektu zająć się nazywaniem ich na podstawie lokalnej nazwy stałej / zmiennej. Jeśli potrzebujesz ich ponownie jako listy, po prostu zrób Object.values(templates).
Istnieje nowa specyfikacja nazywana dynamicznym importem dla modułów ES. Po prostu dzwonisz import('./path/file.js')i jesteś gotowy. Funkcja zwraca obietnicę, która jest rozpatrywana z modułem, jeśli import się powiódł.
Przypadki użycia obejmują importowanie komponentów oparte na trasach dla React, Vue itp. Oraz możliwość leniwego ładowania modułów , gdy są one wymagane w czasie wykonywania.
Według MDN jest obsługiwany przez wszystkie obecnie popularne przeglądarki (z wyjątkiem IE), a caniuse.com wykazuje 87% poparcia w globalnym udziale w rynku. Znowu brak wsparcia w IE lub non-chromium Edge.
popraw mnie, jeśli się mylę, ale webpack ich nie przetwarza, prawda? Pomyślałem, że chodzi o to, aby import dynamiczny działał „tak jak jest” w przeglądarce.
Tak, możesz je uruchomić w przeglądarce bez zmian. Jednak pakiet webpack automatycznie wykorzystuje import, aby podzielić aplikację na wiele pakietów dla różnych części aplikacji, na przykład dla tras. Używam ich cały czas i są naprawdę pomocne. A jeśli chodzi o „przetwarzanie”; webpack przekaże import babel, który wypełni funkcję dla starszych przeglądarek.
Dla jasności: dynamiczny import () będzie działał ze zmiennymi i nie musi być analizowalny statycznie (z pewnością o to właśnie chodzi w „dynamicznym”?). Zobacz moją odpowiedź.
@Jacob, naprawdę są zupełnie inni, więc tak, to może mieć znaczenie w zależności od tego, co robisz. Pierwsza składnia jest oceniana statycznie, podczas gdy druga jest oceniana dynamicznie. Na przykład, jeśli używasz webpacka, nie będzie poprawnie wykonywać potrząsania drzewem z drugim. Istnieje wiele innych różnic, sugeruję przeczytanie tego dokumentu i sprawdzenie, który z nich jest bardziej odpowiedni dla Ciebie!
@Jacob - nie ma znaczenia (w większości przypadków). require()to metoda Node.JS do ładowania plików, która jest wczesną wersją. importInstrukcja jest nowszą wersją, która jest teraz częścią składni języka urzędowego. Jednak w wielu przypadkach przeglądarka użyje poprzedniej (za nauką). Wymagane oświadczenie również spienięży twoje pliki, więc jeśli plik zostanie załadowany po raz drugi, zostanie załadowany z pamięci (lepsza wydajność). Sposób importu ma swoje zalety - jeśli używasz WebPack. wtedy webpack może usunąć martwe odnośniki (te skrypty nie zostaną pobrane do klienta).
function load(filePath){return()=>System.import(`${filePath}.js`);// Note: Change .js to your file extension}let A = load('./utils/'+ variableName)// Now you can use A in your module
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.