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