server-onlyをimportしたファイルを読み込みとテストが通らない問題の対処法
テストでThis module cannot be imported from a Client Component module.と言われる時の対処法
RSC(React Server Components)を用いる際などに、クライアントから読み込まれると困るファイルに対して server-only
というモジュールをimportすることで、クライアントからの参照時にエラーを発生させるという手法がある。
Next.jsのドキュメントにも記載がある
これを読み込んでいるモジュールをimportしたテストを書いたとき、 This module cannot be imported from a Client Component module.
と言われてしまった。
vitestを使用していたので vite.config.js
に以下の設定をすることで解決した。
server-only
は通常、エラーをthrowする処理が書かれた index.js
を読み込ませてエラーを起こし、サーバーコンテキストからインポートしたときだけ empty.js
を読み込ませることでエラーを発生させないようにしている。( empty.js
は名前の通り何も書かれていないJavaScriptファイル)
そういう仕組みなので、aliasを設定してempty.jsがインポートされるようにすれば解決する。