TypeScript 外部节点模块有时会转换为 module.exports 并导出
TypeScript external node modules sometimes transpile to module.exports and exports
我正在将我的节点应用程序转换为使用 TypeScript 外部模块。 运行 应用程序时一切正常,但在转换我的一些 .ts 文件时,mocha 测试 "explode" 由于 SyntaxError: Unexpected reserved word
.
经过多次调试,我发现了以下可重现的失败案例。我有一个简单的 autoRoles.ts 文件,它定义了可用的用户角色。在使用外部模块之前,它看起来像:
/// <reference path="../../typings/backend_typings.d.ts" />
module.exports.roles = {
// role definitions
}
现在转换后:
/// <reference path="../../typings/backend_typings.d.ts" />
export let roles = {
// role definitions
}
当 运行 mocha 测试时,它会生成以下错误:
>> 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)
我可以在 autoRoles.ts 文件的旧实现和新实现之间切换,让 mocha 分别通过和下降。注意,userRoles.ts.
的第77行有一个require('<path>/autoRoles')
比较转译版本时,唯一的区别是旧版本使用'module.exports',而新版本只有'exports'。
旧:
/// <reference path="../../typings/backend_typings.d.ts" />
exports.roles = {
// role definitions
}
新:
/// <reference path="../../typings/backend_typings.d.ts" />
module.exports.roles = {
// role definitions
}
所以我知道 "exports" 只是 "module.exports" 的快捷方式所以我无法解释为什么这会导致 mocha 失败但我知道如果我在两者之间切换别无改变,mocha "explodes"。我还注意到,对于其他转译模块,tsc 有时使用 "module.exports",有时使用 "exports"。为什么会有所不同,更重要的是,为什么摩卡会爆炸式增长?
Unexpected reserved word
在您的文件顶部添加 "use strict";
。您可能有一个变量是保留关键字。参见 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode#Paving_the_way_for_future_ECMAScript_versions。如果文件中有 header,TypeScript 将对此类变量名称发出警告。
module.exports.roles = {
不是您的错误来源。
I've also noticed that for other transpiled modules, tsc sometimes uses "module.exports" and sometimes uses "exports".
它类似于 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
进行扩展....但不能使用 assignment。
经过更多调试,我发现 mocha 并没有使用 tsc 转译生成的 .js 源代码文件。我不确定具体是如何执行的,但它试图执行位于 .ts 文件中的 "export var roles",而 "export" 是一个保留字。
我遇到了这个 post,它向我表明 mocha 正在尝试自己进行转译。那个人建议使用 "typescript-require",但那个包看起来正处于被弃用的过程中,取而代之的是 "ts-node"。所以我将我的 grunt-ts 配置更改为:
mochaTest: {
test: {
options: {
reporter: 'spec',
require: [
'ts-node/register'
]
},
src: ['lib/test/**/*.spec.js']
}
},
这行得通,但我非常乐意有人阐明 mocha 正在做什么。另外,为什么 mocha 在使用导出的其他 .ts 文件中成功转译/未检测到 "reserved word"?
编辑 2015 年 10 月 30 日:
所以我发现了为什么 mocha 试图执行我的 .ts 文件。我愚蠢地将其中一些作为 require('/path/file.ts') 导入,我应该关闭 '.ts' 扩展名。我的 mocha runner 不再需要 'ts-node'。这也解释了为什么 mocha 只在我的一些 .ts 文件上出错。
我正在将我的节点应用程序转换为使用 TypeScript 外部模块。 运行 应用程序时一切正常,但在转换我的一些 .ts 文件时,mocha 测试 "explode" 由于 SyntaxError: Unexpected reserved word
.
经过多次调试,我发现了以下可重现的失败案例。我有一个简单的 autoRoles.ts 文件,它定义了可用的用户角色。在使用外部模块之前,它看起来像:
/// <reference path="../../typings/backend_typings.d.ts" />
module.exports.roles = {
// role definitions
}
现在转换后:
/// <reference path="../../typings/backend_typings.d.ts" />
export let roles = {
// role definitions
}
当 运行 mocha 测试时,它会生成以下错误:
>> 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)
我可以在 autoRoles.ts 文件的旧实现和新实现之间切换,让 mocha 分别通过和下降。注意,userRoles.ts.
的第77行有一个require('<path>/autoRoles')
比较转译版本时,唯一的区别是旧版本使用'module.exports',而新版本只有'exports'。
旧:
/// <reference path="../../typings/backend_typings.d.ts" />
exports.roles = {
// role definitions
}
新:
/// <reference path="../../typings/backend_typings.d.ts" />
module.exports.roles = {
// role definitions
}
所以我知道 "exports" 只是 "module.exports" 的快捷方式所以我无法解释为什么这会导致 mocha 失败但我知道如果我在两者之间切换别无改变,mocha "explodes"。我还注意到,对于其他转译模块,tsc 有时使用 "module.exports",有时使用 "exports"。为什么会有所不同,更重要的是,为什么摩卡会爆炸式增长?
Unexpected reserved word
在您的文件顶部添加 "use strict";
。您可能有一个变量是保留关键字。参见 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode#Paving_the_way_for_future_ECMAScript_versions。如果文件中有 header,TypeScript 将对此类变量名称发出警告。
module.exports.roles = {
不是您的错误来源。
I've also noticed that for other transpiled modules, tsc sometimes uses "module.exports" and sometimes uses "exports".
它类似于 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
进行扩展....但不能使用 assignment。
经过更多调试,我发现 mocha 并没有使用 tsc 转译生成的 .js 源代码文件。我不确定具体是如何执行的,但它试图执行位于 .ts 文件中的 "export var roles",而 "export" 是一个保留字。
我遇到了这个 post,它向我表明 mocha 正在尝试自己进行转译。那个人建议使用 "typescript-require",但那个包看起来正处于被弃用的过程中,取而代之的是 "ts-node"。所以我将我的 grunt-ts 配置更改为:
mochaTest: {
test: {
options: {
reporter: 'spec',
require: [
'ts-node/register'
]
},
src: ['lib/test/**/*.spec.js']
}
},
这行得通,但我非常乐意有人阐明 mocha 正在做什么。另外,为什么 mocha 在使用导出的其他 .ts 文件中成功转译/未检测到 "reserved word"?
编辑 2015 年 10 月 30 日:
所以我发现了为什么 mocha 试图执行我的 .ts 文件。我愚蠢地将其中一些作为 require('/path/file.ts') 导入,我应该关闭 '.ts' 扩展名。我的 mocha runner 不再需要 'ts-node'。这也解释了为什么 mocha 只在我的一些 .ts 文件上出错。