打字稿ReferenceError:导出未定义


105

尝试按照官方手册实施模块,出现以下错误消息:

未捕获ReferenceError:未定义导出

在app.js:2

但是我的代码中从来没有使用过名称exports

我怎样才能解决这个问题?


档案

应用程序

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

请复制错误文本并将其粘贴到问题中,而不要使用屏幕截图。
伊戈尔(Igor)

你确定你没有输入exports小号末代替export?这将解释错误消息,因为s是错误的。
伊戈尔(Igor)

I型出口没有出口
乔治·

来自repositorie的任何示例,认为gona可以工作10000%
George C.

在哪里运行?在网页上?在node.js服务器上?您将需要在javascript最终在其中运行的运行时环境中使用模块加载器。根据编译器标志,您正在使用commonjs。我对commonjs不太熟悉,但是您需要在Typescript模块正常工作之前设置commonjs,或者需要更改为另一个模块加载器(例如require.js)并进行设置。
Mike Wodarczyk '17

Answers:


41

编辑:

根据您是否不再定位es5,此答案可能无法正常工作,我将尝试使答案更加完整。

原始答案

如果未安装(定义exports)CommonJS,则必须从以下代码中删除此行tsconfig.json

 "module": "commonjs",

根据评论,仅此功能可能不适用于更高版本tsc。在这种情况下,您可以安装诸如CommonJS,SystemJS或RequireJS之类的模块加载器,然后进行指定。

注意:

查看生成的main.js文件tsc。您将在顶部找到它:

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

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


3
是的,我重新编译了我的.ts文件,并且注释掉之后该错误仍然存​​在"module": "commonJs",:(
Acidic9

2
如果安装CommonJS将使此错误消失,那么如何实际安装CommonJS?我花了一个小时的大部分时间来Google搜寻,但找不到任何说明。有人可以解释一下吗?
斯特姆

1
@Sturm我的回答可能措辞混乱。CommonJS只是一个规范。您可以在此处找到实现的列表(不一定详尽):en.wikipedia.org/wiki/CommonJS
iFreilicht

1
我有模块:amd,而不是模块:commonjs,并且在我已编译的.js文件中有这一行。
pabrams,

2
如果您在tsconfig.json中将目标作为ES3或ES5,那么如果未定义,typescript会自动将您的模块设置为CommonJS。删除模块还不够,您需要设置其他内容-请参见typescriptlang.org/docs/handbook/compiler-options.html
Jake

51

此问题的其他解决方案很少

  • 在对Javascript的其他引用之前添加以下行。这是一个不错的小技巧。
   <script>var exports = {};</script>
  • 最新版本的TypeScript会出现此问题,可以通过参考打字稿版本2.1.6消除此错误。


3
我讨厌这行得通!它绝对有效。是否没有办法让TypeScript转换成Node期望的东西?甚至是Node在抱怨吗?还是浏览器?我不能忍受不理解问题的实质。
Skillit zimberg

7

npm install @babel/plugin-transform-modules-commonjs

并添加到.babelrc插件解决了我的问题。


7

我的解决方案是上述所有内容的总结,并添加了一些小技巧,基本上我将此添加到了html代码中

<script>var exports = {"__esModule": true};</script>
<script src="js/file.js"></script>

这甚至允许您使用import而不是require使用电子或其他东西,并且与打字稿3.5.1(目标:es3-> esnext)兼容。


3
这里有些进展,错误只是更改为app.js:3 Uncaught ReferenceError: require is not defined
Muhammed Moussa

如果在创建窗口时将nodeIntegration设置为false,则会发生此错误,因为您更新了electronJS或使用了过时的源,所以会发生此错误。nodeIntegration默认情况下为true,现在为false,因此,如果要在渲染器过程中访问nodeJS,则必须手动启用它。参见[电子要求()没有被定义] [1] [1]:stackoverflow.com/questions/44391448/...
奥西纳杜勒拉蒂夫

我不使用电子,无论如何我还是通过添加包裹来制造捆扎物品并去除其他棘手的方式解决了问题
Muhammed Moussa


5

我遇到了同样的问题,并解决了将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"
        ]
    }
}

5

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

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

1
谢啦!我一直在尝试使用较旧的代码库,这些代码库全部转储到全局代码中,并且脚本包含在带有<script>标记的浏览器中。我希望将模块与旧代码一起使用,看来这是不可能的。这至少允许我使用ES6,并让我稍后处理导出。
huggie

2
这样做,我得到以下错误:使用删除的Babel 5选项:.modules-在plugins选项中使用相应的模块转换插件。请查看babeljs.io/docs/plugins/#modules
chharvey

5

通过将module编译器选项设置为可以解决此问题es6

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

3

我也有同样的错误。就我而言,这是因为我们在TypeScript AngularJS项目中有一个老式的import语句,如下所示:

import { IAttributes, IScope } from "angular";

像这样编译为JavaScript:

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

在过去,这是必需的,因为我们随后IAttributes在代码中使用了TypeScript,否则将不知道该如何处理。但是,在删除import语句并转换IAttributesng.IAttributes这两行JavaScript之后,错误消息也消失了。


1
对于Typescript类型,它将如何工作?我必须导入它,因此Typescript对其进行编译。
BluE

您所说的“打字稿类型”是什么意思?如果它是TypeScript已知的整数类型(例如数字或字符串),则可以立即使用它。如果你在一个模块中定义自己的类型,检查:typescriptlang.org/docs/handbook/modules.html
MATX

我的意思是外部库的类型定义,例如npmjs.com/package/@types/jquery中的 @ types / jquery 。为了在我的Typescript代码中使$变量可用,我将其放在代码中:import * as $ from“ jquery”;
BluE

我的目标是es5,是否需要另一个如requirejs的库才能完成此工作?
BluE

1

只需添加libraryTarget: 'umd',就像这样

const webpackConfig = {
  output: {
    libraryTarget: 'umd' // Fix: "Uncaught ReferenceError: exports is not defined".
  }
};

module.exports = webpackConfig; // Export all custom Webpack configs.

1

对我来说,"esModuleInterop": true从tsconfig.json中删除就可以了。


0

对于某些ASP.NET项目importexport可能根本不在您的Typescript中使用。

当我尝试这样做时,就会出现问题的错误,后来我才发现只需要将生成的JS脚本添加到View中,如下所示:

<script src="~/scripts/js/[GENERATED_FILE].Index.js" asp-append-version="true"></script>

0

尝试上面建议的@iFreilicht。如果在安装完webpack以及所有内容后仍不起作用,则可能是刚刚从在线某个地方复制了webpack配置,并在那里配置了您希望输出错误地支持CommonJS的功能。确保在以下情况不是这种情况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"
  }
};

0

发生了同样的问题,并通过更改JS软件包的加载顺序来解决了该问题。

检查调用所需软件包的顺序,并以适当的顺序加载它们。

在我的特定情况下(不使用模块捆绑器),我需要先加载Redux,然后Redux Thunk再加载React ReduxReact Redux之前加载Redux Thunk会给我exports is not defined


0

注意:这可能不适用于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/umd/popper.min.js


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

5
欢迎使用StackOverflow。请在您的答案或说明中添加一些上下文,以便用户可以了解已完成的操作。仅发布JSON可能没有帮助...
Bruno Monteiro

0

我遇到了同样的问题,但是我的设置需要不同的解决方案。

我正在使用create-react-app-rewired带有config-overrides.js文件的软件包。以前,我使用addBabelPresets导入(在override()方法中),customize-cra并决定将这些预设抽象到单独的文件中。巧合的是,这解决了我的问题。

我在中添加useBabelRc()override()方法,config-overrides.jsbabel.config.js使用以下内容创建了一个文件:

module.exports = {
    presets: [
        '@babel/preset-react',
        '@babel/preset-env'
    ],
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.