Ik probeer een module te implementeren volgens het officiële handboek, ik krijg deze foutmelding bericht:
Uncaught ReferenceError: export is niet gedefinieerd
op app.js:2
Maar nergens in mijn code gebruik ik ooit de naam exports
.
Hoe kan ik dit oplossen?
Bestanden
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"
]
}
Antwoord 1, autoriteit 100%
BEWERKEN:
Dit antwoord werkt mogelijk niet. Als u ES5
niet meer target, zal ik proberen het antwoord completer te maken.
Oorspronkelijk antwoord
Als CommonJS niet is geïnstalleerd (die exports
), moet u deze regel uit uw tsconfig.json
verwijderen:
"module": "commonjs",
Volgens de opmerkingen werkt dit alleen mogelijk niet met latere versies van tsc
. Als dat het geval is, kunt u een module-lader zoals Gonguits, Systemjs of Verleden installeren en vervolgens dat aangeven.
Opmerking:
Kijk naar uw main.js
bestand die tsc
gegenereerd. U vindt dit helemaal bovenaan:
Object.defineProperty(exports, "__esModule", { value: true });
Het is de root van het foutbericht en na het verwijderen van "module": "commonjs",
, zal het verdwijnen.
Antwoord 2, Autoriteit 109%
Weinig andere oplossingen voor dit probleem
- Voeg de volgende regel toe voor andere verwijzingen naar JavaScript. Dit is een leuke kleine hack.
<script>var exports = {};</script>
- Dit probleem treedt op met de nieuwste versie van Typcript, deze fout kan worden geëlimineerd door te verwijzen naar Typcript-versie 2.1.6
Antwoord 3, Autoriteit 52%
Ik heb het probleem opgelost door "type": "module"
Field van package.json
te verwijderen.
Antwoord 4, Autoriteit 22%
npm install @babel/plugin-transform-modules-commonjs
en toevoegen aan .BABELRC-plug-ins opgelost mijn vraag.
Antwoord 5, Autoriteit 18%
Dit wordt vastgesteld door de module
Compiler-optie in te stellen op es6
:
{
"compilerOptions": {
"module": "es6",
"target": "es5",
}
}
Antwoord 6, Autoriteit 12%
Mijn oplossing is een som van alles hierboven met kleine trucjes die ik heb toegevoegd, in principe heb ik dit toegevoegd aan mijn HTML-code
<script>var exports = {"__esModule": true};</script>
<script src="js/file.js"></script>
Hiermee kunt u zelfs import
gebruiken in plaats van require
als u elektron of zoiets gebruikt, en het werkt prima met typescript 3.5.1, doel: ES3 – & GT; eSnext.
Antwoord 7, Autoriteit 9%
Ik had hetzelfde probleem en loste het op “eS5 ” bibliotheek aan TSCONFIG.JSON als deze:
{
"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"
]
}
}
Antwoord 8, Autoriteit 7%
Voor mensen die nog steeds dit probleem hebben, als uw compiler-doel is ingesteld op ES6, moet u Babel vertellen om module-transformatie over te slaan. Om dit te doen Voeg dit toe aan uw .babelrc
Bestand
{
"presets": [ ["env", {"modules": false} ]]
}
Antwoord 9, Autoriteit 7%
Ik had ook dezelfde fout. In mijn geval was het omdat we een ouderwetse importverklaring hadden in ons Typescript Anguljs-project als volgt:
import { IAttributes, IScope } from "angular";
die als volgt naar JavaScript is gecompileerd:
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
Vroeger was dit nodig omdat we toen IAttributes
in de code gebruikten en TypeScript anders niet had geweten wat we ermee moesten doen.
Maar na het verwijderen van het importstatement en het converteren van IAttributes
naar ng.IAttributes
verdwenen die twee JavaScript-regels – en ook de foutmelding.
Antwoord 10, autoriteit 6%
voor mij was het verwijderen van "esModuleInterop": true
van tsconfig.json de juiste oplossing.
Antwoord 11, autoriteit 3%
Voeg eenvoudig libraryTarget: 'umd'
toe, zoals zo
const webpackConfig = {
output: {
libraryTarget: 'umd' // Fix: "Uncaught ReferenceError: exports is not defined".
}
};
module.exports = webpackConfig; // Export all custom Webpack configs.
Antwoord 12, autoriteit 3%
Ik had een soortgelijk probleem als de oorspronkelijke poster van de vraag:
Ik kan je maar beter vertellen welke fouten ik heb gemaakt en hoe ik die heb gecorrigeerd, daar kan iemand iets aan hebben.
Ik had een javascript nodejs-project en heb het geconverteerd naar typoscript.
Voorheen had ik in package.json “type”:”module” toen ik in JavaScript draaide.
Toen ik het naar TypeScript-project converteerde en begon met het converteren van bestanden in .ts-bestanden en begon met het volgende commando:
npx tsc test.ts && node test.ts
Ik krijg de bovenstaande foutmelding.
Ik heb de fout verwijderd door simpelweg de “type”:”module” uit package.json te verwijderen
Mijn tsconfig.json wil hieronder:
{
"compilerOptions": {
"target": "esnext",
"lib": ["es6", "es5", "es7", "dom"],
"allowJs": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"module": "es6",
"outDir": "./build",
"moduleResolution": "node",
"resolveJsonModule": true,
"skipLibCheck": true
},
"exclude": ["node_modules", "build"]
Ik gebruik node 14 en TypeScript 4.2.4
Antwoord 13
Voor sommige ASP.NET-projecten kunnen import
en export
helemaal niet worden gebruikt in uw Typescripts.
De fout van de vraag verscheen toen ik dit probeerde en ik ontdekte pas later dat ik alleen het gegenereerde JS-script aan de Viewmoest toevoegen, zoals:
<script src="~/scripts/js/[GENERATED_FILE].Index.js" asp-append-version="true"></script>
Antwoord 14
Opmerking: dit is misschien niet van toepassing op het antwoord van OP, maar ik kreeg deze foutmelding en zo heb ik het opgelost.
Dus het probleem waarmee ik werd geconfronteerd, was dat ik deze fout kreeg toen ik een ‘js’-bibliotheek ophaalde van een bepaald CDN.
Het enige verkeerde dat ik deed, was importeren uit de cjs
-directory van het CDN als volgt:
https://cdn.jsdelivr.net/npm/@popperjs/[email protected]/dist/cjs/popper.min.js
Let u op het dist/cjs
gedeelte? Daar zat het probleem.
Ik ging in mijn geval terug naar het CDN (jsdelivr) en navigeerde naar de map umd
. En ik kon nog een set popper.min.js
vinden die het juiste bestand was om te importeren:
https://cdn.jsdelivr.net/npm/@popperjs/[email protected]/dist/umd/popper.min.js
.
Antwoord 15
Om dit probleem op te lossen, plaatst u deze twee regels op uw index.htmlpagina.
<script>var exports = {"__esModule": true};</script>
<script type="text/javascript" src="/main.js">
Controleer uw main.jsbestandspad.
Antwoord 16
Ik kwam dit probleem een paar weken geleden tegen en gebruikte de exporthack hierbovenop korte termijn, maar kwam er uiteindelijk achter een andere manier om dit te omzeilen die geweldig werkt voor mij.
Dus in tegenstelling tot sommige van de andere reacties hierboven, wilde ik eigenlijk dat de code die ik aan het compileren was een module zou zijn. Door "target": "es6",
"module": "esnext"
in te stellen en vervolgens te linken naar mijn gecompileerde JS-bestand met type="module"
in plaats van type="text/javascript"
, heeft mijn gecompileerde code niet langer de Object.defineProperty(exports, "__esModule", { value: true });
regel en het is nog steeds een module 🎉
Mijn tsconfig:
{
"compilerOptions": {
"target": "es6",
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"module": "esnext",
"moduleResolution": "node",
"lib": ["es2016", "esnext", "dom"],
"outDir": "build",
"strict": true,
"strictNullChecks": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"declaration": true,
},
"include": ["src/index.ts"],
"exclude": ["build"]
}
Mijn link naar mijn gecompileerde code in HTML head
tags:
<script src="../build/index.js" type="module" defer></script>
Als bonus kan ik nu ook alles wat ik exporteer in dat index.js-bestand importeren in een apart type="module"
-script onder de HTML body
code:
<script type="module">
import { coolEncodingFunction, coolDecodingFunction } from "../build/index.js";
/* Do stuff with coolEncodingFunction and coolDecodingFunction */
/* ... */
</script>
Antwoord 17
Probeer wat @iFreilicht hierboven suggereerde. Als dat niet werkte nadat je webpack en alles hebt geïnstalleerd, heb je misschien zojuist een webpack-configuratie ergens online gekopieerd en daar geconfigureerd dat je wilt dat de uitvoer CommonJS ondersteunt. Zorg ervoor dat dit niet het geval is 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"
}
};
Antwoord 18
Had hetzelfde probleem en heb het opgelost door de laadvolgorde van JS-pakketten te wijzigen.
Controleer de volgorde waarin de pakketten die je nodig hebt worden aangeroepen en laad ze in de juiste volgorde.
In mijn specifieke geval (geen modulebundelaar gebruikend) moest ik Redux
laden, dan Redux Thunk
en vervolgens React Redux
. Het laden van React Redux
voor Redux Thunk
zou me exports is not defined
geven.
Antwoord 19
Ik had hetzelfde probleem, maar voor mijn configuratie was een andere oplossing nodig.
Ik gebruik het pakket create-react-app-rewired
met een bestand config-overrides.js
. Voorheen gebruikte ik de addBabelPresets
import (in de override()
methode) van customize-cra
en besloot die presets te abstraheren naar een aparte het dossier. Toevallig heeft dit mijn probleem opgelost.
Ik heb useBabelRc()
toegevoegd aan de override()
methode in config-overrides.js
en heb een babel.config.js
bestand met het volgende:
module.exports = {
presets: [
'@babel/preset-react',
'@babel/preset-env'
],
}
Antwoord 20
Ik bleef bij een dergelijke fout in een SSR
-clientgedeelte omdat het een lib gebruikte dat was gebouwd met tsconfig.json
compilerOptions
als target: ES5
wat bracht met behulp van CommonJS
voor module resolutie tsc CLI Opties Compiler Opties: target === "ES3" or "ES5" ? "CommonJS" : "ES6"
. Terwijl het het doel ESNext
gebruikte.
Antwoord 21
Omdat ES5
/ES2009
geen modules ondersteunt (import/export/require) op de client/ browserje moet bibliotheken gebruiken, die de modules bundelen in een enkel bestand, dat kan worden opgenomen via de <script>
-tag, zoals
Zie ook dit antwoord.
Antwoord 22
{
"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"]
}
}
Antwoord 23
Als je alleen interfaces voor typen gebruikt, laat dan het trefwoord export
weg en ts kan de typen oppikken zonder te hoeven importeren. Het belangrijkste is dat je import
/export
nergens kunt gebruiken.
export interface Person {
name: string;
age: number;
}
in
interface Person {
name: string;
age: number;
}