형식 스크립트: 모듈 외부에서 가져오기 문을 사용할 수 없습니다
형식 스크립트: 모듈 외부에서 가져오기 문을 사용할 수 없습니다
노드 js(07.10.19용 node.js의 최신 버전) 앱에 .ts 파일이 있으며 기본 내보내기 없이 노드 모듈을 가져옵니다. 이 구문을 사용합니다: 코드를 실행하면 다음 오류가 발생합니다.
네트워크에서 나는 이 문제에 대한 많은 해결책을 보지만(.js용), 아마도 내가 활자 스크립트 파일을 가지고 있기 때문에 나에게 도움이 되지 않는다. 제 코드는 이렇습니다:
import { Class } from 'abc';
module.exports = { ...
execute(a : Class ,args : Array<string>){ ...
다음은 내 tsconfig.json입니다:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"strict": true
}
}
업데이트: 이 답변이 상당한 조회 수를 얻고 있기 때문에 2022년에 이 문제에 대해 사용 가능한 솔루션을 더 잘 보여주기 위해 업데이트했습니다.
이 오류는 노드가 ECMA스크립트(ES) 모듈을 고려하지 않는 문을 파일에서 발견했음을 의미합니다. 이는 노드에 ES 모듈을 사용 중이라고 알려주지만, 에서 이 유형의 모듈을 더 높게 설정하여 내보내도록 TypeScript 컴파일러에 지시해야 합니다(예: )JS 모듈(), 설정.
프로젝트 수준에서 모듈 시스템을 설정하지 않으려는 경우 더 세분화된 옵션이 있습니다. 확장자가 있는 파일은 항상 ES 모듈로 처리되는 반면, 의 파일은 항상 공통으로 처리됩니다JS 모듈. TypeScript 4.5에서는 확장자와 확장자를 각각 사용할 수 있으며 컴파일러가 출력하거나 파일을 사용할 수 있다.
두 시스템은 부분적으로 호환됩니다. 예를 들어 공통을 가져올 수 있습니다기본 내보내기 기능이 있는 ES 모듈로 JS 모듈 연결:
// in an ES module
import thing from "./main.cjs";
뒤바꿔서요. ES 모듈을 공통으로 가져올 수 있습니다동적 가져오기 기능이 있는 JS 모듈(이 기능을 작동하려면 ES2020 기능이 필요함):
// in a CommonJS module
const thing = await import("./main.mjs");
원답(2020):
에 추가하면 ES2015 모듈을 사용 중임을 노드에 알리며, 이로 인해 오류가 제거되어야 하지만 Typescript에서 대신 이 유형의 모듈을 생성하도록 설정해야 합니다.
그러나 ES6 문을 사용하더라도 공통을 사용하여 내보내기 때문에 현재 코드에 문제가 발생합니다JS 구문 및 노드의 ES 모듈 로더에 문제가 있습니다. 이 문제를 해결하는 방법에는 두 가지가 있습니다:
- module.exports를 유지하되 노드가 이 파일을 공통으로 해석하도록 합니다.cjs 확장자를 지정하여 JS.
- 내보내기 문을 ES2015 구문으로 변경합니다:
첫 번째 옵션은 컴파일러가 .js 파일을 출력하고 항상 .cjs로 변경해야 하기 때문에 약간 까다로울 수 있습니다. 두 번째 옵션을 사용하면 Node로 파일을 실행할 수 있습니다(버전 < 13.8의 --experimental-modules 플래그 포함).
공통 JS를 반드시 사용해야 하는 경우 Node:에 대한 형식 정의를 설치하고 가져오기를 공통으로 변경하는 것이 더 나을 수 있습니다JS 형식: 그리고 나머지 설정을 그대로 유지합니다(패키지에 추가할 수는 있지만).명시적으로 json).
얻을 수 있는 많은 가능성이 있을 수 있습니다,
구문 오류: 모듈 외부에서 가져오기 문을 사용할 수 없습니다
타이프스크립트를 실행하는 동안.
설정할 때 스크립트에서 (have class )라는 모듈을 가져오고 있었습니다.
가졌다,
import {AbClassName} = 'testAdapterDir/AbModule.po.ts';
그러나 모든 파일이 있고 파일이 없습니다. 고친다는 것이다,
아래 코드를 실행하는 동안 오류가 발생할 수 있지만 무시해도 됩니다.
cd AbModule path
tsc *.ts
이제 컴파일된 파일도 모두 포함해야 합니다. 이제 실행하여 언급된 오류가 더 이상 존재하지 않음을 확인합니다,
의 필드가 컴파일된 파일을 가리키고 있는지 확인하십시오
저도 비슷한 문제가 있었어요. 설치하고 항상 스크립트를 시작해야 했습니다
yarn add -D nodemon
꾸러미를 꾸리다.json
"scripts": {
"start": "nodemon index.ts"
}
또는 명령줄에서 파일을 지정합니다
꾸러미를 꾸리다.json
"scripts": {
"nodemon": "nodemon $1"
}
를 사용하는 경우 일부 컴파일러 옵션을 에 특별히 설정할 수 있습니다.
{
"ts-node": {
// these options are overrides used only by ts-node
// same as the --compilerOptions flag and the TS_NODE_COMPILER_OPTIONS environment variable
"compilerOptions": {
"module": "commonjs"
}
},
"compilerOptions": {
"module": "esnext"
}
}
그러면 스크립트를 쉽게 실행할 수 있습니다:
$ ts-node my-script.ts
세트:
"ts-node": {
"compilerOptions": {
"module": "CommonJS"
}
}
옵션이 아닌 경우의 해결 방법
- rename
.ts
to.mts
- run
ts-node --esm file.mts
here's my tsconfig.json
for reference:
{
"compilerOptions": {
"incremental": true,
"target": "ESNext",
"module": "ESNext",
"allowJs": true,
"checkJs": false,
"outDir": "./dist",
"sourceMap": true,
"strict": true,
"alwaysStrict": true,
"moduleResolution": "node",
"esModuleInterop": true
},
"include": ["**/*"]
}
I had similar issue with one Node TypeScript project. I needed some features of ESM, and when changed "target"
and "module"
in tsconfig.json
to ESNext
, I've got an error "Cannot use import statement outside a module".
The solution helped me was:
- implement
"type": "module"
inpackage.json
- implement
"target": "ESNext"
and"module": "NodeNext"
intsconfig.json
(afterwards I checked that"module": "ESNext"
worked as well by the way) - change all import statement in
*.ts
files addingjs
extension like thisimport { AccountGroup } from "./AccountGroup.js"
(despite that actual code in TypeScript project before compilation is insideAccountGroup.ts
file)
Solution was found here and was inspired by this source