Szukałem w Internecie bez jednoznacznej odpowiedzi na to pytanie.
Obecnie NodeJS używa tylko składni CommonJS do ładowania modułów, a jeśli naprawdę chcesz użyć standardowej składni modułów ES2015, musisz ją wcześniej przetransponować lub użyć zewnętrznego modułu ładującego w czasie wykonywania.
Obecnie nie jestem zbyt pozytywny, aby zastosować którąkolwiek z tych dwóch metod, czy opiekunowie NodeJS planują nawet wspierać moduły ES2015, czy nie? W ogóle nie znalazłem żadnej wskazówki na ten temat.
W tej chwili NodeJS 6.x twierdzi, że obsługuje 96% funkcji ES2015, ale nie ma odniesienia do modułów ( łącze do obsługi NodeJS ES2105 ).
Czy wiesz, czy NodeJS będzie obsługiwał te moduły w najbliższej przyszłości?
javascript
node.js
module
ecmascript-6
es6-modules
Zorgatone
źródło
źródło
node es2015 modules
pokazuje następujące jako jeden z najlepszych wyników: github.com/nodejs/node/wiki/ES6-Module-Detection-in-Node .Odpowiedzi:
Węzeł 13.2.0 i powyżej
NodeJS 13.2.0 obsługuje teraz moduły ES bez flagi 🎉 Jednak implementacja jest nadal oznaczona jako eksperymentalna, dlatego należy zachować ostrożność podczas produkcji.
Aby włączyć obsługę ESM w 13.2.0, dodaj następujące elementy do
package.json
:Wszystko
.js
,.mjs
(lub pliki bez rozszerzenia) będą traktowane jako ESM.Istnieje wiele różnych opcji innych niż całe
package.json
opt-in, z których wszystkie są szczegółowo opisane w dokumentacji dla 13.2.0 .Węzeł 13.1.0 i poniżej
Ci, którzy nadal używają starszych wersji Node, mogą wypróbować moduł ładujący esm , który jest gotową do produkcji implementacją specyfikacji modułów ES dla NodeJS:
Szczegółowe aktualizacje ...
23 kwietnia 2019 r
Niedawno wylądował PR, aby zmienić sposób wykrywania modułów ES: https://github.com/nodejs/node/pull/26745
Nadal jest za
--experimental-modules
flagą, ale istnieją znaczne zmiany w sposobie ładowania modułów:package.type
który może byćmodule
lubcommonjs
type: "commonjs"
:.js
jest analizowany jako commonjstype: "module"
:.js
jest analizowany jako esm--type=[mode]
aby ustawić typ w punkcie wejścia. Zastąpipackage.type
punkt wejścia..cjs
.module
trybie.--es-module-specifier-resolution=[type]
explicit
(domyślne) inode
--es-module-specifier-resolution=node
aby włączyć algorytm rozwiązywania specyfikacji specyfikatora commonjs--experimental-json-loader
"type": "module"
import 'thing.json'
przejdzie przez eksperymentalny moduł ładujący niezależnie od trybupackage.main
aby ustawić punkt wejścia dla modułu17 stycznia 2019 r
Węzeł 11.6.0 nadal wymienia moduły ES jako eksperymentalne, za flagą.
13 września 2017 r
NodeJS 8.5.0 został wydany z obsługą plików mjs za flagą:
Plan polega na usunięciu flagi dla wersji 10.0 LTS.
- Nieaktualne informacje. Trzymane tutaj do celów historycznych--
8 września 2017 r
Główny oddział NodeJS został zaktualizowany z początkową obsługą modułów ESM:
https://github.com/nodejs/node/commit/c8a389e19f172edbada83f59944cad7cc802d9d5
Powinno to być dostępne najpóźniej w nocy (można to zainstalować za pomocą nvm, aby działać równolegle z istniejącą instalacją):
https://nodejs.org/download/nightly/
I włączony za
--experimental-modules
flagą:pakiet.json
Następnie uruchomić:
Luty 2017 r .:
https://medium.com/@jasnell/an-update-on-es6-modules-in-node-js-42c958b890c#.6ye7mtn37
Chłopaki z NodeJS zdecydowali, że najmniej złym rozwiązaniem jest użycie
.mjs
rozszerzenia pliku. Na wynos jest to:A co do osi czasu ...
Październik 2016 r .:
Jeden z programistów Node.JS ostatnio uczestniczył w spotkaniu TC-39 i napisał świetny artykuł na temat blokowania implementacji dla Node.JS:
https://hackernoon.com/node-js-tc-39-and-modules-a1118aecf95e
Podstawowym podejściem do tego jest:
*.mjs
wydaje się najbardziej prawdopodobnym rozwiązaniem, chyba że potrafią dokładnie wykryć moduł ES bez udziału użytkownika- Oryginalna odpowiedź -
To był gorący ziemniak od dłuższego czasu. Najważniejsze jest to, że tak, Node ostatecznie będzie obsługiwał składnię ES2015 do importowania / eksportowania modułów - najprawdopodobniej, gdy specyfikacja modułów ładujących zostanie sfinalizowana i uzgodniona.
Oto dobry przegląd tego, co powstrzymuje NodeJS. Zasadniczo muszą upewnić się, że nowa specyfikacja działa dla Węzła, który jest przede wszystkim warunkowy, ładowanie synchroniczne, a także HTML, który jest przede wszystkim asynchroniczny.
Obecnie nikt nie wie na pewno, ale wyobrażam sobie, że Node będzie obsługiwał
import/export
ładowanie statyczne, oprócz nowegoSystem.import
do ładowania dynamicznego - przy jednoczesnym zachowaniurequire
starszego kodu.Oto kilka propozycji, jak Node może to osiągnąć:
źródło
.mjs
rozszerzenie:We have affectionately called these “Michael Jackson Script” files in the past
. Na wypadek, gdybyś usłyszał, jak ktoś mówi o artystach popowych podczas rozmowy JS.import * from 'foo'
potraktuje foo.js tak jak CommonJSimport * as bar from 'bar'
potraktuje bar.js jako moduł ES6 Czy ktoś może to wyjaśnić?