275 votes

Typescript ReferenceError: exports is not defined

En essayant de mettre en œuvre un module suivant le manuel officiel, je reçois ce message d'erreur :

Uncaught ReferenceError: exports is not defined

à app.js:2

Mais nulle part dans mon code je n'utilise le nom exports.

Comment puis-je corriger cela ?


Fichiers

app.ts

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

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

module-1.t

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

tsconfig.json

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

1 votes

Es-tu sûr de ne pas avoir tapé exports avec un s à la fin au lieu de export ? Cela expliquerait le message d'erreur car avec s est incorrect.

2 votes

Je tape export pas exports

0 votes

Tout exemple du dépôt qui fonctionnera à 10000%

129voto

Quelques autres solutions pour ce problème

  • Ajoutez la ligne suivante avant d'autres références à JavaScript. C'est une petite astuce sympa.

    var exports = {};

3 votes

@ChuckLeButt J'espère que cela vous aide stackoverflow.com/questions/19059580/…

56 votes

Je déteste que cela fonctionne! Et cela fonctionne certainement. N'y a-t-il pas un moyen de faire en sorte que TypeScript se transpile en quelque chose que Node attend? Est-ce même Node qui se plaint? Ou est-ce le navigateur? Je ne supporte pas de ne pas comprendre quel est réellement le problème.

123voto

iFreilicht Points 4090

MODIFIER :

Cette réponse pourrait ne pas fonctionner selon que vous ne ciblez plus es5, je vais essayer de rendre la réponse plus complète.

Réponse initiale

Si CommonJS n'est pas installé (qui définit exports), vous devez supprimer cette ligne de votre tsconfig.json:

"module": "commonjs",

Comme indiqué dans les commentaires, cela seul peut ne pas fonctionner avec les versions ultérieures de tsc. Dans ce cas, vous pouvez installer un chargeur de module comme CommonJS, SystemJS ou RequireJS et le spécifier ensuite.

Remarque :

Regardez votre fichier main.js généré par tsc. Vous trouverez ceci en haut :

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

C'est la source du message d'erreur, et après avoir supprimé "module": "commonjs",, il disparaîtra.

0 votes

@abhishekkhandait avez-vous vérifié le fichier .js généré après avoir modifié le fichier tsconfig.json comme je l'ai décrit? Avez-vous relancé tsc, est-ce qu'il affiche le même message d'erreur qu'auparavant?

36 votes

Oui, j'ai recompilé mon fichier .ts et l'erreur persiste toujours après avoir commenté "module": "commonJs", :(

0 votes

D'accord, s'il vous plaît posez une nouvelle question (en incluant toutes les sorties pertinentes de tsc, le début du fichier .ts que vous compilez et le début du fichier de sortie .js) et liez-la ici, je serai heureux d'essayer de vous aider.

21voto

Yi Zhang Points 21

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

et ajouter les plugins à .babelrc a résolu ma question.

0 votes

Cela a fonctionné pour moi, Merci!

6voto

Cezar Augusto Points 2592

Pour les personnes qui rencontrent toujours ce problème, si votre cible de compilateur est définie sur ES6, vous devez indiquer à Babel de sauter la transformation des modules. Pour ce faire, ajoutez ceci à votre fichier .babelrc

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

1 votes

Merci mec! J'ai essayé de travailler avec une ancienne base de code qui met tout dans le global et les scripts sont inclus dans le navigateur avec la balise </code>. J'espérais utiliser un module avec le code plus ancien, mais il semble que ce ne soit pas possible. Cela me permet au moins d'utiliser ES6 et de gérer l'export plus tard.</x-turndown>

2 votes

En faisant cela, j'ai obtenu l'erreur suivante: Utilisation de l'option Babel 5 supprimée: .modules - Utilisez le plugin de transformation de module correspondant dans l'option plugins. Consultez babeljs.io/docs/plugins/#modules

1voto

HankCa Points 176

La réponse acceptée n'a pas résolu le problème pour moi. Au lieu de cela, j'ai décidé d'utiliser RequireJS (AMD implementation). J'ai écrit ma solution à https://stackoverflow.com/a/48436147/1019307.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X