karma打字脚本被.d.ts打字弄糊涂,导致无法绑定到npm包代码



我正在将一个npm包导入到我的项目中,其中有一个package.json,如下所示:

{
// ...
"browser": "dist/umd/index.js",
"main": "dist/cjs/index.js",
"module": "dist/fesm2015/index.mjs",
"esm2015": "dist/index.js",
"fesm2015": "dist/fesm2015/index.mjs",
"typings": "dist/index",
"sideEffects": false,
"exports": {
"node": {
"module": "./dist/fesm2015/index.mjs",
"require": "./dist/cjs/index.js"
},
"browser": {
"module": "./dist/fesm2015/index.mjs",
"default": "./dist/umd/index.js"
},
"default": "./dist/cjs/index.js"
},
// ...
}

(我真的,真的很想在上面的包中有"type": "module",但这创造了一个痛苦的世界,试图让因果报应和其他工具快乐。(

我可以很好地构建和运行使用上述npm包的项目,并且我可以在因果报应之外运行mocha单元测试,而不会有任何问题。然而,当在因果报应下运行时,我会遇到这样的错误:

20 06 2021 10:58:05.127:INFO [Chrome 91.0.4472.106 (Mac OS 10.15.7)]: Connected on socket 9qHeabxqGGw_tCrRAAAB with id 99567255
Chrome 91.0.4472.106 (Mac OS 10.15.7) @tubular/util should blend colors correctly FAILED
TypeError: math_1.round is not a function
at colorFromRGB (src/browser-graphics-util.js:2:2895)
at Object.blendColors (src/browser-graphics-util.js:2:1803)
at Context.<anonymous> (src/index.spec.js:60:45)
Chrome 91.0.4472.106 (Mac OS 10.15.7): Executed 30 of 30 (1 FAILED) (0.818 secs / 0.789 secs)
TOTAL: 1 FAILED, 29 SUCCESS

我的项目代码似乎没有正确绑定到导入的npm包中的代码,所有依赖该包中代码的测试都失败了。

如果我对我的node_modules目录的内容进行一点手动操作,并通过删除"typings": "dist/index"来修改导入的npm包的package.json,karma再次感到高兴,我的所有测试都成功了。

为什么,为什么看在你选择的上帝的份上,打字的存在对绑定到npm包中的代码的成功或失败的因果报应打字脚本有什么不同?

我肯定希望这个包(这是我在另一个项目中创建的包(提供TypeScript打字员,所以永久取消打字员不是一种选择。我如何告诉因果报应或因果报应打字稿忽略这些打字,或者干脆不要被它们弄糊涂?

这是我当前的karma.conf.js:

module.exports = function (config) {
config.set({
frameworks: ['chai', 'karma-typescript', 'mocha'],
files: [
'src/**/*.ts'
],
preprocessors: {
'src/**/*.ts': 'karma-typescript'
},
reporters: ['progress', 'karma-typescript'],
browsers: ['Chrome'],
karmaTypescriptConfig: {
tsconfig: './tsconfig.karma.json'
},
});
};

以及tsconfig.karma.json,它的存在只是为了让karma构建CommonJS模块而不是ESM模块:

{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "commonjs",
"target": "ES2015"
},
"exclude": [
"dist",
"node_modules"
]
}

更新:

关于这个问题的另一点信息。如果我使用这样的显式导入:

import { max, min, round } from '../node_modules/@tubular/math/dist/cjs';

而不是:

import { max, min, round } from '@tubular/math';

问题消失了,这证实了这是一个模块解决问题。

那么,在使用因果报应类型脚本的因果报应中运行时,模块分辨率发生了什么变化呢?有没有可以用来调整模块分辨率的设置?

我想明白了。

karma-typescript依赖于browser-resolve,我导入的package.json有一个"browser"条目,但目的有所不同,显然与karma-typescript使用browser-resolve的方式完全不兼容。

只要我去掉"browser"字段,"typings"字段就可以保留,并且不再导致我的测试失败。

最新更新