2016-12-18 12 views
0

私はアプリケーションの異なるページ間でダイナミックルーティングを使用する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)}/> 

答えて

1

が、私は#の変形のために行くだろうし2ここで、サーバー上にルートファイルが存在しなくなったことを検出すると、window.location.reload(true)を使用してユーザーをリフレッシュします。それは新しいファイルをロードするハードリフレッシュを行う必要があります。

関連する問題