ts-jest:将“@”字符映射到 /src 文件夹

Posted

技术标签:

【中文标题】ts-jest:将“@”字符映射到 /src 文件夹【英文标题】:ts-jest: map '@' char to /src folder 【发布时间】:2020-03-25 05:40:46 【问题描述】:

我有一个带有 typescript 的节点项目,并且在我的 tsconfig.json 文件中配置了以下路径:

    "paths":                                 /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
      "@project/*": ["./../*"],
      "@*": ["./*"],
    ,

我的配置文件位于 /project 文件夹,我的源位于 /project/src

它工作正常,它正确地将@xxx/yyy 映射到 src/xxx/yyy 和 @project/package.json 到 /project/package.json

我正在尝试使用 ts-jest 实现相同的效果,我尝试在我的 jest.config.js 文件中使用以下 moduleNameMapper:

module.exports = 
  preset: 'ts-jest',
  testEnvironment: 'node',
  roots: ['<rootDir>/src/'],
  modulePathIgnorePatterns: ['<rootDir>/dist/', '<rootDir>/build/'],
  testMatch: ['**/*.spec.ts'],
  moduleNameMapper: 
    "^\@(.*)": "<rootDir>/src/$1",
  

但我收到以下错误:

 FAIL  src/lib/error/BaseError.spec.ts
  ● Test suite failed to run

    Configuration error:

    Could not locate module @babel/code-frame mapped as:
    C:\data\devel\apps\sgte-it\coordinacion\juridicos\wspjn\src\babel/code-frame.

    Please check your configuration for these entries:
    
      "moduleNameMapper": 
        "/^@(.*)/": "C:\data\devel\apps\sgte-it\coordinacion\juridicos\wspjn\src\$1"
      ,
      "resolver": null
    

      at createNoMappedModuleFoundError (node_modules/jest-resolve/build/index.js:501:17)

另一方面,如果我像这样映射 /src 中的每个文件夹:

module.exports = 
  preset: 'ts-jest',
  testEnvironment: 'node',
  roots: ['<rootDir>/src/'],
  modulePathIgnorePatterns: ['<rootDir>/dist/', '<rootDir>/build/'],
  testMatch: ['**/*.spec.ts'],
  moduleNameMapper: 
    "@db/(.*)": "<rootDir>/src/db/$1",
    "@lib/(.*)": "<rootDir>/src/lib/$1",
    "@modules/(.*)": "<rootDir>/src/modules/$1",
    "@services/(.*)": "<rootDir>/src/services/$1"
  

它工作正常,但我必须用我添加的每个新根文件夹更新它。

有什么标准的、推荐的方法来实现这样的事情吗?我希望有一个特殊字符(在本例中为 @)指向我的 /src/ 文件夹。

还尝试将 '@' 替换为 '$' 但也出现其他错误...

【问题讨论】:

【参考方案1】:

我使它与以下配置一起工作。

    moduleNameMapper: 
        "^@/(.*)$": "<rootDir>/src/$1",
        "^@components/(.*)$": "<rootDir>/src/components/$1",
    ,

This article 很有帮助。

在我的情况下,我想要将 @ 映射到 ./src@components./src/components

【讨论】:

【参考方案2】:

我可以解决它,但不能使用@ 符号,我必须使用$,此外,我必须将其转义并将其括在方括号中,如下所示:

tsconfig.json:

    "paths":                                 /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
      "$project/*": ["./../*"],
      "$*": ["./*"],
    ,

jest.config.js:

module.exports = 
  preset: 'ts-jest',
  testEnvironment: 'node',
  roots: ['<rootDir>/src/'],
  modulePathIgnorePatterns: ['<rootDir>/dist/', '<rootDir>/build/'],
  testMatch: ['**/*.spec.ts'],
  moduleNameMapper: 
    "^[\$]project/(.*)": "<rootDir>/$1",
    "^[\$](.*)": "<rootDir>/src/$1",
  

我希望它对其他人有用,配置所有这些小细节真的很痛苦......


该死,我几乎都可以正常工作了(ttsc 和 ts-jest 工作正常),但是 vscode 无法识别使用 '$' 映射的导入,但使用 '@' 可以正常工作......

【讨论】:

以上是关于ts-jest:将“@”字符映射到 /src 文件夹的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 ts-jest 转换 node_modules 中的文件夹

React Jest 测试无法使用 ts-jest 运行 - 导入文件上出现意外令牌

Jest / Ts-Jest / Babel:调试失败。错误表达式:输出生成失败

使用 ts-jest 和 webpack 允许 Jest 识别和解析模块别名需要啥?

Mybatis输入映射和输出映射

Webpack 2 - 无法在字符串上创建属性“映射”