Next.js 14.2.x 系 build 時、shiki でシンタックスハイライトが反映されない

要約
Next.js 14.2.x 系で Shiki ライブラリの v1.18.0 を使用した際、一部のシンタックスハイライトがビルド後に反映されない問題は、Shiki のバージョンを 1.21.0 にアップデートすることで解決できます。
意見はこのエリアに表示されます

エラーメッセージと原因

Next.js 14.2.x 系で Shiki を使用した際、ビルド時に以下のようなエラーが発生することがあります。

このエラーの原因は、Shiki がエクスポートする JSON.parse を含むテンプレート文字列が Next.js のバンドラーによって不正に変換されてしまうことです。特に、Shiki ライブラリの v1.18.0Next.js v14.2.x 以降の組み合わせで発生しやすくなります。この問題は、Next.js 15 のカナリア版では修正されています。

一時的な解決策: Next.js のバージョンをダウングレード

このバグの一時的な解決策として、Next.js のバージョンをダウングレードする方法があります。

  • npm install next@14.1.0 で、バージョン 14.1.0 にダウングレード
  • 再びアップデートしたい場合は、npm install next@14.2.13 で元に戻すことが可能です

恒久的な解決策: Shiki バージョンをアップデート

Shiki のバージョンを 1.21.0 にアップデートすることで、この問題は修正されます。修正内容にはビルドパフォーマンスの改善も含まれており、アセットのバンドリングをスキップするように変更されています。この変更により、Next.js の v14.2.x 以降で発生していたバンドルエラーが解消される可能性があります。

修正に関する PR:

Shiki のバージョン 1.21.0 をインストールすることで、問題を解決できます。

Shiki の修正内容について

Shiki バージョン 1.21.0 では、以下のような変更が加えられています。

  • packages/shiki/src/assets 以下の langsthemes および *.json がバンドリング対象から除外されました。
  • 新しく追加された packages/shiki/src/langspackages/shiki/src/themes のディレクトリもバンドリング対象から除外されています。

これにより、アセットファイルを再バンドルせず、そのまま dist にコピーする方式に変更されています。この修正は、ビルド時のパフォーマンス向上だけでなく、ビルドエラーの解決にも寄与しています。

次回、同様の問題が発生した場合の対策

次回同様の問題が発生した場合、Shiki の修正が反映された最新版の Next.js にアップデートすることを検討してください。特に、次の安定版となる Next.js 14.3 系のリリースを待つのが良いでしょう。

Next.js のパッケージアップデート手順

まず、Next.js の最新版がリリースされているかを確認します。

Next.js 14.x の最新バージョンがリリースされている場合、以下のコマンドでその最新バージョンにアップデートします。

公式リリース情報については、Next.js GitHub リポジトリで確認することができます。

ダウングレードする場合の手順

Next.js のバージョンを 14.1.x にダウングレードする場合、以下のコマンドを使用します。

14.1.0 版の場合:

14.1.1 版の場合:

これにより、Shiki と Next.js の互換性の問題を回避し、シンタックスハイライトが正しく機能するようになります。

Explore More
関連記事はありません。