monorepo 中带有 tyescript 的玩笑不适用于根文件夹之外的依赖项

Spe*_*ord 6 javascript typescript jestjs monorepo ts-jest

我将 Jest 与 Typescript 结合使用。我想创建一个单一存储库。我的文件夹结构是:

fe
|-app1
|--.jest.config.ts
|--tsconfig.json
|-shared
|--dummyData.ts
Run Code Online (Sandbox Code Playgroud)

我想要一个单元测试来app1访问shared文件夹中的一些数据。

fe/app1/demo.spec.ts:

import { someData } from '@shared/dummyData' //<--HERE: the alias is works, but jest can not understand "export" keyword

descrube('demo' () => {
  it('demo test', () => {
    expect(someData).toBe('DUMMY'));
  })
})
Run Code Online (Sandbox Code Playgroud)

fe/shared/dummyData.ts:

export const someData = 'DUMMY';
Run Code Online (Sandbox Code Playgroud)

问题是 jest 抛出错误:

Jest encountered an unexpected token
{"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){export const someData = 'DUMMY';
                                                                                        ^^^^^^
Run Code Online (Sandbox Code Playgroud)

据我了解,它无法解析由 ts 和 babel 生成的 typescript 或 es6 模块。当文件夹位于 inside时它工作正常sharedapp1,但是一旦它位于外部(并且在根文件夹 ig 之外'<rootDir>/../shared/$1'),它就会开始抛出该错误。


这是我的配置:

我在中描述了别名fe/app1/tsconfig.json

{
  ...
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext", 
    "paths": {
      "@/*": ["app/src/*"],
      "@shared/*": ["shared/*"]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

并在fe/app1/.jest.config.ts

module.exports = {
...
  transform: {
    '^.+\\.js$': '<rootDir>/node_modules/babel-jest',
    '^.+\\.(jsx?|tsx?)$': 'ts-jest'
  },
  moduleNameMapper: {
    '^@/(.*)$': '<rootDir>/src/$1',
    '^@shared/(.*)$': '<rootDir>/../shared/$1',
  }
}
Run Code Online (Sandbox Code Playgroud)

一些想法:

  • 据我了解,我必须告诉 jest 对 rootDir 之外的代码应用相同的解析器(babel 等)。
  • 我想可以tsconfig在根文件夹(fe)中创建一个,但我想从fe/app1文件夹启动单元测试...
  • 也许可以使用projectsroots等属性来配置这些东西,但到目前为止我运气不好。

Spe*_*ord 4

好的,我找到了解决方案:

对于 monorepo,将 babel 配置作为 JS 文件很重要

因此,只需重命名.babelrcbabel.config.js(在您调用 jest 的文件夹中,在我的例子中是fe/app1

欲了解更多信息,您可以查看此评论(也许还有此线程