在 mocha 中覆盖 ts-node 的 \`tsconfig.json\`

新手上路,请多包涵

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

我的主要 tsconfig.json 包含 "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

原文由 Ralph 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 848
2 个回答

需要通过 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)

原文由 lleon 发布,翻译遵循 CC BY-SA 4.0 许可协议

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 变得非常容易,仅用于 mocha 测试。您甚至可以运行 ts-node (在 mocha 之外)直接指定该路径:

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

原文由 Steven Spungin 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题