환경:
NodeJS: 8.X
typescript: 2.8.X
jest: 22.X.X
ts-jest: 22.X.X
NodeJS + Typescript를 이용해서 backend를 구성할때, 특정 module을 여러 module에서 공유하고 싶을때가 있다.
이때, 공통 모듈을 package.json 을 가지는 하나의 독립모듈로 구성하고, 이를 dependency에 넣는 것도 좋지만(npm module을 사용하는 일반적인 방법), 그냥 단순하게 module directory를 공용으로 사용하고 싶은 경우도 많다.
예를 들면.
moduleA/
|- package.json
|- src/
|- common (*1)
|- ...
moduleB/
|- package.json
|- src/
|- common (*2)
|- ...
에서 (*1)과 (*2)에서 동일한 코드를 사용하고자 한다고 가정해 보자. 매번 똑같은 파일을 유지하는 것은 문제의 여지가 많으므로, 아래와 같은 구조를 만들고 싶을 것이다.
moduleA/
|- package.json
|- tsconfig.json
|- src/
|- commonA --> (*3) // Symbolic link to (*3)
|- ...
moduleB/
|- package.json
|- tsconfig.json
|- src/
|- commonA --> (*3) // Symbolic link to (*3)
|- ...
shared/
|- commonA/ (*3)
|- ...
그리고, moduleA와 moduleB의 tsconfig.json에는 symbolic link를 쫓아갈 수 있도록
"compilerOptions": {
...
"preserveSymblinks:" true
...
}
로 설정한다.
자... 이제 모든 것이 문제없이 동작하는 것처럼 보인다.
그런데.. Jest를 수행시키면, 바로 문제가 발생한다.(제대로 Type을 Import하지 못한다!)
그리고, Symbolic link를 제대로 쫓아가지 못하는 것처럼 보인다.
Jest관련 각종 정보를 찾아보면, 일단은, 이 부분은 Known Issue이고, 지원하지 않기로 결정한 것으로 보인다.
(어딘가 본 기억이 있는데, 정확한 link는 잊어 먹었다는... 뭐 이후 또 바뀔수도 있으니....)
그래서, workaround를 고민해 보면, 아래와 같이 그냥 shared module에 ts-jest를 설치해 주면 문제가 해결되는 것 같다.
shared/
|- package.json // only 'ts-jest' exists at 'devDependencies'
|- commonA
|- ...
이렇게 해 두고, shared에서 npm install 을 통해서 ts-jest 를 node_modules 안쪽에 설치하고 나면, moduleA와 moduleB의 jest가 문제없이 동작하는 것을 볼 수 있다.
더 좋은 방법이 있는지는, 그리고 왜 이렇게 하면 동작하는지는 좀 더 살펴봐야할 부분이긴하나... 굳이 살펴봐야하나... 싶기도 하다... ^_^
'Language > Javascript' 카테고리의 다른 글
[rxjs] Interesting unexpected behavior of withLatestFrom() at Rxjs. (0) | 2020.04.14 |
---|---|
[NodeJs] Overhead of Promise(async/await) (more serious than you think!) (0) | 2019.05.16 |
[NodeJS] Kill child process executed via 'exec' and 'spawn' (0) | 2017.12.28 |
[Javascript] Generator 를 이용해서 Callback hell을 벗어나 보기.... (0) | 2017.12.28 |
[Javascript] Understanding 'Prototype' of Javascript (0) | 2017.12.28 |