javascript - 尝试使用 @alias 时,Jest 无法找到 @babel/code-frame
问题描述
import
我们的应用程序使用ES2015 样式语法导入文件,利用 Webpack4.6.0
对 ES2015 模块的原生支持。我们还使用别名来缩短我们的相对文件路径。
Webpack.conf.js
resolve: {
extensions: ['.js', '.json', '.less'],
alias: {
'@': resolve('public/js'),
'handlebars': 'handlebars/dist/handlebars.js',
},
modules: ['less', 'node_modules']
},
例子.js
import widget from '@/widgets/widget';
文件结构
- webpack.conf.js
- .babelrc
- test/
- public/
- - js/
- - - widgets/
- - - - widget.js
例如,当我导入example.js
具有别名的 exampleimport
时,Jest 会抛出错误,“无法解析模块'@/widgets/widget'。
根据一篇非常具体的文章以及Jest 文档,解决方案是使用 Jest 的ModuleNameMapper
配置属性来设置匹配别名。我试图这样做:
包.json
"jest": {
"moduleNameMapper": {
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js",
"\\.(css|less)$": "<rootDir>/__mocks__/styleMock.js",
"@(.*)$": "<rootDir>/public/js/$1"
},
"verbose": true,
"transform": {
"^.+\\.js$": "babel-jest"
},
"globals": {
"NODE_ENV": "test"
},
"moduleFileExtensions": [
"js"
],
"moduleDirectories": [
"node_modules"
]
},
以及正确配置 babel:
.babelrc
{
"presets": [
[
"env",
{
"modules": false,
"test": {
"plugins": ["transform-es2015-modules-commonjs"]
}
}
],
"es2015",
"stage-2"
],
"plugins": [
"syntax-dynamic-import"
]
}
现在,当我运行 Jest(--no-cache
以防万一)时,我得到了这个错误:
test/test.test.js
● Test suite failed to run
Configuration error:
Could not locate module @babel/code-frame (mapped as /home/calebjay/Documents/ide/public/js/babel/code-frame)
Please check:
"moduleNameMapper": {
"/@(.*)$/": "/home/calebjay/Documents/ide/public/js/$1"
},
"resolver": undefined
@babel/code-frame
我在 之外找不到任何地方package-lock.json
,只是为了咯咯笑,我@{{anything}}
从那里删除了所有提及并再次运行测试,结果相同。
开玩笑是不是以某种方式越过了通天塔?如何使用别名让我的测试与 Jest 一起运行?
编辑:为了缩小调用范围@babel/code-frame
,我尝试删除es2015
和stage-2
from .babelrc
,但没有效果。我尝试在 中删除transform
Jest 配置的属性,但package.json
没有效果。我尝试从 中删除该env.test.plugins
属性.babelrc
,但没有效果。同样的错误。
EDIT2:想也许其他一些包需要它,我检查了package.json
. 似乎jest-message-util
需要@babel/code-frame
. 我确实@babel/code-frame
在我的 node_modules 中看到了......所以问题可能是小丑在说“好的,@ 的所有实例都变成 public/js”?
解决方案
"@(.*)$": "<rootDir>/public/js/$1"
将转换@babel/code-frame
为
"<rootDir>/public/js/babel/code-frame"
这不存在。您需要使您的模式更具体并执行
"@/(.*)$": "<rootDir>/public/js/$1"
注意/
开头的附加部分。这样它仍然会匹配你的@/widgets/widget
,但它不会匹配其他范围的包。
推荐阅读
- regex - 小数语言的正则表达式
- javascript - 我怎样才能点击一个
- python - 如何使用 Python 正确遍历 Selenium Webdriver 中的 Web 元素列表?
- laravel - Laravel 路由中复杂模型名称的依赖注入
- python-3.x - AttributeError:当我使用 blaze 模块时,模块 'pandas' 没有属性 'tslib'
- python - 如何纠正我在石头剪刀布游戏中的错误
- json - Shell 脚本 - 如果在 Bash 中匹配,则迭代、比较和提取 JSON 的值
- typescript - 如何在 tsconfig 中声明库中包含的类型?
- javascript - 屏幕阅读器在 aria-valuetext 在任何时候都不会更改多个步骤后停止阅读
- swift - 我可以使用泛型协议来描述非泛型类型的委托吗?