created: 2024-03-04T01:43:01.953Z
jest で SyntaxError: Unexpected token '<'
この記事は jest のエラーの話その2。
その1では jest が ESM に対処するための設定をしたが、今回は jest が jsx に対処するための設定をすることになった。
エラーメッセージ
SyntaxError: Unexpected token '<'
テストコード内の < という記号がパースできなくて投げ出している。
tsconfig.json
Next.js で書いているプロジェクトだったので tsconfig.json#jsx は preserve になっている。
"jsx": "preserve",
preserve: Emit .jsx files with the JSX unchanged
preserve は jsx のパースは Next.js 側がやってくれるので、tsc では jsx のパースをしないという設定。
アプリを動かしているときこれで問題ないのだが、ts-jest には jsx をパースする機能がないため、「< は知らない文字なので無理です」というエラーになっている。
tsc に jsx をパースさせてみる
tsc に jsx をパースさせるように設定を変更する。
tsconfig.test.json ファイルを用意してで既存の設定を extends する。
jest.config.js
...(中略)
transform: {
"^.+\\.(ts|tsx)$": [
"ts-jest",
{
useESM: true,
tsconfig: "./tsconfig.test.json",
},
tsconfig.test.json
{
"extends": "./tsconfig.json",
"compilerOptions": {
"jsx": "react"
}
}
エラーメッセージ
このままだとまだダメだった。↓ようなエラーになる。
'React' refers to a UMD global, but the current file is a module. Consider adding an import instead.
ググった感じどっちかやらないとダメらしい
- jsx(tsx) ファイルでは
import Reactする - tsconfig.json を
"jsx": react-jsxにする
react-jsx と react の違い
jsx 記法は createElement という単なる関数のシンタックスシュガーだが、その関数を使えるようにする import { createElement } from "react" を jsx のパーサーがやるのか、それとも webpack とかのバンドラにやらせるのかの葛藤(というかバンドラごとの実装の違い)が react-jsx というオプションを産んだらしい。
react-jsx についてはこちらがわかりやすかった。
今回は各ファイルで import React することにして、エラーは解消した。
import React, { FC } from "react";
