Fetch APIの `priority` オプションをリクエストに渡せるように
FetchRequest クラスに priority オプションのサポートが追加され、ブラウザのFetch APIに対してリクエストの相対的な優先度をヒントとして渡せるようになりました。
背景
ブラウザのFetch APIは priority オプションをサポートしており、同種のリクエスト間での相対的な重要度を "high" / "low" / "auto" で指定できます。しかし、これまで @rails/request.js はこのオプションを内部的に無視していたため、フォールド上のクリティカルなデータ取得とアナリティクスのバックグラウンド送信を同列に扱わざるを得ませんでした。本PRはこの制約を解消しています。
技術的な変更
src/fetch_request.js の fetchOptions ゲッターと新規 priority ゲッターの2箇所に変更が加えられ、オプションがFetch APIにそのまま透過するようになりました。
変更前:
get fetchOptions () {
return {
signal: this.signal,
credentials: this.credentials,
redirect: this.redirect,
keepalive: this.keepalive
}
}
変更後:
get fetchOptions () {
return {
signal: this.signal,
credentials: this.credentials,
redirect: this.redirect,
keepalive: this.keepalive,
priority: this.priority
}
}
get priority () {
return this.options.priority
}
priority ゲッターは this.options.priority をそのまま返すだけであり、未指定時は undefined になります。keepalive が未指定時に false をデフォルト値として返すのとは異なり、priority はデフォルト値を設定しない設計です。これにより、priority を指定しない既存のコードでは fetchOptions に priority: undefined が含まれますが、Fetch APIは undefined の値を無視するため動作への影響はありません。
テストは __tests__/fetch_request.js に追加されており、未指定時が undefined であること、および "high" / "low" / "auto" の各値が正しく fetchOptions.priority に反映されることを検証しています。
設計判断
デフォルト値を持たせずに undefined を透過させる方式 が採用されました。
keepalive は false、credentials は 'same-origin'、redirect は 'follow' といったように、他のオプションはデフォルト値を明示的に設定しています。一方 priority は、ブラウザが指定なしの場合に独自のデフォルト動作("auto" 相当)を行う点を考慮し、ライブラリ側で値を上書きしない選択が取られています。"auto" を明示的にデフォルト設定した場合とFetch APIの挙動が同一であるとは限らないため、透過させることでブラウザの実装に委ねる判断といえます。
利用側は以下のようにオプションを渡すだけで有効になります:
import { get, post } from '@rails/request.js'
// フォールド上のクリティカルなデータ取得
const response = await get('/api/critical-data', { priority: 'high', responseKind: 'json' })
// アナリティクスなどのバックグラウンド送信
await post('/api/analytics', { body: payload, priority: 'low' })
まとめ
priority ゲッターの追加と fetchOptions への1行追記という最小限の変更で、Fetch APIが持つリソースヒントの機能をそのままライブラリのユーザーに開放しています。既存コードへの影響はなく、必要なリクエストにのみ優先度指定を後付けできます。