在 mocha 中为 ts-node 重写‘ tsconfig.json’

是否可以覆盖从摩卡调用时使用的 tsconfig.json t- 节点?

我的主 tsconfig.json包含 "module": "es2015",但是我想仅对 ts 节点使用 "module": "commonjs"

我试过了

mocha --compilers ts:ts-node/register,tsx:ts-node/register \
--compilerOptions '{"module":"commonjs"}' \
--require ts-node/register test/**/*.spec.ts*

但它没有奏效:

SyntaxError: Unexpected token import
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:387:25)
at Module.m._compile (/usr/lib/node_modules/ts-node/src/index.ts:406:23)
at Module._extensions..js (module.js:422:10)
at Object.require.extensions.(anonymous function) [as .tsx] (/usr/lib/node_modules/ts-node/src/index.ts:409:12)
at Module.load (module.js:357:32)
at Function.Module._load (module.js:314:12)
at Module.require (module.js:367:17)
at require (internal/module.js:16:19)
at /usr/lib/node_modules/mocha/lib/mocha.js:222:27
at Array.forEach (native)
at Mocha.loadFiles (/usr/lib/node_modules/mocha/lib/mocha.js:219:14)
at Mocha.run (/usr/lib/node_modules/mocha/lib/mocha.js:487:10)
at Object.<anonymous> (/usr/lib/node_modules/mocha/bin/_mocha:458:18)
at Module._compile (module.js:413:34)
at Object.Module._extensions..js (module.js:422:10)
at Module.load (module.js:357:32)
at Function.Module._load (module.js:314:12)
at Function.Module.runMain (module.js:447:10)
at startup (node.js:146:18)
at node.js:404:3
49875 次浏览

--compilerOptions不起作用。

您需要做的是自定义如何注册 ts-node。我的情况有点不同,我希望它使用 test/tsconfig.json,其中包含我的测试代码所需的设置。如果我只使用 --require ts-node/register,那么它使用的默认配置不包含运行测试所需的设置。

我所做的是:

  1. 创建一个文件 test/tshook.js,它包含:

    require("ts-node").register({
    project: "test/tsconfig.json",
    });
    
  2. I edited my test/mocha.opts to have:

    --require test/tshook.js
    test/**/*.ts
    

This should will pass the desired setting to ts-node:

require("ts-node").register({
compilerOptions: {
module: "commonjs",
},
});

你需要通过 ABc0环境变量设置配置

Unix 机器上的示例代码:

TS_NODE_COMPILER_OPTIONS='{"module":"commonjs"}' \
mocha --require ts-node/register 'test/**/*.spec.{ts,tsx}'

存储库文档摘录的解释


CLI 和程序方案

括号内的环境变量。

  • 使用 TypeScript 的更快的 transileModule (TS_NODE_TRANSPILE_ONLY,默认值: false)
  • -I, --ignore [pattern]重写路径模式以跳过编译(TS_NODE_IGNORE,缺省值:/node _ module/)
  • 到 TypeScript JSON 项目文件的路径(TS_NODE_PROJECT)
  • 指定一个自定义 TypeScript 编译器(TS_NODE_COMPILER,默认值: typeescript)
  • 通过诊断代码(TS_NODE_IGNORE_DIAGNOSTICS)忽略 TypeScript 警告
  • 对象与编译器选项(TS_NODE_COMPILER_OPTIONS)合并
  • 启动时从 tsconfig.json 加载文件(TS_NODE_FILES,默认值: false)
  • 使用漂亮的诊断格式化程序(TS_NODE_PRETTY,默认值: false)
  • 跳过项目配置解析和加载(TS_NODE_SKIP_PROJECT,默认值: false)
  • 跳过忽略检查(TS_NODE_SKIP_IGNORE,默认值: false)
  • --log-error记录类型错误,而不是退出进程(TS_NODE_LOG_ERROR,默认值: false)
  • --prefer-ts-exts重新排序文件扩展名,以便首选 TypeScript 导入(TS_NODE_PREFER_TS_EXTS,默认值: false)

在 package.json-script 部分:

"test": "TS_NODE_PROJECT=src mocha"

在我的项目的 src 目录中获取 tsconfig.json,重写默认的 tsconfig.json。

OP 可以通过使用 test 代替 src 来实现相同的目标

这个在窗户上对我很有用

set TS_NODE_COMPILER_OPTIONS={\"module\":\"commonjs\"} && mocha -r ts-node/register test/unit/*.test.ts


这就是促使我使用该解决方案的错误

(function (exports, require, module, __filename, __dirname) { import 'mocha';


TypeScript 允许您重写配置文件。与其像其他解决方案中提到的那样在环境变量中硬编码 JSON,不如在环境中指定重写的配置路径。ABc0环境变量可以用来做到这一点。

TS_NODE_PROJECT='./tsconfig.commonjs.json'

因此,如果您的主要配置是:

Tsconfig.json

{
"compilerOptions": {
"target": "esnext",
"module": "esnext",
}
}

您可以创建另一个重写 module设置的配置。

Json

{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "commonjs"
}
}

运行 mocha 时,指定要使用的重写配置:

"test": "TS_NODE_PROJECT='./tsconfig.commonjs.json' mocha -r ts-node/register test/**/*.spec.ts*"

这使得进一步定制您的 tsconfig非常容易,只是为了摩卡测试。你甚至可以运行 ts-node(在摩卡之外)直接指定路径:

ts-node -P tsconfig.commonjs.json -r myFile.ts

在 Mac 上

"test": "TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' mocha --require ts-node/register test/**/*.ts",

你也可以使用 t-mocha (https://www.npmjs.com/package/ts-mocha)

例子

包裹 Json

"test": "ts-mocha -p test/tsconfig.cjs.json test/**/*.test.ts"

Test/tsconfig.cjs.json

{
"extends": "../tsconfig.json",
"compilerOptions": {
"module": "commonjs"
}
}

虽然似乎没有一个统一的 linux/windows 命令行语法可以工作,但是您可以从命令行设置 compiler-options。在我的例子中,就像 OP 一样,我有一个带有 module: esnexttsconfig.json。我可以在命令行上重写:

在 Windows 上运行时,w/ts-node在全球范围内安装,但使用不同的 shell 类型:

Bash/mingw64:
ts-node --compiler-options={"module":"commonJS"} xxx.ts

中医药:
ts-node --compiler-options={\"module\":\"commonJS\"} xxx.ts

这并没有回答最初的核心问题,而是直指了摩卡咖啡的打印工作的核心,所以我将把它贴在这里,以防它对其他人有帮助。

我们发现需要一些可笑的反斜杠转义才能在 Windows 上运行。它在 Mac 上也能正常工作,尽管 Mac 不需要同样的转义。

然后,额外的 ts-node require指令是至关重要的。

文件 package.json:

{
"scripts": {
...
"test": "cross-env TS_NODE_COMPILER_OPTIONS={\\\"module\\\":\\\"commonjs\\\"} mocha"
},


...


"mocha": {
"require": [
"ts-node/register",
"tsconfig-paths/register"
],
"watch-files": [
"./src/**/*.ts",
"./tests/**/*.spec.ts"
],
"spec": "./tests/**/*.spec.ts"
}