En essayant de mettre en œuvre un module en suivant le manuel official , je reçois ce message d'erreur:
Uncaught ReferenceError: les exportations ne sont pas définies
à app.js: 2
Mais nulle part dans mon code je n'utilise jamais le nom exports
.
Comment puis-je réparer cela?
let a = 2;
let b:number = 3;
import Person = require ('./mods/module-1');
export class Person {
constructor(){
console.log('Person Class');
}
}
export default Person;
{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"noImplicitAny": false,
"sourceMap": true,
"outDir": "scripts/"
},
"exclude": [
"node_modules"
]
}
Cette réponse peut ne pas fonctionner si vous ne ciblez plus es5
, je vais essayer de la compléter.
Si CommonJS n'est pas installé ( qui définit exports
), 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 tel que CommonJS, SystemJS ou RequireJS, puis le spécifier.
Regardez votre fichier main.js
que tsc
a généré. Vous trouverez cela tout en haut:
Object.defineProperty(exports, "__esModule", { value: true });
C'est la racine du message d'erreur et, après avoir supprimé "module": "commonjs",
, il disparaîtra.
Peu d'autres solutions pour ce problème
<script>var exports = {};</script>
Pour les personnes ayant encore ce problème, si votre cible du compilateur est définie sur ES6, vous devez indiquer à Babel de ne pas utiliser la transformation de module. Pour ce faire, ajoutez ceci à votre fichier .babelrc
{
"presets": [ ["env", {"modules": false} ]]
}
Ajoutez simplement libraryTarget: 'umd'
, comme si
const webpackConfig = {
output: {
libraryTarget: 'umd' // Fix: "Uncaught ReferenceError: exports is not defined".
}
};
module.exports = webpackConfig; // Export all custom Webpack configs.
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 import
au lieu de require
si vous utilisez electron ou quelque chose du genre, et cela fonctionne très bien avec TypeScript 3.5.1, target: es3 -> esnext.
npm install @babel/plugin-transform-modules-commonjs
et ajouter à .babelrc plugins résolu ma question.
La réponse acceptée n'a pas résolu le problème pour moi. Au lieu de cela, j'ai configuré pour utiliser RequireJS (AMD Implementation). J'ai écrit ma solution sur https://stackoverflow.com/a/48436147/1019307 .
Il existe une relation entre l'option "module" et l'option "cible" dans les options du compilateur (comme documenté ici ):
--module -m
chaîne
cible === "ES3" ou "ES5"? "CommonJS": "ES6"
Spécifiez la génération de code de module: "Aucun", "CommonJS", "AMD", "Système", "UMD", "ES6", "ES2015" ou "ESNext". ► Seuls "AMD" et "Système" peuvent être utilisés dans conjonction avec --outFile. ► Les valeurs "ES6" et "ES2015" peuvent être utilisées lorsque vous ciblez "ES5" ou moins.
Comme la valeur par défaut de module est conditionnelle à la cible, vous devez tenir compte des deux options et de la façon dont vous utilisez le chargement de vos modules pour disposer des options appropriées qui correspondent à votre code.
Si vous ciblez ES5, vous devez envisager une autre option que la valeur par défaut et modifier la façon dont vous chargez votre module en conséquence.
Pour certains projets ASP.NET, import
et export
ne peuvent pas être utilisés du tout dans vos scripts de frappe.
L'erreur de la question s'est manifestée lorsque j'ai tenté de le faire et j'ai découvert par la suite que je devais simplement ajouter le script JS généré à la View comme ceci:
<script src="~/scripts/js/[GENERATED_FILE].Index.js" asp-append-version="true"></script>
J'ai eu cette même erreur aussi. Dans mon cas, c’est parce que nous avions une déclaration d’importation à l’ancienne dans notre projet TypeScript AngularJS comme celle-ci:
import { IAttributes, IScope } from "angular";
qui a été compilé pour JavaScript comme ceci:
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
Cela était nécessaire dans le passé, car nous utilisions alors IAttributes
dans le code et TypeScript n'aurait pas su quoi en faire sinon. Mais après avoir supprimé l’instruction d’importation et converti IAttributes
en ng.IAttributes
, ces deux lignes JavaScript ont disparu - et le message d’erreur également.
Essayez ce que @iFreilicht a suggéré ci-dessus. Si cela ne fonctionnait pas après avoir installé Webpack, vous avez peut-être simplement copié une configuration Webpack depuis un emplacement en ligne et vous y avez configuré le produit pour que celui-ci 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"
}
};
J'ai eu le même problème et 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"
]
}
}