TL; DR - Nie, dopóki ~ października 2019 roku node.js Moduły Zespół został poproszony :
Nie publikuj żadnych pakietów modułów ES przeznaczonych do użytku przez Node.js do [października 2019]
Aktualizacja z maja 2019 r
Od 2015 roku, kiedy zadano to pytanie, obsługa JavaScript dla modułów znacznie się rozwinęła i miejmy nadzieję, że w październiku 2019 będzie oficjalnie stabilna. Wszystkie inne odpowiedzi są teraz przestarzałe lub zbyt skomplikowane. Oto aktualna sytuacja i najlepsze praktyki.
Obsługa ES6
99% ES6 (aka 2015) jest obsługiwanych przez Node od wersji 6 . Aktualna wersja Node to 12. Wszystkie wiecznie zielone przeglądarki obsługują zdecydowaną większość funkcji ES6. ECMAScript jest teraz w wersji 2019 , a schemat wersjonowania faworyzuje teraz używanie lat.
Moduły ES (aka moduły ECMAScript) w przeglądarkach
Wszystkie przeglądarki wiecznie zostały wspieranie import
-ing moduły ES6 od 2017. import dynamiczne są obsługiwane przez Chrome (+ widły jak Opera i Samsung Internet) i Safari. Obsługa Firefoksa jest przewidziana w następnej wersji, 67.
Nie potrzebujesz już Webpack / rollup / Parcel itp., Aby załadować moduły. Mogą być nadal przydatne do innych celów, ale nie są wymagane do ładowania kodu. Możesz bezpośrednio importować adresy URL wskazujące na kod modułów ES.
Moduły ES w Node
Moduły ES ( .mjs
pliki z import
/ export
) były obsługiwane od wersji 8.5.0 Node przez wywołanie node
z --experimental-modules
flagą. Node v12, wydany w kwietniu 2019 r., Przepisał obsługę modułów eksperymentalnych. Najbardziej widoczną zmianą jest to, że rozszerzenie pliku musi być określone domyślnie podczas importowania:
// lib.mjs
export const hello = 'Hello world!';
// index.mjs:
import { hello } from './lib.mjs';
console.log(hello);
Zwróć uwagę na obowiązkowe .mjs
rozszerzenia w całym tekście. Uruchom jako:
node --experimental-modules index.mjs
Wydanie Node 12 ma miejsce również wtedy, gdy zespół Modules poprosił programistów, aby nie publikowali pakietów modułów ES przeznaczonych do użytku przez Node.js, dopóki nie zostanie znalezione rozwiązanie do korzystania z pakietów za pośrednictwem obu require('pkg')
i import 'pkg'
. Nadal można publikować natywne moduły ES przeznaczone dla przeglądarek.
Wsparcie ekosystemu natywnych modułów ES
Od maja 2019 r. Obsługa ekosystemu dla modułów ES jest niedojrzała. Na przykład struktury testowe, takie jak Jest i Ava , nie obsługują --experimental-modules
. Musisz użyć transpilera, a następnie zdecydować, czy użyć nazwanej import { symbol }
składni import ( ) (która jeszcze nie będzie działać z większością pakietów npm), a domyślną składnią importu ( import Package from 'package'
), która działa, ale nie kiedy Babel ją analizuje dla pakietów utworzonych w TypeScript (graphql-tools, node-infx, faast itp.) Istnieje jednak obejście, które działa zarówno z, jak --experimental-modules
i wtedy, gdy Babel transponuje twój kod, więc możesz go przetestować za pomocą Jest / Ava / Mocha itp:
import * as ApolloServerM from 'apollo-server'; const ApolloServer = ApolloServerM.default || ApolloServerM;
Prawdopodobnie brzydki, ale w ten sposób możesz napisać własny kod modułów ES z import
/ export
i uruchomić go z node --experimental-modules
, bez transpilerów. Jeśli masz zależności, które nie są jeszcze gotowe na ESM, zaimportuj je jak powyżej, a będziesz mógł używać struktur testowych i innych narzędzi za pośrednictwem Babel.
Poprzednia odpowiedź na pytanie - pamiętaj, nie rób tego, dopóki Node nie rozwiąże problemu z wymaganiami / importem, miejmy nadzieję, że około października 2019.
Publikowanie modułów ES6 do npm z zachowaniem wstecznej kompatybilności
Aby opublikować moduł ES do npmjs.org tak, że może on być importowane bezpośrednio, bez Babel lub innych transpilers, wystarczy wskazać main
pola w package.json
do .mjs
pliku, ale pominąć rozszerzenie:
{
"name": "mjs-example",
"main": "index"
}
To jedyna zmiana. Pomijając rozszerzenie, Node będzie najpierw szukał pliku mjs, jeśli zostanie uruchomiony z --experimental-modules. W przeciwnym razie powróci do pliku .js, więc twój istniejący proces transpilacji do obsługi starszych wersji Node będzie działał jak poprzednio - po prostu upewnij się, że wskazałeś Babel na .mjs
plik (i).
Oto źródło natywnego modułu ES z kompatybilnością wsteczną dla Node <8.5.0, które opublikowałem w NPM. Możesz go teraz używać, bez Babel ani czegokolwiek innego.
Zainstaluj moduł:
npm install local-iso-dt
# or, yarn add local-iso-dt
Utwórz plik testowy test.mjs :
import { localISOdt } from 'local-iso-dt/index.mjs';
console.log(localISOdt(), 'Starting job...');
Uruchom węzeł (v8.5.0 +) z flagą --experimental-modules:
node --experimental-modules test.mjs
Maszynopis
Jeśli programujesz w języku TypeScript, możesz wygenerować kod ES6 i użyć modułów ES6:
tsc index.js --target es6 --modules es2015
Następnie musisz zmienić nazwę *.js
wyjścia na .mjs
, znany problem, który, miejmy nadzieję, wkrótce zostanie naprawiony, aby tsc
można było .mjs
bezpośrednio wyświetlać pliki.