Nie rozumiem co jest nie tak. Węzeł v5.6.0 NPM v3.10.6
Kod:
function (exports, require, module, __filename, __dirname) {
import express from 'express'
};
Błąd:
SyntaxError: Unexpected token import
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:387:25)
at Object.Module._extensions..js (module.js:422:10)
at Module.load (module.js:357:32)
at Function.Module._load (module.js:314:12)
at Function.Module.runMain (module.js:447:10)
at startup (node.js:140:18)
at node.js:1001:3
javascript
node.js
npm
ecmascript-6
SofDroid
źródło
źródło
Odpowiedzi:
Aktualizacja 3: Od Węzła 13 możesz użyć rozszerzenia .mjs lub ustawić „type”: „module” w pliku package.json. Ci nie muszą korzystać z
--experimental-modules
flagą.Aktualizacja 2: Od Węzła 12 możesz użyć
.mjs
rozszerzenia lub ustawić"type": "module"
w pliku package.json. I musisz uruchomić węzeł z--experimental-modules
flagą.Aktualizacja: W węźle 9 , jest on włączony za flagą, i używa
.mjs
rozszerzenia.Chociaż
import
jest rzeczywiście częścią ES6, niestety nie jest jeszcze domyślnie obsługiwany w NodeJS i dopiero niedawno otrzymał wsparcie w przeglądarkach.Zobacz tabelę kompatybilności przeglądarki w MDN i ten problem z węzłem .
Z aktualizacji Jamesa M. Snella w sprawie modułów ES6 w Node.js (luty 2017 r.):
Dopóki wsparcie nie pojawi się natywnie, będziesz musiał nadal używać klasycznych
require
instrukcji:Jeśli naprawdę chcesz korzystać z nowych funkcji ES6 / 7 w NodeJS, możesz je skompilować za pomocą Babel. Oto przykładowy serwer .
źródło
Niestety, Node.js nie obsługuje
import
jeszcze ES6 .Aby zrealizować to, co próbujesz zrobić (zaimportuj moduł Express), ten kod powinien wystarczyć
Upewnij się również, że masz zainstalowany Express, uruchamiając
Zobacz Dokumenty Node.js, aby uzyskać więcej informacji na temat nauki Node.js.
źródło
import
niekoniecznie jest funkcją TypeScript. TypeScript to ES6 z czcionkami. Więc rzeczy takie jak import są natywne ES6.node index.js
działa dla mnie, ale kiedy biegnęnode dist/main.js
, też dostajęUnexpected token import
.index.js
przemijanie, nie oznacza, że twojedist/main.js
przeminie.Jak wspomniano w innych odpowiedziach, węzeł JS obecnie nie obsługuje importu ES6.
(Na razie czytaj EDYCJA 2)
Włącz import ES6 w węźle js stanowi rozwiązanie tego problemu. Próbowałem tego i zadziałało to dla mnie.
Uruchom polecenie:
Teraz musisz utworzyć nowy plik (config.js) i dodać do niego następujący kod.
Teraz możesz pisać instrukcje importu bez żadnych błędów.
Mam nadzieję że to pomoże.
EDYTOWAĆ:
Musisz uruchomić nowy plik utworzony za pomocą powyższego kodu. W moim przypadku tak było
config.js
. Więc muszę uruchomić:EDYCJA 2:
Podczas eksperymentów znalazłem jedno łatwe rozwiązanie tego problemu.
Utwórz
.babelrc
plik w katalogu głównym swojego projektu.Dodaj następujące (i inne potrzebne ustawienia babel, które można dodać w tym pliku):
Zainstaluj
babel-preset-env
za pomocą polecenianpm install babel-preset-env --save
, a następnie zainstalujbabel-cli
za pomocą polecenianpm install babel-cli -g --save
Teraz przejdź do folderu, w którym znajduje się twój serwer lub plik indeksu i uruchom używając: babel-node fileName.js
Lub możesz uruchomić
npm start
, dodając następujący kod do swojegopackage.json
pliku:źródło
"start": "babel-node electron .",
ale bez powodzeniaBłąd: Błąd składni: nieoczekiwany import tokenu lub Błąd składni: nieoczekiwany eksport tokenu
Rozwiązanie: zmień cały import jako przykład
A także zmień
export default = foo;
namodule.exports = foo;
źródło
Jestem zszokowany
esm
, nie wspomniano. Ten niewielki, ale potężny pakiet pozwala na użycie jednegoimport
lub jednegorequire
.Zainstaluj ESM w swoim projekcie
$ npm install --save esm
Zaktualizuj skrypt uruchamiania węzła, aby używać esm
node -r esm app.js
esm
po prostu działa. Zmarnowałem TONĘ czasu.mjs
i--experimental-modules
tylko aby dowiedzieć się, że.mjs
plik nie może zaimportować pliku, który używarequire
lubmodule.exports
. To był ogromny problem, aleesm
pozwala na miksowanie i dopasowywanie, a to po prostu wymyśla ...esm
po prostu działa.źródło
Jeśli nadal nie możesz użyć opcji „importuj”, oto jak sobie z tym poradziłem: po prostu przetłumacz to na wymaganie przyjazne dla węzła. Przykład:
Jest taki sam jak:
źródło
export
słowa kluczowegoexport
słowa kluczowego, i tak dziękuję za twoją pomocną notatkę!Babel 7 propozycja można dodać zależności deweloperów
i dodaj .babelrc w katalogu głównym
i dodaj do pliku .js
lub jeśli uruchomisz go w cli, możesz użyć wymaganego hooka jako -r @ babel / register, np.
źródło
jeśli możesz użyć „babel”, spróbuj dodać skrypty kompilacji w package.json (- presets = es2015) jak poniżej. sprawia, że prekompiluje kod importu do es2015
źródło
npm start
najpierw wykonać „kompilację”, czy najpierw „rozpocząć”? (Początek jest obecnie zdefiniowany:"nodemon src/app.js --exec \"npm run lint && node\"",
Począwszy od wersji 12 Node.js (i jest to prawdopodobnie teraz dość stabilne, ale nadal oznaczone jako „eksperymentalne”), masz kilka opcji korzystania z ESM ( E CMA S cript M odules) w node.js (dla plików, istnieje trzeci sposób sprawdzania ciągów), oto co mówi dokumentacja :
źródło
Kiedy zaczynałem od express, zawsze chciałem użyć rozwiązania importującego zamiast tego
Wiele razy przechodzi przez tę linię:
Unfortunately, Node.js doesn't support ES6's import yet.
Teraz, aby pomóc innym, tworzę tutaj dwa nowe rozwiązania
1) esm : -
Genialnie prosta, bezkolumnowa, bezkompletowa ładowarka modułów ECMAScript. niech to zadziała
utwórz plik start.js lub użyj przestrzeni nazw
Zmień
package.josn
ścieżkę przejściastart.js
2) Babel js : -
Można to podzielić na 2 części
a) Rozwiązanie 1 dzięki timonweb.com
b) Rozwiązanie 2
użyj Babel 6 (starsza wersja babel-preset-stage-3 ^ 6.0 ) utwórz
.babelrc
plik w folderze głównymZainstaluj babel-preset-stage-3
Zmień pakiet.json
Uruchom serwer
O nie, tworzymy nowy problem
Ten błąd pojawia się tylko wtedy, gdy używasz asynchronizacji / oczekiwania w kodzie. Następnie użyj polyfill, który zawiera niestandardowe środowisko uruchomieniowe regeneratora i core-js. dodaj na górze
index.js
Pozwala to na użycie asynchronizacji / oczekiwania
użyj Babel 7
Musisz zaktualizować każdą rzecz w swoim projekcie, zacznijmy od babel 7 .babelrc
Niektóre zmiany w pakiecie.json
i użyj
import "@babel/polyfill"
w punkcie początkowymZastanawiasz się dlaczego
start:dev
Poważnie. To dobre pytanie, czy jesteś nowy. Za każdym razem,
yarn start:dev
gdy jesteś dziczy z serwerem startowym, za każdym razem używaj go jako serwera programistycznego. Każda zmiana automatycznie uruchamia serwer ponownie, aby uzyskać więcej informacji o nodemonieźródło
W moim przypadku opiekował się
.babelrc
plikiem i powinien zawierać coś takiego:źródło