Node.js 为mocha中的ts节点重写'tsconfig.json'

Node.js 为mocha中的ts节点重写'tsconfig.json',node.js,mocha.js,tsconfig,Node.js,Mocha.js,Tsconfig,当从mocha调用时,是否可以覆盖ts节点使用的tsconfig.json 我的maintsconfig.json包含“模块”:“es2015”,但我只想将“模块”:“commonjs”用于ts节点 我试过这个 mocha --compilers ts:ts-node/register,tsx:ts-node/register \ --compilerOptions '{"module":"commonjs"}' \ --require ts-node/register test

当从mocha调用时,是否可以覆盖ts节点使用的
tsconfig.json

我的main
tsconfig.json
包含
“模块”:“es2015”
,但我只想将
“模块”:“commonjs”
用于ts节点

我试过这个

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
SyntaxError:意外的令牌导入
在exports.runInThisContext(vm.js:53:16)
在模块处编译(Module.js:387:25)
在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.(匿名函数)[as.tsx](/usr/lib/node_modules/ts node/src/index.ts:409:12)
在Module.load(Module.js:357:32)
在Function.Module.\u加载(Module.js:314:12)
at Module.require(Module.js:367:17)
根据需要(内部/module.js:16:19)
at/usr/lib/node_modules/mocha/lib/mocha.js:222:27
at Array.forEach(本机)
在Mocha.loadFiles(/usr/lib/node_modules/Mocha/lib/Mocha.js:219:14)
在Mocha.run(/usr/lib/node_modules/Mocha/lib/Mocha.js:487:10)
反对。(/usr/lib/node_modules/mocha/bin/_mocha:458:18)
在模块处编译(Module.js:413:34)
在Object.Module._extensions..js(Module.js:422:10)
在Module.load(Module.js:357:32)
在Function.Module.\u加载(Module.js:314:12)
位于Function.Module.runMain(Module.js:447:10)
启动时(node.js:146:18)
在node.js:404:3
--编译器选项不起作用

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

我所做的是:

  • 创建一个文件
    test/tshook.js
    。它包括:

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

    --require test/tshook.js
    test/**/*.ts
    
  • 这将把所需的设置传递给ts节点

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

    您需要通过
    TS\u NODE\u COMPILER\u OPTIONS
    环境变量设置配置

    unix计算机上的示例代码:

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

    摘自


    CLI和编程选项

    括号中表示的环境变量

    • -T,--transbile only
      使用TypeScript的更快的transbile模块(
      TS_节点_transbileonly
      ,默认值:false)
    • -I,--ignore[pattern]
      覆盖路径模式以跳过编译(
      TS\u NODE\u ignore
      ,默认值:/NODE\u modules/)
    • -P,--project[path]
      TypeScript JSON项目文件的路径(
      TS\u NODE\u project
    • -C,--compiler[name]
      指定自定义类型脚本编译器(
      TS\u NODE\u compiler
      ,默认值:类型脚本)
    • -D,--ignore diagnostics[code]
      按诊断代码忽略类型脚本警告(
      TS\u NODE\u ignore\u diagnostics
    • -O,--compiler options[opts]
      JSON对象与编译器选项合并(
      TS\u节点\u编译器\u选项
    • --files
      启动时从tsconfig.json加载文件(
      TS\u NODE\u files
      ,默认值:false)
    • --pretty
      使用pretty诊断格式化程序(
      TS\u NODE\u pretty
      ,默认值:false)
    • --跳过项目
      跳过项目配置解析和加载(
      TS_节点_跳过项目
      ,默认值:false)
    • --跳过忽略
      跳过忽略检查(
      TS\u节点\u跳过\u忽略
      ,默认值:false)
    • --log error
      记录类型的错误,而不是退出流程(
      TS_节点_log_error
      ,默认值:false)
    • --首选ts exts
      重新排序文件扩展名,以便首选TypeScript导入(
      ts\U节点\U首选\U ts\U exts
      ,默认值:false)

    在package.json-脚本部分:

    "test": "TS_NODE_PROJECT=src mocha"
    
    在我的项目的src目录中获取我的tsconfig.json,覆盖默认的tsconfig.json


    OP可以通过使用test而不是src来实现同样的效果,这在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';
    
    

    Typescript
    允许您覆盖配置文件。与其他解决方案中提到的在环境变量中硬编码JSON不同,在环境中指定重写的配置路径。
    TS\u NODE\u项目
    环境变量可用于此

    TS_NODE_PROJECT='./tsconfig.commonjs.json'
    
    因此,如果您的主配置为:

    tsconfig.json

    {
      "compilerOptions": {
        "target": "esnext",
        "module": "esnext",
       }
    }
    
    您可以创建另一个覆盖
    模块
    设置的配置

    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 
    
    在mac上

    您也可以使用ts摩卡()

    例子 package.json

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

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

    虽然似乎没有一个统一的linux/windows命令行语法可以使用,但是您可以从命令行设置
    编译器选项。在我的例子中,与OP非常相似,我有一个
    tsconfig.json
    和一个
    模块:esnext
    。我可以在命令行上覆盖:

    在Windows上运行,全局安装了ts节点,但安装在不同的外壳类型中:

    bash/mingw64:
    ts节点——编译器选项={“模块”:“commonJS”}xxx.ts

    cmd:

    ts节点--compiler options={\“module\”:\“commonJS\”}xxx.ts

    这会中断Webstorm调试中的断点。可能是地图文件有问题。请注意,断点在
    /src/
    文件中断开,而在
    /test{
      "extends": "../tsconfig.json",
      "compilerOptions": {
        "module": "commonjs"
      }
    }