czy można zaimportować coś do modułu podając nazwę zmiennej podczas korzystania z importu ES6?
To znaczy chcę zaimportować jakiś moduł w czasie wykonywania w zależności od wartości podanych w konfiguracji:
import something from './utils/' + variableName;
javascript
node.js
ecmascript-6
Vytautas Butkus
źródło
źródło
Odpowiedzi:
Nie z
import
oświadczeniem.import
iexport
są zdefiniowane w taki sposób, że można je analizować statycznie, więc nie mogą zależeć od informacji o czasie wykonywania.Szukasz API modułu ładującego (polyfill) , ale jestem trochę niejasny co do statusu specyfikacji:
źródło
Oprócz odpowiedzi Felixa , zauważę wyraźnie, że nie jest to obecnie dozwolone w gramatyce ECMAScript 6 :
ModuleSpecifier może być tylko literał łańcuchowy , a nie innego rodzaju ekspresji niczym AdditiveExpression .
źródło
const
string literal
s. 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 :
lub alternatywnie:
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.Dobre przykłady i porównania między wymaganiami i importem można znaleźć tutaj: http://www.2ality.com/2014/09/es6-modules-final.html
Doskonała dokumentacja dotycząca ponownego eksportu z @iainastacio: http://exploringjs.com/es6/ch_modules.html#sec_all-exporting-styles
Interesuje mnie opinia na temat tego podejścia :)
źródło
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ł.Przypadków użycia
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.
Dalsza informacja
Oto wyjaśnienie w Google Developers .
Zgodność z przeglądarkami (kwiecień 2020 r.)
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.
źródło
Rozumiem pytanie zadane konkretnie dla ES6
import
w Node.js, ale poniższe mogą pomóc innym szukającym bardziej ogólnego rozwiązania:Uwaga, jeśli importujesz moduł ES6 i chcesz uzyskać dostęp do
default
eksportu, musisz użyć jednej z następujących opcji:Możesz również użyć destrukturyzacji z tym podejściem, które może zwiększyć znajomość składni z innymi importami:
Niestety, jeśli chcesz uzyskać dostęp,
default
a także zniszczyć, musisz wykonać to w kilku krokach:źródło
możesz do tego użyć notacji innej niż ES6. to działa dla mnie:
źródło
Mniej podoba mi się ta składnia, ale działa:
zamiast pisać
użyj tej składni:
źródło
require()
to metoda Node.JS do ładowania plików, która jest wczesną wersją.import
Instrukcja 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).Import dynamiczny () (dostępny w Chrome 63+) wykona Twoją pracę. Oto jak:
źródło
Zrobiłbym to w ten sposób
źródło
./utils/test.js
zadzwoń z pliku
źródło