我正在尝试让ts-node选项--experimental-loader
与mocha一起工作,但没有成功。在开始尝试编译ES6模块之前,我曾经能够按照以下方式运行mocha测试:
"test": "nyc --reporter=html mocha --require ts-node/register src/**/*.spec.ts"
当生成ES6模块时,那种方法不再适用。
我会使用TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\" }'
来进行测试,但由于另一个复杂性,这对我并不起作用:我首先生成ES6模块,然后使用webpack和babel生成ES5 / CommonJS模块。
除非在我的本地TypeScript的import
语句末尾添加.js
,否则最后一步将无法正常运行。
但是发现添加这些.js
扩展名会破坏TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\" }'
解决方案,如果我回去删除所有的.js
扩展名,则此解决方案将起作用。显然,我不想在测试和构建过程中反复添加和删除这些扩展名。
为了简化,我已经移除了nyc,并尝试以以下方式运行测试:
mocha -r ts-node/register --experimental-loader ./ts-loader.mjs src/**/*.spec.ts
这种方式没有产生任何错误,但是也没有任何反应。就像 src/**/*.spec.ts
不存在一样。
我的无操作(暂时)虚拟加载器如下:
console.log('ts-loader loaded');
export async function resolve(specifier, context, defaultResolve) {
console.log('resolve');
return defaultResolve(specifier, context, defaultResolve);
}
export async function getFormat(url, context, defaultGetFormat) {
console.log('getFormat');
return defaultGetFormat(url, context, defaultGetFormat);
}
export async function getSource(url, context, defaultGetSource) {
console.log('getSource');
return defaultGetSource(url, context, defaultGetSource);
}
export async function transformSource(source, context, defaultTransformSource) {
console.log('transformSource');
return defaultTransformSource(source, context, defaultTransformSource);
}
export function getGlobalPreloadCode() {
console.log('getGlobalPreloadCode');
return '';
}
我可以看到加载成功的提示信息'ts-loader loaded'
,但是没有任何函数被调用。
我尝试了其他排列组合,但是仍然出现错误,例如将src/**/*.spec.ts
视为字面文件名而不是glob,或者出现找不到模块的错误。
我希望能够看到每个import
被处理时都调用我的loader,然后想办法操作文件扩展名,但是我还没有成功。有什么建议吗?
我正在使用node v14.15.1。可以在这里找到我的项目的完整代码,其中包括一个可工作的构建版本但测试不可用:https://github.com/kshetline/tubular_math
import * as umd from "umd";
Webpack愉快地引入了UMD,但是Mocha却在相同的代码中出错了。 我不知道怎么回事就随机解决了它,但是后来重建后,一切又都失败了。你解决了这个问题吗? - user3337629