Erreur de référence de type script: les exportations ne sont pas définies


106

En essayant d'implémenter un module en suivant le manuel officiel , j'obtiens ce message d'erreur:

Uncaught ReferenceError: les exportations ne sont pas définies

sur app.js: 2

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

Comment puis-je réparer cela?


Des dossiers

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

Veuillez copier et coller le texte d'erreur dans la question au lieu d'utiliser des captures d'écran.
Igor

Êtes-vous sûr de ne pas avoir tapé exportsavec un s à la fin au lieu de export? Cela expliquerait le message d'erreur car avec s est faux.
Igor

Je tape export pas export
George C.

tout exemple de repositorie qui va travailler 10000%
George C.

Où cela se passe-t-il? Sur une page Web? Sur un serveur node.js? Vous aurez besoin d'un chargeur de module dans l'environnement d'exécution dans lequel le javascript s'exécute enfin. À partir des indicateurs du compilateur, vous utilisez commonjs. Je ne suis pas très familier avec commonjs, mais vous devrez configurer commonjs avant que les modules Typescript ne fonctionnent ou vous devrez passer à un autre chargeur de module (comme require.js) et installer celui-ci.
Mike Wodarczyk

Réponses:


41

ÉDITER:

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

Réponse originale

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

 "module": "commonjs",

Selon les commentaires, cela seul peut ne pas fonctionner avec les versions ultérieures de tsc. Si tel est le cas, vous pouvez installer un chargeur de module comme CommonJS, SystemJS ou RequireJS, puis le spécifier.

Remarque:

Regardez votre main.jsfichier qui a tscgénéré. Vous trouverez ceci tout en haut:

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

C'est la racine du message d'erreur, et après la suppression "module": "commonjs",, il disparaîtra.


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

2
Si l'installation de CommonJS fera disparaître cette erreur, comment installer CommonJS? J'ai passé la majeure partie d'une heure à chercher sur Google, et je ne trouve aucune instruction sur la façon de le faire. Quelqu'un peut -il s'il vous plaît expliquer?
Sturm

1
@Sturm Ma réponse peut être formulée de manière confuse. CommonJS n'est qu'une spécification. Vous pouvez trouver une liste (pas forcément exhaustive) d'implémentations ici: en.wikipedia.org/wiki/CommonJS
iFreilicht

1
J'ai module: amd, pas module: commonjs, et j'ai cette ligne dans mon fichier .js transpilé.
pabrams

2
Si vous avez une cible comme ES3 ou ES5 dans votre tsconfig.json, alors typescript définira automatiquement votre module sur CommonJS s'il n'est pas défini. La suppression du module ne suffit pas, vous devez définir autre chose à la place - voir typescriptlang.org/docs/handbook/compiler-options.html
Jake

52

Peu d'autres solutions pour ce problème

  • Ajoutez la ligne suivante avant les autres références à Javascript. C'est un joli petit hack.
   <script>var exports = {};</script>
  • Ce problème se produit avec la dernière version de TypeScript, cette erreur peut être éliminée en se référant à la version dactylographiée 2.1.6

3
@ChuckLeButt J'espère que cela aidera stackoverflow.com/questions/19059580/…
Venkatesh Muniyandi

3
Je déteste que cela fonctionne! Et ça marche vraiment. N'y a-t-il pas un moyen de faire transpiler TypeScript 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.
skillit zimberg le

9

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

et ajouter aux plugins .babelrc a résolu ma question.



7

ma solution est un résumé de tout ce qui précède avec de petites astuces que j'ai ajoutées, en gros j'ai ajouté ceci à mon code html

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

cela vous permet même d'utiliser à la importplace de requiresi vous utilisez électron ou quelque chose du genre, et cela fonctionne très bien avec typescript 3.5.1, target: es3 -> esnext.


3
quelques progrès ici, l'erreur vient de changer pour êtreapp.js:3 Uncaught ReferenceError: require is not defined
Muhammed Moussa

cela se produit si nodeIntegration est défini sur false lors de la création de la fenêtre, l'erreur se produit parce que vous avez mis à jour votre electronJS ou que vous suivez une source obsolète. nodeIntegration était vrai par défaut, maintenant c'est faux, vous devez donc l'activer manuellement si vous voulez accéder à nodeJS dans le processus de rendu. Voir [Electron require () n'est pas défini] [1] [1]: stackoverflow.com/questions/44391448/…
Hocine Abdellatif

Je n'utilise pas d'électron, de toute façon j'ai résolu mon cas en ajoutant un colis pour créer des paquets et en supprimant d'autres moyens délicats
Muhammed Moussa

5

J'ai eu le même problème et je l'ai résolu en ajoutant la bibliothèque " es5 " à tsconfig.json comme ceci:

{
    "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

Pour les personnes ayant encore ce problème, si votre cible de compilateur est définie sur ES6, vous devez dire à babel d'ignorer la transformation du module. Pour ce faire, ajoutez ceci à votre .babelrcfichier

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

1
Merci mec! J'ai essayé de travailler avec une base de code plus ancienne qui vide tout dans le global et les scripts sont inclus dans le navigateur avec la <script>balise. J'espérais utiliser le module avec un code plus ancien et il semble que ce ne soit pas possible. Cela me permet au moins d'utiliser ES6 et de m'occuper de l'exportation plus tard.
huggie

2
en faisant cela, j'ai eu l'erreur suivante: Utilisation de l'option Babel 5 supprimée: .modules - Utilisez le plugin de transformation de module correspondant dans l' pluginsoption. Découvrez babeljs.io/docs/plugins/#modules
chharvey

5

Ce problème est résolu en définissant l' moduleoption du compilateur sur es6:

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

3

J'ai eu cette même erreur aussi. Dans mon cas, c'était parce que nous avions une instruction d'importation à l'ancienne dans notre projet TypeScript AngularJS comme celle-ci:

import { IAttributes, IScope } from "angular";

qui a été compilé en JavaScript comme ceci:

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

Cela était nécessaire à l'époque car nous utilisions ensuite IAttributesdans le code et TypeScript n'aurait pas su quoi en faire autrement. Mais après la suppression de l'instruction d'importation et la conversion IAttributesvers ng.IAttributesces deux lignes JavaScript, le message d'erreur a disparu.


1
Comment cela fonctionnerait-il pour un type Typecript? Je dois l'importer, donc Typescript le compile.
BluE

Qu'entendez-vous par «type Typecript»? S'il s'agit d'un type entier connu par TypeScript - tel qu'un nombre ou une chaîne - vous pouvez l'utiliser tout de suite. Si vous définissez vos propres types dans un module, vérifiez ceci: typescriptlang.org/docs/handbook/modules.html
MatX

Je voulais dire les définitions de type d'une bibliothèque externe comme @ types / jquery de npmjs.com/package/@types/jquery . Pour rendre la variable $ utilisable depuis mon code Typescript, je mets ceci dans mon code: import * as $ from "jquery";
BluE

Je cible es5, ai-je besoin d'une autre bibliothèque comme requirejs pour que cela fonctionne?
BluE

1

Ajoutez simplement libraryTarget: 'umd', comme ça

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

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


0

Pour certains projets ASP.NET importetexport peut ne pas être utilisé du tout dans vos typescripts.

L'erreur de la question est apparue lorsque j'ai tenté de le faire et je n'ai découvert que plus tard que j'avais juste besoin d'ajouter le script JS généré à la vue comme ceci:

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

0

Essayez ce que @iFreilicht a suggéré ci-dessus. Si cela ne fonctionnait pas après avoir installé webpack et tout, vous venez peut-être de copier une configuration Webpack à partir d'un endroit en ligne et de configurer là-bas que vous voulez que la sortie prenne en charge CommonJS par erreur. Assurez-vous que ce n'est pas le cas dans 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

J'ai eu le même problème et l'a corrigé en modifiant l'ordre de chargement des packages JS.

Vérifiez l'ordre dans lequel les packages dont vous avez besoin sont appelés et chargez-les dans un ordre approprié.

Dans mon cas particulier (sans utiliser le module bundler), je devais charger Redux, alors Redux Thunk, alors React Redux. Le chargement React Reduxavant Redux Thunkme donnerait exports is not defined.


0

Remarque: Cela ne s'applique peut-être pas à la réponse d'OP, mais j'obtenais cette erreur, et c'est ainsi que je l'ai résolue.

Donc, le problème auquel je faisais face était que j'obtenais cette erreur lorsque j'ai récupéré une bibliothèque 'js' à partir d'un CDN particulier.

La seule mauvaise chose que je faisais était d'importer depuis le cjsrépertoire du CDN comme ceci: https://cdn.jsdelivr.net/npm/@popperjs/core@2.4.0/dist/cjs/popper.min.js

Remarquez la dist/cjspièce? C'est là que se trouvait le problème.

Je suis retourné au CDN (jsdelivr) dans mon cas et j'ai navigué pour trouver le umddossier. Et je pouvais trouver un autre ensemble de ce popper.min.jsqui était le bon fichier à importer: 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"]
    }
  }

6
Bienvenue dans StackOverflow. Veuillez ajouter du contexte à votre réponse ou une explication afin que l'utilisateur puisse comprendre ce qui a été fait. Publier uniquement un JSON peut ne pas être aussi utile ...
Bruno Monteiro

0

J'ai eu le même problème, mais ma configuration nécessitait une solution différente.

J'utilise le create-react-app-rewiredpackage avec un config-overrides.jsfichier. Auparavant, j'utilisais l' addBabelPresetsimportation (dans la override()méthode) decustomize-cra et décidé de résumer ces préréglages dans un fichier séparé. Par coïncidence, cela a résolu mon problème.

J'ai ajouté useBabelRc()à la override()méthode config-overrides.jset créé un babel.config.jsfichier avec les éléments suivants:

module.exports = {
    presets: [
        '@babel/preset-react',
        '@babel/preset-env'
    ],
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.