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

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,我将尝试使答案更完整。

原来的答案

如果CommonJS没有安装(它定义了exports),你必须从tsconfig.json中删除这一行:

 "module": "commonjs",

根据注释,仅这一点可能不适用于tsc的后续版本。如果是这样的话,你可以安装一个模块加载器,比如CommonJS, SystemJS或RequireJS,然后指定它。

注意:

看看tsc生成的main.js文件。你会发现在最上面:

Object.defineProperty(exports, "__esModule", { value: true });

它是错误信息的根,删除"module": "commonjs",,它将消失。

其他回答

所以这是一个超级通用的TypeScript错误,这个StackOverflow问题是我研究我的问题的各种查询的第一个结果。它有38.5万的浏览量。

对于那些使用Angular / TypeScript和Angular库使用ng-packagr时看到通用的“ReferenceError: exports is not defined”的人,你需要定义public-api。每个功能/组件/服务的t,这样你就可以将它包含在索引中。例如在这篇文章的回购中找到的

节点16或18(下周LTS为18) Angular 2+(目前有14个) 打印稿4.6.4-4.8.2

一些简单的例子类似于引用Creating Libraries

ng new workspace --no-create-application
cd workspace
ng generate app home --routing=true --style=scss
ng generate app admin --routing=true --style=scss
ng generate library lib
... # include your library 'lib' into your application 'home'
ng build lib --watch &
ng serve home --open

没有直接解释的是你的索引。Ts和public-api。Ts文件需要在每个特性/组件/服务中。如果你有一个复杂的库,比如下面回购中的这些示例特性A、B和C。回购有以下几点:

src / lib 一个 索引。Ts(只引用。/public-api) 公共api。Ts(只引用目录中导出的文件) 功能b 索引。Ts(只引用。/public-api) 公共api。Ts(只引用目录中导出的文件) feature-c 索引。Ts(只引用。/public-api) 公共api。Ts(只引用目录中导出的文件)

编辑:

这个答案可能不起作用,这取决于您是否不再针对es5,我将尝试使答案更完整。

原来的答案

如果CommonJS没有安装(它定义了exports),你必须从tsconfig.json中删除这一行:

 "module": "commonjs",

根据注释,仅这一点可能不适用于tsc的后续版本。如果是这样的话,你可以安装一个模块加载器,比如CommonJS, SystemJS或RequireJS,然后指定它。

注意:

看看tsc生成的main.js文件。你会发现在最上面:

Object.defineProperty(exports, "__esModule", { value: true });

它是错误信息的根,删除"module": "commonjs",,它将消失。

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

在包中。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

然后执行,应该没问题

我有类似的问题,原来的海报的问题:

我最好告诉你我犯了什么错误以及我是如何改正的,这可能会帮助到别人。

我有javascript nodejs项目,并将其转换为typescript。

之前的包装。我有“类型”:“模块”当我在JavaScript运行。

当我把它转换成TypeScript项目,并开始转换.ts文件中的文件,并使用以下命令开始运行:

npx tsc test.ts && node test.ts

我会得到上面的错误。

我通过简单地从package.json中删除“type”:“module”来摆脱这个错误

我的tsconfig。Json格式如下:

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

我使用节点14和TypeScript 4.2.4