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

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

当前回答

我有同样的问题,并解决了它添加“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"
        ]
    }
}

其他回答

注意:这可能不适用于OP的答案,但我得到了这个错误,这就是我解决它的方式。

所以我面临的问题是,当我从一个特定的CDN检索一个'js'库时,我得到了这个错误。

我做的唯一错误的事情是从CDN的cjs目录导入,就像这样: https://cdn.jsdelivr.net/npm/@popperjs/core@2.4.0/dist/cjs/popper.min.js

注意到dist/cjs部分了吗?这就是问题所在。

在我的例子中,我回到CDN (jsdelivr)并导航到umd文件夹。我可以找到另一组popper.min.js,这是要导入的正确文件: https://cdn.jsdelivr.net/npm/@popperjs core@2.4.0 / dist / / popper.min.js umd格式。

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

我认为问题可能是配置不匹配。

下面的工作解决方案1为您提供了ES模块的正确配置。 下面的工作解决方案2为您提供了正确的CommonJS配置。 混合解决方案1+2给你一个错误。

为了清晰起见,我在这里只发布了部分内容。 Github项目https://github.com/jmmvkr/ts-express/ 准备一套完整的文件来演示工作解决方案1和解决方案2。

工作方案1,ES模块

/* Configuration for ES Module */

// tsconfig.json
{
    "compilerOptions": {
        "module": "es6", // or "esnext"
    }
}
// package.json
{
    "type": "module", // type is module
}

工作解决方案2,CommonJS

/* Configuration for CommonJS */

// tsconfig.json
{
    "compilerOptions": {
        "module": "commonjs",
    }
}
// package.json
{
    "type": "", // type is NOT module
}

混合,不工作

/* Mixed, got ReferenceError: exports is not defined in ES module scope */

// tsconfig.json
{
    "compilerOptions": {
        "module": "commonjs",
    }
}
// package.json
{
    "type": "module", // type is module
}

在包中。Json,添加"type": "module"

在终端中

npx tsc --init

它将创建一个tsconfig.json。

在tsconfig.json,

将"target": "es5"改为"target": "es6" 注释掉//"module": "commonjs", uncomment " modulerresolve ": "node",

你应该可以出发了。

在包中。Json,创建一个构建脚本:

"build": "tsc -p tsconfig.json"

然后,当你想要构建时,你只需要编译npm run build

然后执行,应该没问题

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

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

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