typescript - true - Typecript ReferenceError: exportaciones no está definido
uncaught referenceerror: exports is not defined (10)
EDITAR:
Es posible que esta respuesta no funcione si ya no está apuntando a
es5
, intentaré que la respuesta sea más completa.
Respuesta original
Si CommonJS no está instalado (lo
que define las
exports
), debe eliminar esta línea de su
tsconfig.json
:
"module": "commonjs",
Según los comentarios, esto solo puede no funcionar con versiones posteriores de
tsc
.
Si ese es el caso, puede instalar un cargador de módulos como CommonJS, SystemJS o RequireJS y luego especificarlo.
Nota:
Mire su archivo
main.js
que
tsc
generó.
Encontrará esto en la parte superior:
Object.defineProperty(exports, "__esModule", { value: true });
Es la raíz del mensaje de error, y después de eliminar
"module": "commonjs",
desaparecerá.
Al intentar implementar un módulo siguiendo el manual oficial , recibo este mensaje de error:
Error de referencia no capturado: las exportaciones no están definidas
en app.js: 2
Pero en ninguna parte de mi código uso el nombre de
exports
.
¿Cómo puedo arreglar esto?
Archivos
app.ts
let a = 2;
let b:number = 3;
import Person = require (''./mods/module-1'');
módulo-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"
]
}
Existe una relación entre la opción "módulo" y la opción "objetivo" en las opciones del compilador (como se documenta here ):
--módulo -m
cuerda
target === "ES3" o "ES5"? "CommonJS": "ES6"
Especifique la generación del código del módulo: "Ninguno", "CommonJS", "AMD", "Sistema", "UMD", "ES6", "ES2015" o "ESNext". ► Solo se pueden usar "AMD" y "Sistema" junto con --outFile. ► Los valores "ES6" y "ES2015" se pueden usar al seleccionar "ES5" o inferior.
Como el valor predeterminado del módulo es condicional al objetivo, debe tener en cuenta las dos opciones y la forma en que está utilizando para cargar sus módulos para tener las opciones correctas que se ajusten a su código.
Si apunta a ES5, debe considerar otra opción que no sea el valor predeterminado y cambiar la forma en que carga su módulo en consecuencia.
La respuesta aceptada no resolvió el problema para mí. En su lugar, configuré para usar RequireJS (implementación de AMD). Escribí mi solución en https://.com/a/48436147/1019307 .
Para algunos proyectos ASP.NET, la
import
y la
export
pueden no utilizarse en absoluto en sus mecanografiados.
El error de la pregunta apareció cuando intenté hacerlo y solo descubrí más tarde que solo necesitaba agregar el script JS generado a la Vista de esta manera:
<script src="~/scripts/js/[GENERATED_FILE].Index.js" asp-append-version="true"></script>
Para las personas que todavía tienen este problema, si el objetivo de su compilador está configurado en ES6, debe decirle a Babel que omita la transformación del módulo.
Para hacerlo, agregue esto a su archivo
.babelrc
{
"presets": [ ["env", {"modules": false} ]]
}
Pocas otras soluciones para este problema
- Agregue la siguiente línea antes de otras referencias a Javascript. Este es un pequeño truco agradable.
<script>var exports = {};</script>
- Este problema ocurre con la última versión de TypeScript, este error puede eliminarse consultando la versión 2.1.6 de mecanografiado
También tuve este mismo error. En mi caso fue porque teníamos una declaración de importación antigua en nuestro proyecto TypeScript AngularJS como esta:
import { IAttributes, IScope } from "angular";
que fue compilado a JavaScript así:
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
Esto era necesario en los viejos tiempos porque luego usamos
IAttributes
en el código y TypeScript no habría sabido qué hacer con él de otra manera.
Pero después de eliminar la declaración de importación y convertir
IAttributes
a
ng.IAttributes
esas dos líneas de JavaScript desaparecieron, y también el mensaje de error.
Tuve el mismo problema y lo resolví agregando la biblioteca " es5 " a tsconfig.json así:
{
"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"
]
}
}
mi solución es un resumen de todo lo anterior con pequeños trucos que agregué, básicamente agregué esto a mi código html
<script>var exports = {"__esModule": true};</script>
<script src="js/file.js"></script>
esto incluso le permite utilizar la
import
lugar de
require
si está utilizando electrones o algo así, y funciona bien con typecript 3.5.1, target: es3 -> esnext.
npm install @babel/plugin-transform-modules-commonjs
y agregar a .babelrc complementos resolvió mi pregunta.