Mam plik .ts w aplikacji node js (najnowsza wersja node.js dla 07.10.19) z importowanym modułem node bez domyślnego eksportu. Używam tej konstrukcji: import { Class } from 'abc';
Kiedy uruchomić kod, mam ten błąd: Cannot use import statement outside a module
.
W sieci widzę wiele rozwiązań tego problemu (dla .js), ale to mi nie pomaga, może dlatego, że mam plik maszynopisu. Oto mój kod:
import { Class } from 'abc';
module.exports = { ...
execute(a : Class ,args : Array<string>){ ...
Oto mój tsconfig.json:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"strict": true
}
}
typescript
ecmascript-6
Zerumi
źródło
źródło
import
instrukcja jest pierwszym wierszem w twoim pliku?require
vsimport
). Aby pokazać, jak to jest skomplikowane, Node ma dokumentację na tematimport
vsrequire
i jak je ze sobą współpracować.module.exports
składni, prawdopodobnie nie jesteś w module ES6.execute(a : abc.Class...
Odpowiedzi:
Dodanie
“type”: “module”
do package.json poinformuje Node, że używasz modułów ES2015, co powinno pozbyć się błędu, ale wtedy będziesz musiał powiedzieć Typescript, aby wygenerował ten typ modułu, ustawiając“module”: “es2015”
zamiast“commonjs”
w tsconfig.json.Powoduje to jednak problem z bieżącym kodem, ponieważ chociaż używasz
import {}
instrukcji ES6 , eksportujesz przy użyciumodule.exports = {}
składni commonJS , a moduł ładujący modułu ES Node będzie miał z tym problem. Istnieją dwa sposoby radzenia sobie z tym:module.exports
ale powiedz Node, aby zinterpretował ten plik jako commonJS, nadając mu rozszerzenie .cjs .export function execute(…)..
Pierwsza opcja może być nieco trudna, ponieważ kompilator wyświetli pliki .js i będziesz musiał cały czas zmieniać ją na .cjs (o ile mi wiadomo). Z drugą opcją powinieneś być w stanie uruchomić plik z Węzłem (włączając flagę --experimental-modules dla wersji <13.8).
Jeśli absolutnie potrzebujesz użyć commonJS, być może lepiej jest zainstalować definicje typów dla Node: @ types / node i zmienić import na format commonJS:
require('abc')
i zachować pozostałe ustawienia bez zmian (chociaż możesz dodać „type” : „Commonjs” to package.json).źródło