私はアプリケーションの異なるページ間でダイナミックルーティングを使用するreact/react-router/webpackスタックを使用しています。デマンド。すべてがうまくいきますが、新しいバージョンを配備すると、Jsファイルのすべてをすべて取っていない現在のアクティブなユーザーは、まだ訪問していない別のページに移動しようとすると立ち往生します。 Webpack +リアクタのダイナミックルーティング - require.ensureでロードの例外をキャッチする方法
main.123.js
profile.456.js
ユーザーの訪問私のメインページ:
例
は次の.jsファイルとMD5(キャッシュの破裂)が発生したと私は、コード分割アプリを持って言うことができますmain.123.js
のみを取得します。私は別のMD5で新しいバージョンを配備する一方
が
main.789.js
profile.891.js
ユーザーはプロフィールページに移動しようとすると(私はprofile.jsとmain.jsの両方の変更を行った)、アプリprofile.456.js
を取得しようとしますが、profile.jsファイルがスワップされているためエラーが発生し、新しいファイル名を知る方法がアプリケーションにあります。
私は2つのソリューションを思い付いたが、それらのどれも実際には問題
SOLUTION 1を解決していませんか? 常に2つのバージョンを運用してください。 2つのバージョンでは十分ではないため、滑りやすい斜面です。ユーザーはタブを数日間放置しておくことができます。そのため、アプリを再び使用することを決定するまで、複数の展開が行われます。
解決策2? jsの読み込み例外をキャッチし、ユーザーにアプリをリロードするメッセージを表示します。この解決策はうまくいくかもしれませんが、あなたが私に尋ねるなら、それは厄介なUXです。
誰もこのような問題を経験しましたか?助言がありますか?
EDIT - 解決策: 私は第2のアプローチ(解決策2)に進むことに決めました。ロードエラーをキャッチするために、webpackをwebpack 2にアップグレードしなければなりませんでした。require.ensureの実装はキャッチするファイルの例外をサポートしていないためです。 webpack 2では、エラー処理をサポートするSystem.import
を使用できます。だから、基本的に私がやったことです:
動的ロードSystem.import
を使用して、私のコンポーネント:
function getMyComponent(nextState, cb, path) {
return System.import('components/myComponent').then(module => {
cb(null, module);
});
}
とエラーキャッチ:
function getAsyncComponent(getComponent) {
return function (nextState, cb, path) {
getComponent(nextState, cb, path, store).catch(err => {
store.dispatch(notificationSend({message: <span>Uh oh.. Something went wrong.}));
cb(err);
});
}
}
<Route path="foo" getComponent={getAsyncComponent(getMyComponent)}/>