Typescript ReferenceError : 내보내기가 정의되지 않았습니다.


105

공식 핸드북에 따라 모듈을 구현하려고 하면이 오류 메시지가 표시됩니다.

포착되지 않은 ReferenceError : 내보내기가 정의되지 않았습니다.

app.js : 2에서

그러나 내 코드 어디에도 이름을 사용하지 않습니다 exports.

이 문제를 어떻게 해결할 수 있습니까?


파일

app.ts

let a = 2;
let b:number = 3;

import Person = require ('./mods/module-1');

module-1.t

 export class Person {
  constructor(){
    console.log('Person Class');
  }
}
export default Person;

tsconfig.json

{
   "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "noImplicitAny": false,
        "sourceMap": true,
        "outDir": "scripts/"
    },
    "exclude": [
        "node_modules"
    ]
}

스크린 샷을 사용하는 대신 오류 텍스트를 복사하여 질문에 붙여 넣으십시오.
이고르

당신은 당신이 입력하지 않은 확신 exports 대신 말 export? s 가 잘못된 것처럼 오류 메시지를 설명합니다 .
이고르

내가 형 수출 되지 수출
조지 C.

repositorie에서 어떤 예를 들어 그 Gona을 작업 1만퍼센트
조지 C.

이것이 어디에서 실행되고 있습니까? 웹 페이지에서? node.js 서버에서? 자바 스크립트가 최종적으로 실행되는 런타임 환경에서 모듈 로더가 필요합니다. 컴파일러 플래그에서 commonjs를 사용하고 있습니다. 저는 commonjs에 익숙하지 않지만 Typescript 모듈이 작동하기 전에 commonjs를 설정해야합니다. 그렇지 않으면 다른 모듈 로더 (예 : require.js)로 변경하여 설정해야합니다.
Mike Wodarczyk

답변:


41

편집하다:

이 답변은 es5더 이상 타겟팅 하지 않으면 작동하지 않을 수 있으므로 답변을 더 완벽하게 만들려고 노력할 것입니다.

원래 답변

CommonJS가 설치되어 있지 않은 경우 ( 정의exports ) 다음 행을 제거해야합니다 tsconfig.json.

 "module": "commonjs",

의견에 따르면 이것만으로는 이후 버전에서 작동하지 않을 수 있습니다 tsc. 이 경우 CommonJS, SystemJS 또는 RequireJS와 같은 모듈 로더를 설치 한 다음 지정할 수 있습니다.

노트 :

생성 된 main.js파일을 보십시오 tsc. 이것은 맨 위에 있습니다.

Object.defineProperty(exports, "__esModule", { value: true });

오류 메시지의 근원 "module": "commonjs",이며을 제거한 후에 는 사라집니다.


3
그래, 내 .ts 파일을 다시 컴파일하고 주석 처리 후에도 오류가 여전히 존재합니다 "module": "commonJs",:(
Acidic9

2
CommonJS를 설치하면이 오류가 사라지면 실제로 CommonJS를 어떻게 설치합니까? 한 시간 인터넷 검색의 좋은 부분을 보냈습니다, 나는 찾을 수 있는 이 작업을 수행하는 방법에 대한 지침. 사람이 할 수 주십시오 설명?
Sturm

1
@Sturm 내 대답이 혼란 스러울 수 있습니다. CommonJS는 사양 일뿐입니다. 여기에서 구현 목록을 찾을 수 있습니다. en.wikipedia.org/wiki/CommonJS
iFreilicht 2018 년

1
module : commonjs가 아닌 모듈 : amd가 있고, 트랜스 파일 된 .js 파일에이 줄이 있습니다.
pabrams

2
tsconfig.json에 ES3 또는 ES5로 대상이있는 경우 typescript는 정의되지 않은 경우 자동으로 모듈을 CommonJS로 설정합니다. 모듈을 제거하는 것만으로는 충분하지 않습니다. 대신 다른 것을 설정해야합니다. typescriptlang.org/docs/handbook/compiler-options.html
Jake

51

이 문제에 대한 몇 가지 다른 해결책

  • Javascript에 대한 다른 참조 앞에 다음 행을 추가하십시오. 이것은 멋진 작은 해킹입니다.
   <script>var exports = {};</script>
  • 이 문제는 최신 버전의 TypeScript에서 발생합니다.이 오류는 typescript 버전 2.1.6을 참조하여 제거 할 수 있습니다.


3
나는 이것이 작동하는 것이 싫다! 그리고 그것은 확실히 작동합니다. TypeScript를 Node가 기대하는 것으로 변환하는 방법이 없습니까? 불평하는 노드조차 있습니까? 아니면 브라우저입니까? 나는 문제가 실제로 무엇인지 이해하지 못합니다.
skillit zimberg

7

npm install @babel/plugin-transform-modules-commonjs

.babelrc 플러그인에 추가하면 내 질문이 해결되었습니다.


7

내 솔루션은 내가 추가 한 작은 트릭으로 위의 모든 것을 요약 한 것입니다. 기본적으로 이것을 내 HTML 코드에 추가했습니다.

<script>var exports = {"__esModule": true};</script>
<script src="js/file.js"></script>

이것은 심지어 당신이 전자 또는 무언가 를 사용하는 import대신 사용할 수 있도록 허용 require하며 typescript 3.5.1, target : es3-> esnext에서 잘 작동합니다.


3
여기에 약간의 진행이 app.js:3 Uncaught ReferenceError: require is not defined
있었지만

이는 창을 만들 때 nodeIntegration이 false로 설정된 경우 발생하며, electronJS를 업데이트했거나 오래된 소스를 따르고 있기 때문에 오류가 발생합니다. nodeIntegration은 기본적으로 true 였지만 이제는 false이므로 렌더러 프로세스에서 nodeJS에 액세스하려면 수동으로 활성화해야합니다. [Electron require ()가 정의되지 않음] [1] [1] : stackoverflow.com/questions/44391448/…
Hocine Abdellatif

나는 전자를 사용하지 않는다. 어쨌든 나는 묶음을 만들기 위해 소포를 추가하고 다른 까다로운 방법을 제거함으로써 나의 경우에 해결했다
Muhammed Moussa


5

같은 문제가 발생 하여 다음과 같이 tsconfig.json에 " es5 "라이브러리를 추가하여 해결했습니다 .

{
    "compilerOptions": {
        "target": "es5", //defines what sort of code ts generates, es5 because it's what most browsers currently UNDERSTANDS.
        "module": "commonjs",
        "moduleResolution": "node",
        "sourceMap": true,
        "emitDecoratorMetadata": true, //for angular to be able to use metadata we specify in our components.
        "experimentalDecorators": true, //angular needs decorators like @Component, @Injectable, etc.
        "removeComments": false,
        "noImplicitAny": false,
        "lib": [
            "es2016",
            "dom",
            "es5"
        ]
    }
}

5

여전히이 문제가있는 사람들을 위해 컴파일러 대상이 ES6으로 설정되어 있으면 babel에게 모듈 변환을 건너 뛰도록 지시해야합니다. 이렇게하려면 .babelrc파일에 추가하세요.

{
  "presets": [ ["env", {"modules": false} ]]
}

1
감사합니다! 나는 모든 것을 전역으로 덤프하고 스크립트가 <script>태그 와 함께 브라우저에 포함되는 이전 코드베이스로 작업하려고 노력해 왔습니다 . 이전 코드와 함께 모듈을 사용하고 싶었는데 불가능한 것 같습니다. 이것은 적어도 ES6를 사용하고 나중에 내보내기를 처리 할 수있게합니다.
huggie의

2
이렇게하면 다음 오류가 발생합니다. Using removed Babel 5 옵션 : .modules-옵션에서 해당 모듈 변환 플러그인을 사용합니다 plugins. 확인 babeljs.io/docs/plugins/#modules
chharvey

5

module컴파일러 옵션을 es6다음과 같이 설정하면이 문제가 해결 됩니다 .

{
  "compilerOptions": {     
    "module": "es6",
    "target": "es5",    
  }
}

3

나도 이와 같은 오류가 발생했습니다. 제 경우에는 TypeScript AngularJS 프로젝트에 다음과 같은 구식 import 문이 있었기 때문입니다.

import { IAttributes, IScope } from "angular";

다음과 같이 JavaScript로 컴파일되었습니다.

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });

이것은 우리 IAttributes가 코드에서 사용 했고 TypeScript가 그렇지 않으면 무엇을해야할지 알지 못했기 때문에 옛날에 필요 했습니다. 그러나 import 문을 제거하고, 변환 한 후 IAttributesng.IAttributes두 자바 스크립트 라인 사라 - 그래서 오류 메시지가 않았다.


1
Typescript 유형에서는 어떻게 작동합니까? 가져와야하므로 Typescript에서 컴파일합니다.
BluE

"Typescript 유형"이란 무엇을 의미합니까? TypeScript에서 알려진 정수 유형 (예 : 숫자 또는 문자열) 인 경우 즉시 사용할 수 있습니다. 모듈에서 고유 한 유형을 정의하는 경우 다음을 확인하십시오. typescriptlang.org/docs/handbook/modules.html
MatX

나는 npmjs.com/package/@types/jquery의 @ types / jquery와 같은 외부 라이브러리의 유형 정의를 의미했습니다 . Typescript 코드 내에서 $ 변수를 사용할 수 있도록하기 위해 코드에 다음을 입력합니다. import * as $ from "jquery";
BluE 2019

es5를 대상으로하고 있는데,이 작업을 수행하려면 requirejs와 같은 다른 라이브러리가 필요합니까?
BluE

1

간단히 추가하십시오 libraryTarget: 'umd'.

const webpackConfig = {
  output: {
    libraryTarget: 'umd' // Fix: "Uncaught ReferenceError: exports is not defined".
  }
};

module.exports = webpackConfig; // Export all custom Webpack configs.

1

나를 위해 "esModuleInterop": truetsconfig.json 에서 제거 하면 트릭이 발생했습니다.


0

일부 ASP.NET 프로젝트의 경우 importexport귀하의 타이프 친의 모든에서 사용할 수 없습니다.

그렇게하려고 할 때 질문의 오류가 나타 났고 나중에 생성 된 JS 스크립트를 다음 과 같이 View 에 추가해야한다는 것을 알게되었습니다 .

<script src="~/scripts/js/[GENERATED_FILE].Index.js" asp-append-version="true"></script>

0

@iFreilicht가 위에서 제안한 것을 시도하십시오. 웹팩과 모든 것을 설치 한 후에도 작동하지 않으면 온라인 어딘가에서 웹팩 구성을 복사하여 출력이 실수로 CommonJS를 지원하도록 구성했을 수 있습니다. 다음과 같은 경우가 아닌지 확인하십시오 webpack.config.js.

module.exports = {
  mode: process.env.NODE_ENV || "development",
  entry: { 
    index: "./src/js/index.ts"
  },
  ...
  ...
  output: {
    libraryTarget: 'commonjs',         <==== DELETE THIS LINE
    path: path.join(__dirname, 'build'),
    filename: "[name].bundle.js"
  }
};

0

같은 문제가 있었고 JS 패키지 로딩 순서를 변경하여 수정했습니다.

필요한 패키지가 호출되는 순서를 확인하고 적절한 순서로로드하십시오.

내 특정 사건에 내가 부하에 필요한 (모듈 들러를 사용하지 않는) Redux, 다음 Redux Thunk, 다음 React Redux. React Redux전에 로드 Redux Thunk하면 나에게 줄 것이다 exports is not defined.


0

참고 : 이것은 OP의 답변에 적용되지 않을 수 있지만이 오류가 발생했으며 이것이 해결 방법입니다.

그래서 제가 직면 한 문제는 특정 CDN에서 'js'라이브러리를 검색 할 때이 오류가 발생한다는 것입니다.

내가 한 유일한 잘못된 일은 CDN의 cjs디렉토리에서 다음과 같이 가져 오는 것입니다 . https://cdn.jsdelivr.net/npm/@popperjs/core@2.4.0/dist/cjs/popper.min.js

dist/cjs부품이 보이 시나요 ? 그게 문제였습니다.

제 경우에는 CDN (jsdelivr)으로 돌아가 umd폴더 를 찾았습니다 . 그리고 나는 또 다른 세트 찾을 수있는 popper.min.js수입에 대한 올바른 파일이었다을 : https://cdn.jsdelivr.net/npm/@popperjs/core@2.4.0/dist/umd/popper.min.js.


0
  {
    "compileOnSave": false,
    "compilerOptions": {
      "baseUrl": "./",
      "outDir": "./dist",
      "sourceMap": true,
      "declaration": false,
      "module": "esnext",
      "moduleResolution": "node",
      "emitDecoratorMetadata": true,
      "experimentalDecorators": true,
      "target": "es5",
      "typeRoots": ["node_modules/@types"],
      "lib": ["es2018", "dom"]
    }
  }

5
StackOverflow에 오신 것을 환영합니다. 사용자가 수행 한 작업을 이해할 수 있도록 답변이나 설명에 컨텍스트를 추가하십시오. JSON 게시 만별로 도움이되지 않을 수 있습니다 ...
Bruno Monteiro

0

동일한 문제가 있었지만 설정에는 다른 솔루션이 필요했습니다.

내가 사용하고 create-react-app-rewired로 패키지를 config-overrides.js파일. 이전에는 addBabelPresets가져 오기 ( override()방법에서)를 사용하고 있었으며 customize-cra이러한 사전 설정을 별도의 파일로 추상화하기로 결정했습니다. 우연히 이것은 내 문제를 해결했습니다.

useBabelRc()override()메서드에 추가 하고 다음과 같은 파일을 config-overrides.js만들었습니다 babel.config.js.

module.exports = {
    presets: [
        '@babel/preset-react',
        '@babel/preset-env'
    ],
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.