Czy można przekazać opcje do importu ES6?
Jak to tłumaczysz:
var x = require('module')(someoptions);
do ES6?
javascript
module
ecmascript-6
es6-modules
Fabrizio Giordano
źródło
źródło
System.import(module)
, nie jestem pewien, czy to zezwala na argumenty, czy nie, prawdopodobnie ktoś, kto wie więcej o ES6, robi?Odpowiedzi:
Nie ma sposobu, aby to zrobić za pomocą jednej
import
instrukcji, nie pozwala na wywołania.Więc nie nazwałbyś tego bezpośrednio, ale zasadniczo możesz zrobić to samo, co commonjs robi z domyślnymi eksportami:
Alternatywnie, jeśli używasz modułu ładującego, który obsługuje monadyczne obietnice, możesz być w stanie zrobić coś takiego
Z nowym
import
operatorem może się to staćlub
jednak prawdopodobnie nie chcesz dynamicznego importu, ale statyczny.
źródło
import x from 'module' use someoptions;
składniimport {x, y} from 'module'
.). Jaka powinna być składnia, jeśli chcę przekazać wiele argumentów? Albo rozłożyć szereg argumentów? Jest to wąski przypadek użycia i zasadniczo próbujesz dodać inną składnię do wywołania funkcji, ale mamy już wywołania funkcji, które pozwalają nam zająć się wszystkimi innymi przypadkami.var session = require('express-session'); var RedisStore = require('connect-redis')(session);
że po prostu zastanawiałem się, czy istnieje rozwiązanie jednokreskowe. Całkowicie przeżyję, dzieląc przydział RedisStore na 2 linie :)import {default(someoptions) as x} from 'module'
w ES7, jeśli naprawdę jest taka potrzeba.session
/connect-redis
przykład I zostały wyobrażając składnię tak:import session from 'express-session'); import RedisStore(session) from 'connect-redis'
.Pojęcie
Oto moje rozwiązanie przy użyciu ES6
Bardzo dobrze wpisuje się w odpowiedź @ Bergi, jest to „szablon”, którego używam podczas tworzenia importu, który wymaga przekazania parametrów
class
deklaracji. Jest to używane w izomorficznym frameworku, który piszę, więc będzie działać z transpilerem w przeglądarce i node.js (używamBabel
zWebpack
):./MyClass.js
./main.js
Powyższe zostanie wyświetlone
foo
w konsoliEDYTOWAĆ
Przykład z prawdziwego świata
W przypadku rzeczywistego przykładu używam tego do przekazywania przestrzeni nazw w celu uzyskania dostępu do innych klas i instancji w ramach. Ponieważ po prostu tworzymy funkcję i przekazujemy obiekt jako argument, możemy go użyć z naszą deklaracją klasy taką jak:
Import jest nieco bardziej skomplikowany iw
automagical
moim przypadku jest to cały framework, ale zasadniczo dzieje się tak:Mam nadzieję, że to pomoże!
źródło
MyView
rozszerza niektóre elementy dostępne w przestrzeni nazw frameworka. Chociaż jest absolutnie możliwe, aby po prostu przekazać go jako parametr do klasy, zależy to również od tego, kiedy i gdzie tworzona jest instancja klasy; ma to wpływ na przenośność. W praktyce te klasy mogą zostać przekazane innym frameworkom, które mogą tworzyć ich instancje w inny sposób (np. Niestandardowe komponenty React). Gdy klasa znajdzie się poza zakresem struktury, może nadal zachować dostęp do struktury po jej wystąpieniu z powodu tej metodologii.Opierając się na @ BERGI za odpowiedź używać moduł debugowania za pomocą ES6 byłby następujący
źródło
Uważam, że można użyć modułów ładujących es6. http://babeljs.io/docs/learn-es6/
źródło
m(youroptionshere)
kończy się wynik? Przypuszczam, że mógłbyś napisaćSystem.import('lib/math').then(m => m(options)).then(module => { /* code using module here */})
... ale to nie jest zbyt jasne.Musisz tylko dodać te 2 linie.
źródło
xModule
wprowadza w błąd. To, co tak naprawdę masz, toimport func from 'module'; func('someOptions');
.Wylądowałem w tym wątku, szukając czegoś podobnego i chciałbym zaproponować rodzaj rozwiązania, przynajmniej w niektórych przypadkach (ale zobacz uwagę poniżej).
Przypadek użycia
Mam moduł, który uruchamia logikę instancji natychmiast po załadowaniu. Ja nie jak nazwać tę startowy logikę zewnątrz modułu (który jest taki sam jak zaproszenia
new SomeClass(p1, p2)
lubnew ((p1, p2) => class SomeClass { ... p1 ... p2 ... })
i podobne).Podoba mi się, że ta logika init uruchomi się raz, rodzaj pojedynczego przepływu instancji, ale raz dla określonego sparametryzowanego kontekstu.
Przykład
service.js
ma w swoim podstawowym zakresie:Moduł A robi:
Moduł B robi:
Jak dotąd dobrze: usługa jest dostępna dla obu modułów, ale została zainicjowana tylko raz.
Problem
Jak sprawić, by działał jako kolejna instancja i ponownie zainicjował się w innym kontekście, na przykład w module C?
Rozwiązanie?
Właśnie o tym myślę: użyj parametrów zapytania. W usłudze dodalibyśmy:
let context = new URL(import.meta.url).searchParams.get('context');
Moduł C zrobiłby:
moduł zostanie ponownie zaimportowany, uruchomi się jego podstawowa logika init i zobaczymy w konsoli:
initialized in context special
źródło
Oto moje podejście do tego pytania na przykładzie modułu debugowania;
Na stronie npm tego modułu masz to:
W powyższej linii ciąg jest przekazywany do modułu, który jest importowany w celu skonstruowania. Oto jak zrobiłbyś to samo w ES6
Mam nadzieję, że to komuś pomoże.
źródło