Muszę zrobić coś takiego:
if (condition) {
import something from 'something';
}
// ...
if (something) {
something.doStuff();
}
Powyższy kod się nie kompiluje; rzucaSyntaxError: ... 'import' and 'export' may only appear at the top level
.
Próbowałem używać, System.import
jak pokazano tutaj , ale nie wiem, skąd System
pochodzi. Czy to propozycja ES6, która nie została zaakceptowana? Link do „programowego interfejsu API” z tego artykułu zrzuca mnie na przestarzałą stronę z dokumentami .
javascript
module
ecmascript-6
ericsoco
źródło
źródło
package.json
; moigulpfile
następnie sprawdza, czy istnieje zależność, że przed wykonaniem pewne kroki kompilacji.webpack
ibabel
do transponowania es6 na es5. Projekty takie jakwebpack-rewire
i podobne nie mają tutaj pomóc - github.com/jhnns/rewire-webpack/issues/12 . Jednym ze sposobów ustawienia podwójnego testu LUB w celu usunięcia problematycznych zależności może być import warunkowy.webpack
konwersji arkuszy stylów na moduły wstawiające odpowiednie style do DOM po zaimportowaniu), ale moduł musi również działać poza przeglądarką (np. W celu testowania jednostkowego).Odpowiedzi:
Mamy teraz dynamiczną propozycję importu z ECMA. Jest to etap 3. Jest to również dostępne jako preset babel .
Poniżej przedstawiono sposób renderowania warunkowego zgodnie z Twoim przypadkiem.
To w zasadzie zwraca obietnicę. Oczekuje się, że rozwiązanie obietnicy będzie mieć moduł. Propozycja ma również inne funkcje, takie jak import dynamiczny, import domyślny, import pliku js itp. Więcej informacji na temat importu dynamicznego można znaleźć tutaj .
źródło
if (condition) { import('something') .then(({ somethingExported }) => { console.log(somethingExported); }); }
npm run build
nadal pojawia się błąd:SyntaxError: ... 'import' and 'export' may only appear at the top level
Jeśli chcesz, możesz użyć wymagania. Jest to sposób na warunkowe żądanie warunkowe.
źródło
require()
nie jest to część standardowego JavaScript - jest to wbudowana funkcja w Node.js, więc przydatna tylko w tym środowisku. OP nie wskazuje na pracę z Node.js.Nie możesz importować warunkowo, ale możesz zrobić odwrotnie: eksportuj coś warunkowo. To zależy od przypadku użycia, więc obejście tego problemu może nie być dla Ciebie.
Możesz to zrobić:
api.js
apiConsumer.js
Używam tego, by wyśmiewać biblioteki analityczne, takie jak mixpanel itp., Ponieważ nie mogę obecnie mieć wielu kompilacji ani naszego frontendu. Nie najbardziej elegancki, ale działa. Mam tylko kilka „jeśli” tu i tam, w zależności od środowiska, ponieważ w przypadku mixpanelu wymaga inicjalizacji.
źródło
Wygląda na to, że odpowiedź jest taka, że na razie nie możesz.
http://exploringjs.com/es6/ch_modules.html#sec_module-loader-api
Myślę, że naszym celem jest możliwie jak największa analiza statyczna, a importowane warunkowo moduły to psują. Warto również wspomnieć - używam Babel i zgaduję, że
System
nie jest obsługiwany przez Babel, ponieważ interfejs API modułu ładującego nie stał się standardem ES6.źródło
require()
jest sposobem na zaimportowanie jakiegoś modułu w czasie wykonywania i w równym stopniu kwalifikuje się do analizy statycznej, jak wimport
przypadku użycia ze ścieżkami literału łańcucha. Jest to wymagane przez pakiet do wybrania zależności dla pakietu.Aby uzyskać dynamiczne rozwiązanie modułu z pełną obsługą analizy statycznej, najpierw moduły indeksujące w module indeksującym (index.js) i importuj moduł indeksujący w module hosta.
źródło
require()
nie jest to część standardowego JavaScript - jest to wbudowana funkcja w Node.js, więc przydatna tylko w tym środowisku. OP nie wskazuje na pracę z Node.js.Ważna różnica w przypadku korzystania z trybu importu dynamicznego Webpack
eager
:źródło
import
zwraca obietnicę.przesłanianie go w eval zadziałało dla mnie, ukrywając go przed analizatorem statycznym ...
źródło
eval
tutaj @TormodHaugene?eval
których nie należy go używać . Ogólnie: jeśli uważasz, że musisz użyćeval
, prawdopodobnie robisz to źle i powinieneś cofnąć się, aby rozważyć alternatywne rozwiązania. Prawdopodobnie istnieją pewne scenariusze, w których użycieeval
jest prawidłowe, ale najprawdopodobniej nie spotkałeś żadnej z tych sytuacji.require()
nie jest to część standardowego JavaScript - jest to wbudowana funkcja w Node.js, więc przydatna tylko w tym środowisku. OP nie wskazuje na pracę z Node.js.Udało mi się to osiągnąć za pomocą natychmiastowo wywołanej funkcji i wymagają instrukcji.
źródło
require()
nie jest to część standardowego JavaScript - jest to wbudowana funkcja w Node.js, więc przydatna tylko w tym środowisku. OP nie wskazuje na pracę z Node.js.Import warunkowy można również osiągnąć za pomocą trójki i
require()
s:const logger = DEBUG ? require('dev-logger') : require('logger');
Ten przykład został zaczerpnięty z dokumentów globalnych wymagających ES Lint: https://eslint.org/docs/rules/global-require
źródło
require()
nie jest to część standardowego JavaScript - jest to wbudowana funkcja w Node.js, więc przydatna tylko w tym środowisku. OP nie wskazuje na pracę z Node.js.Spójrz na ten przykład, aby zrozumieć, jak działa import dynamiczny.
Przykład importu modułu dynamicznego
Podstawowa znajomość importowania i eksportowania modułów.
Moduły JavaScript Github
Moduły JavaScript MDN
źródło
Nie, nie możesz!
Jednak wpadnięcie na ten problem powinno sprawić, że ponownie przemyślisz sposób organizacji kodu.
Wydaje mi się, że jednym z powodów, dla których porzucili tę obsługę ES6, jest fakt, że skompilowanie jej byłoby bardzo trudne lub niemożliwe.
źródło