Typescript ReferenceError: Exporte sind nicht definiert

104

Beim Versuch, ein Modul gemäß dem offiziellen Handbuch zu implementieren, wird folgende Fehlermeldung angezeigt:

Nicht erfasster Referenzfehler: Exporte sind nicht definiert

bei app.js: 2

Aber nirgends in meinem Code verwende ich jemals den Namen exports.

Wie kann ich das beheben?


Dateien

app.ts

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

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

Modul-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"
    ]
}
George C.
quelle
Bitte kopieren Sie den Fehlertext und fügen Sie ihn in die Frage ein, anstatt Screenshots zu verwenden.
Igor
Sind Sie sicher, dass Sie nicht exportsmit einem s am Ende statt mit exportgetippt haben? Das würde die Fehlermeldung erklären, da mit s falsch ist.
Igor
Ich tippe Export nicht Exporte
George C.
Jedes Beispiel aus einem Repositorie, das zu 10000% funktioniert
George C.
Wo läuft das? Auf einer Webseite? Auf einem node.js Server? In der Laufzeitumgebung, in der das Javascript schließlich ausgeführt wird, benötigen Sie einen Modullader. In den Compiler-Flags verwenden Sie commonjs. Ich bin mit commonjs nicht so vertraut, aber Sie müssen commonjs einrichten, bevor Typescript-Module funktionieren, oder Sie müssen zu einem anderen Modullader (wie require.js) wechseln und diesen einrichten.
Mike Wodarczyk

Antworten:

41

BEARBEITEN:

Diese Antwort funktioniert möglicherweise nicht, je nachdem, ob Sie nicht es5mehr zielen . Ich werde versuchen, die Antwort vollständiger zu gestalten.

Ursprüngliche Antwort

Wenn CommonJS nicht installiert ist ( was definiertexports ), müssen Sie diese Zeile aus Ihrem entfernen tsconfig.json:

 "module": "commonjs",

Gemäß den Kommentaren funktioniert dies möglicherweise nicht mit späteren Versionen von tsc. In diesem Fall können Sie einen Modullader wie CommonJS, SystemJS oder RequireJS installieren und diesen dann angeben.

Hinweis:

Sehen Sie sich Ihre generierte main.jsDatei an tsc. Sie finden dies ganz oben:

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

Es ist die Wurzel der Fehlermeldung und nach dem Entfernen "module": "commonjs",verschwindet sie.

iFreilicht
quelle
3
Ja, ich habe meine .ts-Datei neu kompiliert und der Fehler besteht nach dem "module": "commonJs",
Auskommentieren
2
Wenn durch die Installation von CommonJS dieser Fehler behoben wird, wie installiert man dann tatsächlich CommonJS? Ich habe den größten Teil einer Stunde mit Googeln verbracht und kann keine Anweisungen dazu finden . Kann mir bitte jemand erklären?
Sturm
1
@Sturm Meine Antwort kann verwirrend formuliert sein. CommonJS ist nur eine Spezifikation. Eine (nicht unbedingt vollständige) Liste der Implementierungen finden Sie hier: en.wikipedia.org/wiki/CommonJS
iFreilicht
1
Ich habe module: amd, nicht module: commonjs, und ich habe diese Zeile in meiner transpilierten .js-Datei.
Pabrams
2
Wenn Sie in Ihrer Datei tsconfig.json ein Ziel als ES3 oder ES5 haben, setzt Typoskript Ihr Modul automatisch auf CommonJS, wenn es nicht definiert ist. Das Entfernen des Moduls reicht nicht aus, Sie müssen stattdessen etwas anderes festlegen - siehe typescriptlang.org/docs/handbook/compiler-options.html
Jake
51

Nur wenige andere Lösungen für dieses Problem

  • Fügen Sie die folgende Zeile vor anderen Verweisen auf Javascript hinzu. Das ist ein netter kleiner Hack.
   <script>var exports = {};</script>
  • Dieses Problem tritt bei der neuesten Version von TypeScript auf. Dieser Fehler kann durch Bezugnahme auf Typoskript Version 2.1.6 behoben werden
Venkatesh Muniyandi
quelle
3
@ChuckLeButt Hoffe, dies hilft stackoverflow.com/questions/19059580/…
Venkatesh Muniyandi
2
Ich hasse es, dass das funktioniert! Und es funktioniert definitiv. Gibt es nicht eine Möglichkeit, TypeScript dazu zu bringen, sich in etwas zu verwandeln, das Node erwartet? Beschwert sich überhaupt Node? Oder ist es der Browser? Ich kann es nicht ertragen, nicht zu verstehen, was das Problem tatsächlich ist.
Skillit Zimberg
7

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

und zu .babelrc Plugins hinzufügen löste meine Frage.

Yi Zhang
quelle
7

Meine Lösung ist eine Zusammenfassung von allem oben mit kleinen Tricks, die ich hinzugefügt habe. Im Grunde habe ich dies meinem HTML-Code hinzugefügt

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

Dies ermöglicht es Ihnen sogar, importanstatt zu verwenden, requireob Sie ein Elektron oder etwas anderes verwenden, und es funktioniert gut mit Typoskript 3.5.1, Ziel: es3 -> esnext.

Hocine Abdellatif
quelle
3
Einige Fortschritte hier, der Fehler hat sich gerade geändertapp.js:3 Uncaught ReferenceError: require is not defined
Muhammed Moussa
Dies passiert, wenn nodeIntegration beim Erstellen des Fensters auf false gesetzt ist. Der Fehler tritt auf, weil Sie Ihr ElectronJS aktualisiert haben oder einer veralteten Quelle folgen. nodeIntegration war standardmäßig true, jetzt ist es false. Sie müssen es also manuell aktivieren, wenn Sie im Renderer-Prozess auf nodeJS zugreifen möchten. Siehe [Electron require () ist nicht definiert] [1] [1]: stackoverflow.com/questions/44391448/…
Hocine Abdellatif
Ich benutze sowieso kein Elektron, aber ich habe es in meinem Fall gelöst, indem ich ein Paket hinzugefügt habe, um Bündel zu machen, und andere knifflige Wege entfernt habe
Muhammed Moussa,
6

Ich habe das Problem gelöst, indem ich das "type": "module"Feld aus entfernt habe package.json.

Masih Jahangiri
quelle
5

Ich hatte das gleiche Problem und löste es wie folgt, indem ich tsconfig.json die Bibliothek " es5 " hinzufügte:

{
    "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"
        ]
    }
}
Rubensa
quelle
5

Wenn Ihr Compiler-Ziel auf ES6 festgelegt ist, müssen Sie babel anweisen, die Modultransformation zu überspringen. Fügen Sie dies dazu Ihrer .babelrcDatei hinzu

{
  "presets": [ ["env", {"modules": false} ]]
}
Cezar Augusto
quelle
1
Danke, Mann! Ich habe versucht, mit einer älteren Codebasis zu arbeiten, die alles in global speichert, und Skripte sind im Browser mit dem <script>Tag enthalten. Ich hatte gehofft, das Modul zusammen mit älterem Code zu verwenden, und es scheint, dass dies nicht möglich ist. Dies ermöglicht mir zumindest, ES6 zu verwenden und mich später mit dem Export zu befassen.
Huggie
2
Dabei wurde folgende Fehlermeldung angezeigtplugins
chharvey
5

Dies wird behoben, indem die moduleCompileroption auf Folgendes gesetzt wird es6:

{
  "compilerOptions": {     
    "module": "es6",
    "target": "es5",    
  }
}
Code Whisperer
quelle
3

Ich hatte den gleichen Fehler auch. In meinem Fall lag es daran, dass wir in unserem TypeScript AngularJS-Projekt eine altmodische Importanweisung wie folgt hatten:

import { IAttributes, IScope } from "angular";

welches wie folgt zu JavaScript kompiliert wurde:

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

Dies wurde früher benötigt, weil wir es dann IAttributesim Code verwendet haben und TypeScript sonst nicht gewusst hätte, was damit zu tun ist. Aber nachdem die import-Anweisung entfernt und IAttributesin ng.IAttributesdiese beiden JavaScript-Zeilen konvertiert wurde , verschwand sie - und auch die Fehlermeldung.

MatX
quelle
1
Wie würde das für einen Typescript-Typ funktionieren? Ich muss es importieren, damit Typescript es kompiliert.
BluE
Was meinst du mit "Typescript-Typ"? Wenn es sich um einen von TypeScript bekannten ganzzahligen Typ handelt, z. B. eine Zahl oder eine Zeichenfolge, können Sie diesen sofort verwenden. Wenn Sie Ihre eigenen Arten in einem Modul definieren, überprüfen Sie diese: typescriptlang.org/docs/handbook/modules.html
mATX
Ich meinte die Typdefinitionen einer externen Bibliothek wie @ types / jquery von npmjs.com/package/@types/jquery . Um die Variable $ in meinem Typescript-Code verwendbar zu machen, füge ich Folgendes in meinen Code ein: import * as $ from "jquery";
BluE
Ich ziele auf es5 ab. Brauche ich eine andere Bibliothek wie requirejs, damit dies funktioniert?
BluE
1

Fügen Sie einfach libraryTarget: 'umd'so hinzu

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

module.exports = webpackConfig; // Export all custom Webpack configs.
Daniel Danielecki
quelle
1

Für mich war das Entfernen "esModuleInterop": trueaus tsconfig.json der Trick.

user3033599
quelle
0

Für einige ASP.NET-Projekte importund exportmöglicherweise überhaupt nicht in Ihren Typoskripten verwendet.

Der Fehler der Frage wurde angezeigt, als ich dies versuchte, und ich stellte erst später fest, dass ich das generierte JS-Skript nur folgendermaßen zur Ansicht hinzufügen musste :

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

Versuchen Sie, was @iFreilicht oben vorgeschlagen hat. Wenn dies nach der Installation von Webpack und allem nicht funktioniert hat, haben Sie möglicherweise gerade eine Webpack-Konfiguration von irgendwo online kopiert und dort so konfiguriert, dass die Ausgabe versehentlich CommonJS unterstützt. Stellen Sie sicher, dass dies nicht der Fall ist in 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"
  }
};
Duliba
quelle
0

Hatte das gleiche Problem und behebt es durch Ändern der Ladereihenfolge der JS-Pakete.

Überprüfen Sie die Reihenfolge, in der die benötigten Pakete aufgerufen werden, und laden Sie sie in einer geeigneten Reihenfolge.

In meinem speziellen Fall (ohne Modulbündler) musste ich Reduxdann Redux Thunkdann laden React Redux. React ReduxVorher zu laden Redux Thunkwürde mir geben exports is not defined.

Klopfen
quelle
0

Hinweis: Dies gilt möglicherweise nicht für die Antwort von OP, aber ich habe diesen Fehler erhalten und so habe ich ihn gelöst.

Das Problem, mit dem ich konfrontiert war, war, dass ich diesen Fehler bekam, als ich eine 'js'-Bibliothek von einem bestimmten CDN abrief.

Das einzig Falsche, was ich tat, war das Importieren aus dem CDN- cjsVerzeichnis wie folgt: https://cdn.jsdelivr.net/npm/@popperjs/[email protected]/dist/cjs/popper.min.js

Beachten Sie das dist/cjsTeil? Dort war das Problem.

Ich ging in meinem Fall zum CDN (jsdelivr) zurück und navigierte, um den umdOrdner zu finden . Und ich konnte einen anderen Satz finden, von popper.min.jsdem die richtige Datei zum Importieren war : https://cdn.jsdelivr.net/npm/@popperjs/[email protected]/dist/umd/popper.min.js.

Arpan Srivastava
quelle
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"]
    }
  }
Carlos Alves
quelle
4
Willkommen bei StackOverflow. Bitte fügen Sie Ihrer Antwort einen Kontext oder eine Erklärung hinzu, damit der Benutzer verstehen kann, was getan wurde. Nur das Posten eines JSON ist möglicherweise nicht so hilfreich ...
Bruno Monteiro
0

Ich hatte das gleiche Problem, aber mein Setup erforderte eine andere Lösung.

Ich benutze die create-react-app-rewired Paket mit einer config-overrides.jsDatei. Zuvor habe ich den addBabelPresetsImport (in der override()Methode) von verwendet customize-craund beschlossen, diese Voreinstellungen in eine separate Datei zu abstrahieren. Zufälligerweise löste dies mein Problem.

Ich useBabelRc()habe die override()Methode in hinzugefügt config-overrides.jsund eine babel.config.jsDatei mit den folgenden erstellt:

module.exports = {
    presets: [
        '@babel/preset-react',
        '@babel/preset-env'
    ],
}
Doug Wilhelm
quelle