69

tsconfig.json从 mocha 调用时是否可以覆盖使用哪个ts-node?

我的 main tsconfig.jsoncontains "module": "es2015",但我只想"module": "commonjs"用于 ts-node 。

我试过这个

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
4

8 回答 8

76

需要通过TS_NODE_COMPILER_OPTIONS环境变量来设置配置

Unix机器上的示例代码:

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

从存储库文档中提取的说明


CLI 和编程选项

括号中表示的环境变量。

  • -T, --transpile-only使用 TypeScript 更快的 transpileModule ( TS_NODE_TRANSPILE_ONLY, 默认值: false)
  • -I, --ignore [pattern]覆盖路径模式以跳过编译(TS_NODE_IGNORE默认:/node_modules/)
  • -P, --project [path]TypeScript JSON 项目文件的路径 ( TS_NODE_PROJECT)
  • -C, --compiler [name]指定自定义 TypeScript 编译器(TS_NODE_COMPILER默认值:typescript)
  • -D, --ignore-diagnostics [code]通过诊断代码忽略 TypeScript 警告 ( TS_NODE_IGNORE_DIAGNOSTICS)
  • -O, --compiler-options [opts]要与编译器选项合并的 JSON 对象 ( TS_NODE_COMPILER_OPTIONS)
  • --files启动时从 tsconfig.json 加载文件(TS_NODE_FILES,默认值:false)
  • --pretty使用漂亮的诊断格式化程序(TS_NODE_PRETTY,默认值:false)
  • --skip-project跳过项目配置解析和加载(TS_NODE_SKIP_PROJECT,默认值:false)
  • --skip-ignore跳过忽略检查(TS_NODE_SKIP_IGNORE,默认值:false)
  • --log-error记录类型的错误而不是退出进程(TS_NODE_LOG_ERROR,默认值:false)
  • --prefer-ts-exts重新排序文件扩展名,以便首选 TypeScript 导入(TS_NODE_PREFER_TS_EXTS默认值:false)
于 2017-06-03T12:08:57.537 回答
32

TypeScript 允许您覆盖配置文件。与其在其他解决方案中提到的那样在环境变量中硬编码 JSON,不如在环境中指定覆盖的配置路径。TS_NODE_PROJECT环境变量可以用于此。

TS_NODE_PROJECT='./tsconfig.commonjs.json'

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

tsconfig.json

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

您可以创建另一个覆盖该module设置的配置。

tsconfig.commonjs.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直接指定该路径(在 mocha 之外)运行:

ts-node -P tsconfig.commonjs.json -r myFile.ts 
于 2019-05-25T18:02:17.103 回答
21

--compilerOptions不会工作。

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

我所做的是:

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

    require("ts-node").register({
      project: "test/tsconfig.json",
    });
    
  2. 我编辑了我test/mocha.opts的:

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

这应该会将所需的设置传递给ts-node

require("ts-node").register({
  compilerOptions: {
    module: "commonjs",
  },
});
于 2017-03-03T21:14:21.057 回答
7

在 package.json - 脚本部分:

"test": "TS_NODE_PROJECT=src mocha"

在我的项目的 src 目录中选择我的 tsconfig.json,覆盖默认的 tsconfig.json。

OP 可以通过使用 test 而不是 src 来达到同样的效果

于 2017-06-29T08:40:45.987 回答
6

这在 Windows 上对我有用

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

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

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

于 2019-04-10T09:54:24.997 回答
4

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

例子

包.json

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

测试/tsconfig.cjs.json

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "module": "commonjs"
  }
}
于 2019-10-01T13:37:16.147 回答
3

虽然似乎没有统一的 linux/windows 命令行措辞有效,但您可以compiler-options从命令行设置。就我而言,就像 OP 一样,我有一个tsconfig.json带有module: esnext. 我能够在命令行上覆盖:

在 Windows 上运行,ts-node全局安装,但使用不同的 shell 类型:

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

命令:
ts-node --compiler-options={\"module\":\"commonJS\"} xxx.ts

于 2020-01-09T02:59:52.613 回答
1

在 Mac 上

"test": "TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' mocha --require ts-node/register test/**/*.ts",
于 2019-06-25T04:36:29.240 回答