개발하자

형식 스크립트: 모듈 외부에서 가져오기 문을 사용할 수 없습니다

Cuire 2023. 1. 9. 23:23
반응형

형식 스크립트: 모듈 외부에서 가져오기 문을 사용할 수 없습니다

노드 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:

  1. implement "type": "module" in package.json
  2. implement "target": "ESNext" and "module": "NodeNext" in tsconfig.json (afterwards I checked that "module": "ESNext" worked as well by the way)
  3. change all import statement in *.ts files adding js extension like this import { AccountGroup } from "./AccountGroup.js" (despite that actual code in TypeScript project before compilation is inside AccountGroup.ts file)

Solution was found here and was inspired by this source


반응형