TypeScript外部节点模块有时会转换为module.exports和exports

时间:2015-10-29 03:50:19

标签: node.js typescript commonjs

我正在将我的节点应用转换为使用TypeScript外部模块。在运行应用程序时,一切正常,但在转换我的.ts文件时,由于NewMyClass,mocha测试会“爆炸”。

经过大量调试后,我发现了以下可重现的故障情况。我有一个简单的autoRoles.ts文件,用于定义可用的用户角色。在使用外部模块之前,它看起来像:

SyntaxError: Unexpected reserved word

转换后现在:

/// <reference path="../../typings/backend_typings.d.ts" />

module.exports.roles = {
  // role definitions
}

运行mocha测试时,会产生以下错误:

/// <reference path="../../typings/backend_typings.d.ts" />

export let roles = {
  // role definitions
}

我可以在autoRoles.ts文件的旧实现和新实现之间切换,并分别获得mocha传递和下降。请注意,userRoles.ts第77行有一个>> Mocha exploded! >> SyntaxError: Unexpected reserved word >> at exports.runInThisContext (vm.js:53:16) >> at Module._compile (module.js:413:25) >> at Object.Module._extensions..js (module.js:452:10) >> at Module.load (module.js:355:32) >> at Function.Module._load (module.js:310:12) >> at Module.require (module.js:365:17) >> at require (module.js:384:17) >> at Object.<anonymous> (/Users/abc/esupport/code/asp_v4/lib/models/userRole.ts:77:17) >> at Module._compile (module.js:434:26) >> at Object.Module._extensions..js (module.js:452:10) >> at Module.load (module.js:355:32) >> at Function.Module._load (module.js:310:12) >> at Module.require (module.js:365:17) >> at require (module.js:384:17) >> at Object.<anonymous> (/Users/abc/esupport/code/asp_v4/lib/users/lib/ssoAuth.ts:7:17) >> at Module._compile (module.js:434:26) >> at Object.Module._extensions..js (module.js:452:10) >> at Module.load (module.js:355:32) >> at Function.Module._load (module.js:310:12) >> at Module.require (module.js:365:17) >> at require (module.js:384:17) >> at Object.<anonymous> (/Users/abc/esupport/code/asp_v4/lib/users/index.ts:5:31)

在比较转换后的版本时,唯一的区别是旧版本使用'module.exports'而新版本只使用'exports'。

旧:

require('<path>/autoRoles')

新:

/// <reference path="../../typings/backend_typings.d.ts" />
exports.roles = {
  // role definitions
}

所以我知道“exports”只是“module.exports”的快捷方式,所以我无法解释为什么这会导致mocha失败,但我知道如果我在两者之间切换而没有改变别的,摩卡“爆炸”。我还注意到,对于其他已编译的模块,tsc有时使用“module.exports”,有时使用“exports”。为什么差异,更重要的是,为什么摩卡爆炸?

2 个答案:

答案 0 :(得分:1)

  

意外的保留字

"use strict";放在文件的顶部。您可能有一个保留关键字的变量。见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode#Paving_the_way_for_future_ECMAScript_versions。如果文件中有该标题,TypeScript将对此类变量名称发出警告。

module.exports.roles = {不是您错误的来源。

  

我还注意到,对于其他已编译的模块,tsc有时会使用&#34; module.exports&#34;有时使用&#34; exports&#34;。

它类似于nodejs约定。基本上保存运行时需要解析的字符(字节)。

export let foo = 123;

会给你

exports.foo = 123;

(因为exports == module.export因此exports.foo == module.export.foo ......正如您所知道的那样。但是在:

let foo = 123;
export = foo;

确实

var foo = 123;
module.exports = foo;

因为如果您重新分配导出,即exports = foo,那么module.export !== exports。因此,您可以使用exports进行扩展....但不能使用赋值

答案 1 :(得分:1)

经过更多调试后,我发现mocha没有使用tsc生成的生成的.js源代码文件。我不确定如何但是它试图执行位于.ts文件中的“export var roles”,“export”是一个保留字。

我遇到了这个post,它向我表明摩卡正试图自己进行转换。那家伙建议使用“typescript-require”,但该软件包看起来像是在被弃用的中间,而不是“ts-node”。所以我改变了我的grunt-ts配置看起来像:

mochaTest: {
    test: {
        options: {
            reporter: 'spec',
            require: [
                'ts-node/register'
            ]
        },
        src: ['lib/test/**/*.spec.js']
    }
},

这样可行,但我很乐意让某人了解摩卡在做什么。另外,为什么mocha成功地在使用导出的其他.ts文件中转换/不检测“保留字”?

编辑2015年10月30日:

所以我发现了为什么mocha试图执行我的.ts文件。我愚蠢地将它们中的一些作为require('/ path / file.ts')导入,我应该将'.ts'扩展名关闭。我的mocha跑步者不再需要'ts-node'。这也解释了为什么mocha只在我的一些.ts文件中出错。