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"
    ]
}

スクリーンショットを使用する代わりに、エラーテキストをコピーして質問に貼り付けてください。
イゴール

代わりに最後にsを入力exportsしていませんか?これは、sのエラーメッセージが間違っていることを説明しています。export
イゴール

I型輸出ない輸出
ジョージ・C.

gonaが10000%機能するリポジトリの例
George C.

これはどこで実行されていますか?ウェブページで?node.jsサーバーでは?JavaScriptが最終的に実行されるランタイム環境にモジュールローダーが必要になります。コンパイラフラグからcommonjsを使用しています。私はcommonjsにはあまり詳しくありませんが、Typescriptモジュールが機能する前にcommonjsをセットアップする必要があります。
Mike Wodarczyk 2017

回答:


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をインストールするにはどうすればよいですか?私は1時間の大部分をグーグルで過ごしましたが、その方法に関する指示を見つけることができません。誰かがすることができますしてください説明しますか?
シュトゥルム

1
@Sturm私の答えは紛らわしい言葉遣いがあるかもしれません。CommonJSは仕様にすぎません。(必ずしも網羅的ではありませんが)実装のリストは、ここにあります:en.wikipedia.org/wiki/CommonJS
iFreilicht

1
module:commonjsではなく、module:amdがあります。また、この行は、変換された.jsファイルにあります。
パブラム

2
tsconfig.jsonでES3またはES5としてターゲットを設定している場合、モジュールが定義されていなければ、typescriptによってモジュールがCommonJSに自動的に設定されます。モジュールを削除するだけでは不十分です。代わりに何かを設定する必要があります。typescriptlang.org/ docs / handbook / compiler
Jake

51

この問題の他の解決策はほとんどありません

  • JavaScriptへの他の参照の前に次の行を追加します。これは素晴らしいハックです。
   <script>var exports = {};</script>
  • この問題は、TypeScriptの最新バージョンで発生します。このエラーは、typescriptバージョン2.1.6を参照することで解消できます。


3
これがうまくいくのは嫌です!そして、それは間違いなく動作します。TypeScriptをノードが期待するものにトランスパイルする方法はありませんか?不平を言っているのはノードです?それともブラウザですか?私は問題が実際に何であるか理解できずに我慢できません。
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>

これは、electronか何かを使用している場合のimport代わりに使用することもできrequire、typescript 3.5.1、ターゲット:es3-> esnextで正常に動作します。


3
ここでいくつかの進歩、エラーは次のように変わりましたapp.js:3 Uncaught ReferenceError: require is not defined
ムハメッドムサ

これは、ウィンドウの作成時にnodeIntegrationがfalseに設定されている場合に発生します。エラーは、electronJSを更新したか、古いソースをフォローしているために発生します。nodeIntegrationはデフォルトでtrueでしたが、現在はfalseになっているため、レンダラープロセスでnodeJSにアクセスする場合は、手動で有効にする必要があります。[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を使用でき、後でエクスポートを処理できます。
ハギー2018

2
これを行うと、次のエラーが発生しました:削除された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ステートメントを削除し、それらの2つのJavaScript行に変換IAttributesするng.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

私は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.


0

一部のASP.NETプロジェクトimportexportは、Typescriptsでまったく使用されない場合があります。

質問のエラーが表示されたところ、エラーメッセージが表示されましたが、生成されたJSスクリプトを次のようにビューに追加するだけでよいことが後でわかりました。

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

0

上記の@iFreilichtの提案を試してください。webpackをすべてインストールした後で問題が解決しない場合は、オンラインのどこかからwebpack構成をコピーし、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 ReduxReact 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ます。以前はaddBabelPresetsoverride()メソッドで)のインポートを使用していた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.