Eksperymentuję z ES6 i używam łyka do budowania i babel do transpozycji do ES5. Dane wyjściowe nie są uruchamiane w węźle, tylko są połączone z plikiem .htm ze znacznikiem. Myślę, że muszę dodać
<script src='require.js'></script>
czy jakoś tak.
Próbuję importować / eksportować.
////////////////scripts.js
import {Circle} from 'shapes';
c = new Circle(4);
console.log(c.area());
/////////////////shapes.js
export class Circle {
circle(radius) {
this.radius = radius;
}
area() {
return this.radius * this.radius * Math.PI;
}
}
Błąd jest
Uncaught ReferenceError: require is not defined
Odnosi się do tego (po .pipe (babel ()) łykiem)
var _shapes = require('shapes');
javascript
ecmascript-6
Jason
źródło
źródło
require
nie istnieje w przeglądarce, musisz użyć jakiegoś narzędzia do budowania, takiego jak Require.js, Browserify lub Webpack.require
funkcję (znowu nie ma to nic wspólnego z require.js). Jednak można powiedzieć Babel do konwersji modułów do czegoś innego , np AMD lub UMD, które następnie pracować z require.js. Tak czy inaczej, potrzebujesz systemu do ładowania modułów w przeglądarce, ponieważ przeglądarka domyślnie (jeszcze) takiego nie udostępnia.Odpowiedzi:
Możesz potrzebować modułu ładującego, ale nie jest to konieczne. Masz kilka opcji. Poniższe informacje pomogą Ci rozpocząć.
rollup.js z rollup-plugin-babel
Rollup to pakiet modułów JavaScript nowej generacji. Rozumie natywnie moduły ES2015 i stworzy pakiet, który nie wymaga żadnego modułu ładującego do działania. Niewykorzystany eksport zostanie usunięty z wyniku, co nazywa się potrząsaniem drzewami.
Teraz osobiście polecam korzystanie z pakietu rollupjs, ponieważ zapewnia on najwyraźniejszy wynik i jest łatwy w konfiguracji, jednak daje inny aspekt odpowiedzi. Wszystkie inne podejścia wykonują następujące czynności:
W przypadku rollupjs rzeczy tak naprawdę nie działają w ten sposób. Tutaj rollup jest pierwszym krokiem zamiast babel. Domyślnie rozumie tylko moduły ES6. Musisz podać moduł wejściowy, którego zależności będą przeszukiwane i łączone. Ponieważ ES6 pozwala na wiele nazwanych eksportów w module, rollupjs jest wystarczająco inteligentny, aby usunąć nieużywane eksporty, zmniejszając w ten sposób rozmiar pakietu. Niestety, parser rollupjs-s nie rozumie składni> ES6, więc moduły ES7 muszą zostać skompilowane przed ich przeanalizowaniem przez pakiet zbiorczy, ale kompilacja nie powinna wpływać na import ES6. Odbywa się to za pomocą
rollup-plugin-babel
wtyczki zbabel-preset-es2015-rollup
ustawieniem wstępnym (to ustawienie jest takie samo jak w przypadku es2015, z wyjątkiem transformatora modułu i wtyczki pomocników zewnętrznych). Tak więc pakiet zbiorczy wykona następujące czynności z modułami, jeśli są poprawnie skonfigurowane:Przykładowa kompilacja nodejs:
Przykładowa kompilacja gruntowa z grunt-rollupem
Przykładowa kompilacja łyka z rollupem gulp
Babelify + Browserify
Babel ma zgrabny pakiet o nazwie babelify . Jego użycie jest proste i nieskomplikowane:
lub możesz go użyć z node.js:
Spowoduje to natychmiastową transpozycję i konkatenację kodu. Browserify
.bundle
będzie zawierał ładny, mały program ładujący CommonJS i zorganizuje transpiled moduły w funkcje. Możesz nawet mieć względny import.Przykład:
Aby skompilować, po prostu uruchom
node build.js
w katalogu głównym projektu.Babel + WebPack
Skompiluj cały kod za pomocą babel. Zalecam użycie transformatora modułu amd (nazywanego
babel-plugin-transform-es2015-modules-amd
w babel 6). Następnie spakuj swoje skompilowane źródła za pomocą WebPack.WebPack 2 jest już dostępny! Rozumie natywne moduły ES6 i wykona (a raczej zasymuluje) potrząsanie drzewami przy użyciu wbudowanej eliminacji martwego kodu Babili . Na razie (wrzesień 2016) nadal sugerowałbym używanie rollupa z babel, chociaż moja opinia może się zmienić wraz z pierwszym wydaniem WebPack 2. Zapraszam do dyskusji w komentarzach.
Niestandardowy potok kompilacji
Czasami chcesz mieć większą kontrolę nad procesem kompilacji. Możesz zaimplementować swój własny potok w następujący sposób:
Najpierw musisz skonfigurować babel do używania modułów amd. Domyślnie babel transponuje się do modułów CommonJS, co jest trochę skomplikowane w obsłudze w przeglądarce, chociaż browserify radzi sobie z nimi w przyjemny sposób.
{ modules: 'amdStrict', ... }
opcjies2015-modules-amd
wtyczkiNie zapomnij włączyć tej
moduleIds: true
opcji.Sprawdź transpiled kod pod kątem wygenerowanych nazw modułów, często występują niezgodności między zdefiniowanymi i wymaganymi modułami. Zobacz sourceRoot i moduleRoot .
Wreszcie, musisz mieć jakiś rodzaj modułu ładującego, ale nie jest to konieczne. Jest migdał , niewielka podkładka, która działa dobrze. Możesz nawet wdrożyć własne:
Na koniec możesz po prostu połączyć podkładkę modułu ładującego i skompilowane moduły razem i uruchomić na tym uglify.
Standardowy kod Babel jest powielany w każdym module
Domyślnie większość z powyższych metod kompiluje każdy moduł indywidualnie z babel, a następnie łączy je razem. To też robi babelify. Ale jeśli spojrzysz na skompilowany kod, zobaczysz, że babel wstawia wiele standardowych szablonów na początku każdego pliku, większość z nich jest powielana we wszystkich plikach.
Aby temu zapobiec, możesz skorzystać z
babel-plugin-transform-runtime
wtyczki.źródło
Pakiet internetowy barebones 2
1) Jeśli to jest twój katalog główny:
index.html
scripts.js
kształty.js
2) mieć węzeł zainstalowany węzeł
3) uruchom następującą komendę w swoim terminalu:
5) w katalogu głównym uruchom następujące polecenie:
Powinieneś teraz mieć plik o nazwie bundle.js w swoim katalogu głównym, który będzie plikiem, który zajmie twój index.html. Jest to minimalistyczna funkcja sprzedaży pakietowej z pakietu internetowego. Możesz dowiedzieć się więcej tutaj
źródło
require
nie istnieje w przeglądarce, więc ten błąd jest oczekiwany. Musisz użyć czegoś takiego jak require.js lub Browserify.źródło