Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bug : esModuleInterop: false -> true, dayjs is not function #241

Closed
unchaptered opened this issue Sep 29, 2022 · 2 comments
Closed

Bug : esModuleInterop: false -> true, dayjs is not function #241

unchaptered opened this issue Sep 29, 2022 · 2 comments
Labels
bug 버그 발생 test 테스트 코드

Comments

@unchaptered
Copy link
Member

한 일

현재 test/unit/modules/provider 브런치에서 DayjsProvider 를 테스트하고자 합니다.

에러 내용

DayjsProvider.prototype.getDayjsInstance() 에 대한 호출 테스트 실행 시 다음과 같은 에러가 발생합니다.

dayjs is not function

~/src/modules/providers/dajys.provider.ts 파일의 위 2 줄이 jest, esbuild-jest 와 충돌이 나고 있습니다.

import "dayjs/locale/ko";
import * as dayjs from "dayjs";

아마도, tsc tsconfig.jsonesbuild-jest 이 컴파일 단계에서 다르게 작동하는 것 같습니다.

조치 사항

위 이슈에서 "esModuleInterop": true 를 사용하면 다음과 같이 변경시킬 수 있음을 알게 되었습니다.

  • before : import * as dayjs from "dayjs";
  • after : import dayjs from "dayjs";

TypeScript Compiler Configuration Options - esModuleInterop 에 따르면, 해당 옵션은 기본적으로 false 입니다.
또한 다음과 같이 설명 되어 있습니다.

Emit additional JavaScript to ease support for importing CommonJS modules. This enables allowSyntheticDefaultImports for type compatibility.

사실 해당 부분의 설명이 조금 명확하지 않은 것 같아서 더 구글링 해보니, TypeScript import 가 javascript 의 import 와 다르게 작동하는 것을 알게 되었습니다.

기본적인 tsc, TypeScript 에서의 import 에 대한 원리 ("esModuleInterop": false) 는 다음과 같습니다.

JavaScript CommonJS TypeScript ES Module
const moment = require("moment") import * as momment as "momment"
const moment = require("moment").default import moment from "moment"

이러한 import 에 대한 구동 원리가 esbuild-jest 와 tsc 가 다르기 때문에 commonjs 와 동일하게 변경해야 합니다.
따라서, "esModuleInterop": true 로 설정하는 구문을 tsconfig.build.json 과 tsconfig.json 에 포함시키면 됩니다.

{
  "compilerOptions": {
    "esModuleInterop": true,
  }
}

그리고 src/**.ts 파일에 포함되어 있는 namespace import 구문을 전부 일반 import 구문으로 변경하는 것으로 문제가 해결되었습니다.

환경 설정

OS: Windows 10
Node:  v16.15.1 (@unchaptered), v16.13.1(@axisotherwise)
npm : v8.11.0 (@unchaptered), v8.2.2 (@axisotherwise)
@unchaptered unchaptered added bug 버그 발생 test 테스트 코드 labels Sep 29, 2022
@unchaptered unchaptered changed the title Bug : dayjs is not function Bug : dayjs is not function, tsc. jest, esbuild-jest Sep 29, 2022
unchaptered added a commit that referenced this issue Sep 29, 2022
unchaptered added a commit that referenced this issue Sep 29, 2022
@unchaptered unchaptered changed the title Bug : dayjs is not function, tsc. jest, esbuild-jest Bug : esModuleInterop: false -> true, dayjs is not function Sep 29, 2022
@unchaptered unchaptered changed the title Bug : esModuleInterop: false -> true, dayjs is not function Bug : esModuleInterop: false -> true, dayjs is not function Sep 29, 2022
@unchaptered
Copy link
Member Author

main 브런치로 병합하고 배포 전까지 지속적인 모니터링 기간 을 가지고 이상 행동이 식별되면 다시 이슈를 열겠습니다.

@axisotherwise
Copy link
Member

평소 esModuleInterop 옵션에 대해 잘 모르고 무지성으로 사용하고있었는데 감사합니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug 버그 발생 test 테스트 코드
Projects
None yet
Development

No branches or pull requests

2 participants