v2へのアップグレード
このドキュメントは、Classic Remix コンパイラ を使用している場合の v1 から v2 への移行に関するガイダンスを提供しています。Vite への移行に関する追加のガイダンスについては、Remix Vite ドキュメント を参照してください。
すべての v2 API と動作は、将来のフラグ を使用して v1 で利用できます。プロジェクトの開発を中断しないように、一度に1つずつ有効にすることができます。すべてのフラグを有効にしたら、v2へのアップグレードは破壊的なアップグレードにならないはずです。
問題が発生した場合は、トラブルシューティング セクションを参照してください。
一般的なアップグレードの問題の簡単な概要については、🎥 2 分で v2 へ をご覧ください。
classic-remix-compiler: (Classic Remix コンパイラのリンクをここに挿入)
remix-vite: (Remix Vite ドキュメントのリンクをここに挿入)
future-flags: (将来のフラグに関するセクションへのリンクをここに挿入)
troubleshooting: (トラブルシューティングセクションへのリンクをここに挿入)
2-min-to-v2: (2 分で v2 へ動画へのリンクをここに挿入)
remix dev
設定オプションについては、remix dev
ドキュメントを参照してください。
dev-docs: (This needs a URL to be added here. The original markdown left this as a placeholder.)
remix-serve
Remixアプリサーバー(remix-serve
)を使用している場合は、v2_dev
を有効化してください。
以上です!
カスタムアプリサーバー
独自のアプリサーバー(server.js
)を使用している場合は、v2_dev
との統合方法の例については、テンプレートをご覧ください。または、次の手順に従ってください。
-
v2_dev
を有効にする:
-
package.json
のscripts
を更新する:
remix watch
をremix dev
に置き換える
- 冗長な
NODE_ENV=development
を削除する
- アプリサーバーを実行するために
-c
/ --command
を使用する
例:
-
アプリが実行されたら、Remixコンパイラに「ready」メッセージを送信する
-
(オプション)--manual
require
キャッシュのクリアに依存していた場合は、--manual
フラグを使用して引き続き実行できます。
詳細は、マニュアルモードガイドをご覧ください。
v1からv2へのアップグレード後
v1でfuture.v2_dev
フラグを有効にして動作確認が済んだら、v2にアップグレードできます。
v2_dev
をtrue
に設定していただけなら、それを削除すれば動作するはずです。
v2_dev
設定を使用している場合は、dev
設定フィールドに移動する必要があります。
ファイルシステムルート規約
ファイルを変更せずにアップグレードする
すぐに変更したくない場合(または、まったく変更したくない場合でも構いません。これは単なる慣例であり、任意のファイル構成を使用できます)、@remix-run/v1-route-convention
を使用した古い規則を引き続きv2にアップグレードした後も使用できます。
新規規約へのアップグレード
- ルートのネストは、フォルダのネストではなく、ファイル名内のドット(
.
)で作成されるようになりました。
- セグメント内の
suffixed_
アンダーバーは、ドット(.
)ではなく、潜在的に一致する親ルートとのネストをオプトアウトします。
- セグメント内の
_prefixed
アンダーバーは、__double
アンダーバープレフィックスではなく、パスを持たないレイアウトルートを作成します。
_index.tsx
ファイルは、index.tsx
ではなくインデックスルートを作成します。
v1 のようなルートフォルダ:
v2_routeConvention
を使用すると、次のようになります。
親ルートは、(認証ルートのように)それらの間に数十ものルートがあるのではなく、一緒にグループ化されるようになりました。パスは同じだがネストが異なるルート(dashboard
と dashboard_
など)も一緒にグループ化されます。
新しい規約では、任意のルートを内部に route.tsx
ファイルを持つディレクトリにすることができ、ルートモジュールの定義が可能になります。これにより、使用するルートとモジュールの共存が可能になります。
たとえば、_public.tsx
を _public/route.tsx
に移動し、ルートが使用するモジュールを共存させることができます。
この変更の詳細については、元の「フラットルート」提案 を参照してください。
Remix v2では、ルートのheaders
関数の動作がわずかに変更されました。remix.config.js
のfuture.v2_headers
フラグを使用して、この新しい動作を事前にオプトインできます。
v1では、Remixはリーフ(末端)の「レンダリング済み」ルートのheaders
関数の結果のみを使用していました。すべての潜在的なリーフにheaders
関数を追加し、それに応じてparentHeaders
をマージするのは開発者の責任でした。これはすぐに面倒になり、新しいルートを追加したときに、親からの同じヘッダーを共有したい場合でも、headers
関数の追加を忘れることが容易に起こりえます。
v2では、Remixはレンダリングされたルートの中で最も深いheaders
関数を用いるようになりました。これにより、共通の祖先からルート間でヘッダーをより簡単に共有できます。必要に応じて、特定の動作が必要なより深いルートにheaders
関数を追加できます。
Remix v2では、ルートmeta
関数のシグネチャとRemixが内部的にメタタグを処理する方法が変更されました。
meta
からオブジェクトを返す代わりに、記述子の配列を返すようになり、マージを自分で管理するようになりました。これによりmeta
APIはlinks
に近づき、メタタグのレンダリング方法に関する柔軟性と制御性が向上します。
さらに、<Meta />
は階層内のすべてのルートのメタをレンダリングしなくなりました。リーフルートのmeta
から返されたデータのみがレンダリングされます。関数引数のmatches
にアクセスすることで、親ルートのメタを含めることもできます。
この変更に関する詳細については、元のv2 meta
提案を参照してください。
meta-v2-matches: (link_to_matches_documentation)
meta-v2-rfc: (link_to_rfc)
v1 の規約を引き続き使用するには、@remix-run/v1-meta
パッケージを使用して meta
エクスポートを更新できます。
metaV1
関数を使用すると、meta
関数の引数と、現在返しているオブジェクトと同じオブジェクトを渡すことができます。この関数は、同じマージロジックを使用してリーフルートのメタをその直接の親ルートのメタとマージしてから、v2 で使用できるメタ記述子の配列に変換します。
この関数は、デフォルトでは階層全体でメタをマージしません。これは、metaV1
関数を使用せずにオブジェクトの配列を直接返すルートがある場合があり、予期しない動作につながる可能性があるためです。階層全体でメタをマージする場合は、すべてのルートの meta
エクスポートに metaV1
関数を使用してください。
parentsData
引数
v2 では、meta
関数は parentsData
引数を受け取りません。これは、meta
が matches
引数 を介してすべてのルートマッチにアクセスできるようになったためです。これには、各マッチのローダーデータが含まれています。
parentsData
のAPIを複製するために、@remix-run/v1-meta
パッケージは getMatchesData
関数を提供します。これは、各マッチのデータがルートのIDでキー付けされたオブジェクトを返します。
以下のようになります。
matches
引数
v1 では、ネストされたルートから返されるオブジェクトはすべてマージされていましたが、v2ではmatches
を使用して自分でマージする必要があります。
meta のドキュメントには、ルートメタのマージに関するさらに詳しいヒントがあります。
CatchBoundary
とErrorBoundary
v1では、スローされたResponse
は最も近いCatchBoundary
をレンダリングし、その他の未処理の例外はすべてErrorBoundary
をレンダリングしました。v2ではCatchBoundary
がなくなり、すべての未処理の例外はErrorBoundary
をレンダリングします。レスポンスに関わらず同様です。
さらに、エラーはErrorBoundary
にプロパティとして渡されなくなり、useRouteError
フックを使用してアクセスするようになりました。
以下のようになります。
複数のAPIがサブミッションのformMethod
を返します。v1ではメソッドの小文字バージョンを返しましたが、v2では大文字バージョンを返すようになりました。これはHTTPとfetch
の仕様に合わせるためです。
useTransition
このフックは、同じ名前の最近のReactフックと混同を避けるため、useNavigation
に名前が変更されました。また、type
フィールドが削除され、submission
オブジェクトはnavigation
オブジェクト自体にフラット化されました。
以前のtransition.type
は、以下の例のように導き出すことができます。ただし、通常はnavigation.state
、navigation.formData
、またはuseActionData
でアクションから返されたデータをチェックすることで、同じ動作を実現するより簡単な方法があることに注意してください。Discordで質問していただければ、喜んでお手伝いさせていただきます :D
GET サブミッションに関する注意
Remix v1では、<Form method="get">
やsubmit({}, { method: 'get' })
などのGETサブミッションは、transition.state
でidle -> submitting -> idle
という状態遷移をしていました。フォームを「送信」しているにもかかわらず、GETナビゲーションを実行し、ローダー(アクションではない)のみを実行しているため、これはセマンティックに正しくありません。機能的には、<Link>
やnavigate()
と変わりませんが、ユーザーが入力値を介して検索パラメータ値を指定している可能性があります。
v2では、GETサブミッションはロード中のナビゲーションとしてより正確に反映され、navigation.state
を通常のリンクの動作と合わせるためにidle -> loading -> idle
という状態遷移をします。GETサブミッションが<Form>
またはsubmit()
から来た場合、useNavigation.form*
が設定されるため、必要に応じて区別できます。
useFetcher
useNavigation
と同様に、useFetcher
はsubmission
をフラット化し、type
フィールドを削除しました。
以前のfetcher.type
は、以下の例のように導き出すことができます。ただし、通常はfetcher.state
、fetcher.formData
、またはfetcher.data
でアクションから返されたデータをチェックすることで同じ動作を実現できる、より簡単な方法がある可能性が高いことに注意してください。Discordで質問していただければ、喜んでお手伝いさせていただきます :D
GET送信に関する注意
Remix v1では、<fetcher.Form method="get">
やfetcher.submit({}, { method: 'get' })
などのGET送信は、fetcher.state
でidle -> submitting -> idle
となっていました。フォームを「送信」しているにもかかわらず、GETリクエストを実行し、ローダー(アクションではない)のみを実行しているため、これはセマンティックに完全に正確ではありません。機能的にはfetcher.load()
と変わりませんが、ユーザーが入力値を介して検索パラメータ値を指定している可能性があります。
v2では、GET送信はロードリクエストとしてより正確に反映されるため、fetcher.state
を通常のfetcherロードの動作と合わせるためにidle -> loading -> idle
となります。GET送信が<fetcher.Form>
またはfetcher.submit()
からのものである場合、fetcher.form*
が設定されるため、必要に応じて区別できます。
リンク imagesizes
と imagesrcset
ルートの links
プロパティは、HTMLの小文字値ではなく、すべてReactのキャメルケース値にする必要があります。これらの2つの値はv1で小文字として紛れ込んでいました。v2では、キャメルケースのバージョンのみが有効です。
browserBuildDirectory
remix.config.js
ファイルにおいて、browserBuildDirectory
をassetsBuildDirectory
に名前変更してください。
devServerBroadcastDelay
remix.config.js
から devServerBroadcastDelay
を削除してください。このオプションが必要だった競合状態は、v2 または v2_dev
で解消されました。
devServerPort
remix.config.js
ファイルにおいて、devServerPort
をfuture.v2_dev.port
に名前を変更してください。
v1からv2にアップグレードすると、これはルートレベルのdev
設定にフラット化されます。
dev-after-upgrading: (This needs a URL or further context to translate accurately. Please provide the link target.)
serverBuildDirectory
remix.config.js
ファイルにおいて、serverBuildDirectory
をserverBuildPath
に名前変更し、ディレクトリではなく、モジュールパスを指定してください。
Remixは以前、サーバー用に複数のモジュールを作成していましたが、現在は単一ファイルを作成するようになりました。
serverBuildTarget
ビルドターゲットを指定する代わりに、remix.config.js
オプションを使用して、サーバーターゲットが期待するサーバービルドを生成します。この変更により、Remixソースコードがそれらを知る必要なく、Remixをより多くのJavaScriptランタイム、サーバー、およびホストにデプロイできるようになります。
現在のserverBuildTarget
を置き換えるべき設定は以下のとおりです。
arc
cloudflare-pages
cloudflare-workers
deno
node-cjs
デフォルトのサーバーモジュール出力形式が cjs
から esm
に変更されました。v2 でも引き続き CJS を使用できますが、アプリケーション内の多くの依存関係が ESM と互換性がない可能性があります。
remix.config.js
では、既存の動作を維持するには serverModuleFormat: "cjs"
を、新しい動作を選択するには serverModuleFormat: "esm"
を指定する必要があります。
browserNodeBuiltinsPolyfill
Node.js組み込みモジュールのポリフィルは、デフォルトではブラウザで提供されなくなりました。Remix v2では、必要に応じてポリフィル(または空のポリフィル)を明示的に再導入する必要があります。
一部のポリフィルは非常に大きくなる可能性があるため、ブラウザバンドルで許可されるポリフィルを明示的に指定することをお勧めしますが、次の設定を使用すると、Remix v1からの完全なポリフィルセットを簡単に復元できます。
serverNodeBuiltinsPolyfill
Node.js組み込みモジュールのポリフィルは、Node.js以外のサーバープラットフォームではデフォルトで提供されなくなりました。
Node.js以外のサーバープラットフォームをターゲットにしており、v1の新しいデフォルト動作を採用したい場合は、remix.config.js
でserverNodeBuiltinsPolyfill.modules
に空のオブジェクトを明示的に指定して、すべてのサーバーポリフィルを削除する必要があります。
その後、必要に応じてポリフィル(または空のポリフィル)を再導入できます。
参考として、v1からのデフォルトポリフィルの完全なセットを手動で指定する方法は次のとおりです。
installGlobals
Node組み込みのfetch実装を使用するための準備として、fetchグローバルのインストールは現在アプリサーバーの責任となっています。remix-serve
を使用している場合は、何もする必要はありません。独自のアプリサーバーを使用している場合は、自分でグローバルをインストールする必要があります。
エクスポートされたポリフィルの削除
Remix v2では、@remix-run/node
からこれらのポリフィル実装をエクスポートしなくなりました。代わりに、グローバル名前空間にあるインスタンスを使用する必要があります。変更が必要になる可能性が高い場所の1つは、app/entry.server.tsx
ファイルです。ここでは、NodeのPassThrough
をWebのReadableStream
にcreateReadableStreamFromReadable
を使用して変換する必要もあります。
source-map-support
ソースマップのサポートは、現在アプリサーバーの責任です。remix-serve
を使用している場合は、何も必要ありません。独自のアプリサーバーを使用している場合は、source-map-support
を自分でインストールする必要があります。
Netlify アダプター
@remix-run/netlify
ランタイムアダプターは、@netlify/remix-adapter
と @netlify/remix-edge-adapter
に置き換えられたため、Remix v2 から削除されました。@remix-run/netlify
のすべてのインポートを @netlify/remix-adapter
に変更してコードを更新してください。
@netlify/remix-adapter
は @netlify/functions@^1.0.0
を必要とすることに注意してください。これは、@remix-run/netlify
で現在サポートされている @netlify/functions
のバージョンと比較して破壊的変更です。
このアダプターの削除に伴い、Netlify テンプレート も削除され、公式Netlifyテンプレート に置き換えられました。
Vercel アダプター
@remix-run/vercel
ランタイムアダプターは、Vercel の標準機能に置き換えられたため、Remix v2 より廃止され、削除されました。package.json
から @remix-run/vercel
と @vercel/node
を削除し、server.js
/server.ts
ファイルを削除し、remix.config.js
から server
と serverBuildPath
オプションを削除することで、コードを更新してください。
このアダプターの削除に伴い、Vercel テンプレート も削除され、公式 Vercel テンプレート に置き換えられました。
vercel-template: // vercel-templateへのリンクをここに挿入
official-vercel-template: // official-vercel-templateへのリンクをここに挿入
組み込みPostCSS/Tailwindサポート
v2では、プロジェクト内にPostCSSと/またはTailwindの設定ファイルが存在する場合、これらのツールはRemixコンパイラ内で自動的に使用されます。
v2への移行時に、Remix以外でカスタムPostCSSと/またはTailwindの設定を維持したい場合は、remix.config.js
でこれらの機能を無効にできます。
トラブルシューティング
ESM/CommonJS エラー
serverModuleFormat
セクションを参照してください。