はい、これを達成できます。可能な解決策の1つを示します。
backgroundLoader
まず、必要なチャンクをキューに入れるために作成しましょう。
const queue = [];
const delay = 1000;
let isWaiting = false;
function requestLoad() {
if (isWaiting) {
return;
}
if (!queue.length) {
return;
}
const loader = queue.pop();
isWaiting = true;
loader(() => {
setTimeout(() => {
isWaiting = false;
requestLoad();
}, delay)
});
}
export default (loader) => {
queue.push(loader);
requestLoad();
}
この関数は、1 秒の遅延でバックグラウンドでチャンクを読み込みます (微調整できます。たとえば、5 秒後にキューのポップを開始したり、チャンクの配列をシャッフルしたりします)。
require.ensure
次に、キューイング関数を登録する必要がありますbackgroundLoader
。
import render from './render'; // not relevant in this example
import backgroundLoader from './backgroundLoader';
let lightTheme = (cb) => {
require.ensure([], () => {
cb(require('./themeA.css'));
}, 'light');
}
let darkTheme = (cb) => {
require.ensure([], () => {
cb(require('./themeB.css'));
}, 'dark');
}
let pinkTheme = (cb) => {
require.ensure([], () => {
cb(require('./themeC.css'));
}, 'pink');
}
backgroundLoader(lightTheme);
backgroundLoader(darkTheme);
backgroundLoader(pinkTheme);
export default (themeName) => { // router simulation
switch(themeName) {
case 'light':
lightTheme(render);
break;
case 'dark':
darkTheme(render);
break;
case 'pink':
pinkTheme(render);
break;
}
};
switch
ステートメントでチャンクが必要になったら、render
解決関数を含む関数を渡します。このbackgroundLoader
関数では空になり、アプリのチャンクをロードするだけになりhead
ます。
この例の完全なコードは、WebpackBinで確認できます (ネットワークをチェックして、チャンクがバックグラウンドでどのようにロードされているかを確認できます)。