Codemods
Codemodsは、コードベースに対してプログラム的に実行される変換です。これにより、大量の変更を手動で各ファイルを確認することなくプログラム的に適用できます。
Next.jsは、APIが更新または非推奨になった際にNext.jsコードベースをアップグレードするためのCodemod変換を提供しています。
使用方法
ターミナルでプロジェクトフォルダに移動(cd
)した後、以下を実行します:
<transform>
と<path>
を適切な値に置き換えてください。
transform
- 変換名path
- 変換対象のファイルまたはディレクトリ--dry
ドライランを実行(コードは編集されません)--print
変更後の出力を比較用に表示
Codemods一覧
15.0
App RouterのRoute Segment Config runtime
値をexperimental-edge
からedge
に変換
app-dir-runtime-config-experimental-edge
注記: このCodemodはApp Router専用です。
このCodemodはRoute Segment Config runtime
の値experimental-edge
をedge
に変換します。
例:
変換後:
非同期Dynamic APIへの移行
動的レンダリングを選択したAPIで、以前は同期アクセスがサポートされていたものが非同期になりました。この破壊的変更について詳しくはアップグレードガイドをご覧ください。
next-async-request-api
このCodemodは、非同期になった動的API(next/headers
のcookies()
、headers()
、draftMode()
)を適切にawait
するか、適用可能な場合はReact.use()
でラップします。
自動移行が不可能な場合、Codemodはタイプキャスト(TypeScriptファイルの場合)または手動レビューと更新が必要であることをユーザーに通知するコメントを追加します。
例:
変換後:
ページ/ルートエントリ(page.js
、layout.js
、route.js
、default.js
)またはgenerateMetadata
/generateViewport
APIでparams
またはsearchParams
プロップのプロパティアクセスを検出した場合、同期関数から非同期関数への変換を試み、プロパティアクセスをawait
します。非同期にできない場合(クライアントコンポーネントなど)、React.use
を使用してプロミスをアンラップします。
例:
変換後:
知っておくと良いこと: このCodemodが手動介入が必要な箇所を特定したが、正確な修正方法がわからない場合、コードにコメントまたはタイプキャストを追加してユーザーに通知します。これらのコメントには**@next/codemod**というプレフィックスが付き、タイプキャストには
UnsafeUnwrapped
というプレフィックスが付きます。 これらのコメントが明示的に削除されるまで、ビルドはエラーになります。詳細はこちら
NextRequest
のgeo
とip
プロパティを@vercel/functions
に置き換え
next-request-geo-ip
このCodemodは@vercel/functions
をインストールし、NextRequest
のgeo
とip
プロパティを対応する@vercel/functions
の機能に変換します。
例:
変換後:
14.0
ImageResponse
インポートの移行
next-og-import
このCodemodは動的OG画像生成の使用のために、next/server
からnext/og
へのインポートを変換します。
例:
変換後:
viewport
エクスポートの使用
metadata-to-viewport-export
このCodemodは特定のビューポートメタデータをviewport
エクスポートに移行します。
例:
変換後:
13.2
組み込みフォントの使用
built-in-next-font
このCodemodは@next/font
パッケージをアンインストールし、@next/font
インポートを組み込みのnext/font
に変換します。
例:
変換後:
13.0
Next Imageインポートのリネーム
next-image-to-legacy-image
Next.js 10、11、または12アプリケーションのnext/image
インポートをNext.js 13で安全にnext/legacy/image
にリネームします。また、next/future/image
をnext/image
にリネームします。
例:
変換後:
新しいImageコンポーネントへの移行
next-image-experimental
next/legacy/image
から新しいnext/image
に危険を伴って移行し、インラインスタイルを追加して未使用のプロップを削除します。
layout
プロップを削除し、style
を追加objectFit
プロップを削除し、style
を追加objectPosition
プロップを削除し、style
を追加lazyBoundary
プロップを削除lazyRoot
プロップを削除
Linkコンポーネントから<a>
タグを削除
new-link
Linkコンポーネント内の<a>
タグを削除するか、自動修正できないLinkにlegacyBehavior
プロップを追加します。
例:
自動修正が適用できない場合、legacyBehavior
プロップが追加されます。これにより、その特定のリンクに対して古い動作を使用し続けることができます。
11
CRAからの移行
cra-to-next
Create React AppプロジェクトをNext.jsに移行します。Pages Routerを作成し、動作を一致させるために必要な設定を行います。初期段階では、SSR中のwindow
使用による互換性の破壊を防ぐために、クライアントサイドのみのレンダリングが利用され、Next.js固有の機能を段階的に採用できるようにシームレスに有効化できます。
この変換に関するフィードバックはこちらのディスカッションで共有してください。
10
Reactインポートの追加
add-missing-react-import
新しいReact JSX transformが動作するように、React
をインポートしていないファイルを変換します。
例:
変換後:
9
匿名コンポーネントから名前付きコンポーネントへの変換
name-default-component
バージョン9以降
Fast Refreshで動作するように、匿名コンポーネントを名前付きコンポーネントに変換します。
例:
変換後:
コンポーネントにはファイル名に基づいたキャメルケースの名前が付けられ、アロー関数でも動作します。
8
AMP HOCからページ設定への変換
withamp-to-config
withAmp
HOCをNext.js 9のページ設定に変換します。
例:
6
withRouter
の使用
url-to-withrouter
非推奨となったトップレベルページに自動注入されるurl
プロパティを、withRouter
とそれが注入するrouter
プロパティを使用するように変換します。詳細はこちら:https://nextjs.org/docs/messages/url-deprecated
例:
これは一例です。変換されるすべてのケース(およびテスト済み)は__testfixtures__
ディレクトリで確認できます。