尝试按照官方手册实现一个模块,我得到这个错误消息:

Uncaught ReferenceError:未定义exports 在app.js: 2

但在我的代码中,我从未使用过名称exports。

我该如何解决这个问题?


文件

app.ts

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

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

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

当前回答

要解决这个问题,将这两行放在index.html页面中。

<script>var exports = {"__esModule": true};</script>
<script type="text/javascript" src="/main.js">

确保检查main.js文件路径。

其他回答

在其他JavaScript引用之前添加以下行。这是一个不错的小hack。

<script>var exports = {};</script>

对于仍然有这个问题的人,如果你的编译器目标设置为ES6,你需要告诉babel跳过模块转换。为此,将此添加到.babelrc文件中

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

通过将模块编译器选项设置为es6可以解决这个问题:

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

对我来说,从tsconfig中删除“esModuleInterop”:true。Json成功了。

我有同样的问题,并解决了它添加“es5”库tsconfig。Json是这样的:

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