Reactを自作しようとしたときに"pragma and pragmaFrag cannot be set when runtime is automatic."のエラーが出たのでその対応方法を書いていく
最近、Reactの中身をちゃんと理解せねばと思い、Reactの自作につながるような勉強をしています。
一応下に備忘録を残していっていますが、個人用のメモみたいなレベルなので、あまり見やすくはないと思います。
うまく成果を得られたらQiitaかZennにまとめようと思っていますが、どうなることやら...
下記のドキュメントを参照しながら進めているのですが、"pragma and pragmaFrag cannot be set when runtime is automatic."というエラーが出て、
「コード同じなのになんでだろう?」
と少しばかり悩んだのでその時の解決方法などを書いていきます。
下は上の翻訳記事。
"pragma and pragmaFrag cannot be set when runtime is automatic."の発生原因
問題のコードは下記です。
ここはbableがjsx
をトランスパイルした後に、 Didact.createElement
で処理が行われます。
(この説明だけだと意味がわからないと思うので、上に貼った記事を読んでみてください)
/** @jsx Didact.createElement */ const element = ( <div style="background: salmon"> <h1>Hello World</h1> <h2 style="text-align:right">from Didact</h2> </div> );
この処理自体はなんの問題もないのですが、この記事の中での環境はReact v16です。
現在、最新バージョンのReactはv17となっているのですが、実はReact 17だとこれは解釈できず、"pragma and pragmaFrag cannot be set when runtime is automatic."というエラーを吐きます。
検証手順
下記のCodeSandboxは上のドキュメント内で実際に提示されているCodeSandboxのコードです。
これは現在通常通り動いていますが、CodeSandbox上で Dependencies
として設定されているライブラリのすべてを最新にアップデートすると、この事象が発生します。
- react 16.8.6 → 17.02
- react-dom 16.8.6 → 17.02
- react-scripts 3.0.1 → 4.0.3
これを解決する手立ては、下記のissueにありました。
React 17 + new JSX transform + JSX pragma/pragmaFrag · Issue #2041 · emotion-js/emotion · GitHub
ここに記載されている記述を参照して、下記のようにコメント部分を修正することでエラーが解消されます。
/** @jsxRuntime classic */ /** @jsx Didact.createElement */ const element = ( <div style="background: salmon"> <h1>Hello World</h1> <h2 style="text-align:right">from Didact</h2> </div> );
- なぜ、このような書き方にする必要があるのか?
- どこの変更によって、このような書き方にしなければならなくなったのか?
など細かい部分までは調べていませんが、取り急ぎ備忘録としてこちらに残します。