draft: refactor project so it sits on top of a standalone app
This commit is contained in:
+157
@@ -0,0 +1,157 @@
|
||||
/**
|
||||
* Based heavily on https://github.com/webpack/webpack/blob/
|
||||
* c0afdf9c6abc1dd70707c594e473802a566f7b6e/hot/only-dev-server.js
|
||||
* Original copyright Tobias Koppers @sokra (MIT license)
|
||||
*/
|
||||
|
||||
/* global window __webpack_hash__ */
|
||||
|
||||
if (!module.hot) {
|
||||
throw new Error('[HMR] Hot Module Replacement is disabled.');
|
||||
}
|
||||
|
||||
var hmrDocsUrl = 'https://webpack.js.org/concepts/hot-module-replacement/'; // eslint-disable-line max-len
|
||||
|
||||
var lastHash;
|
||||
var failureStatuses = { abort: 1, fail: 1 };
|
||||
var applyOptions = {
|
||||
ignoreUnaccepted: true,
|
||||
ignoreDeclined: true,
|
||||
ignoreErrored: true,
|
||||
onUnaccepted: function(data) {
|
||||
console.warn(
|
||||
'Ignored an update to unaccepted module ' + data.chain.join(' -> ')
|
||||
);
|
||||
},
|
||||
onDeclined: function(data) {
|
||||
console.warn(
|
||||
'Ignored an update to declined module ' + data.chain.join(' -> ')
|
||||
);
|
||||
},
|
||||
onErrored: function(data) {
|
||||
console.error(data.error);
|
||||
console.warn(
|
||||
'Ignored an error while updating module ' +
|
||||
data.moduleId +
|
||||
' (' +
|
||||
data.type +
|
||||
')'
|
||||
);
|
||||
},
|
||||
};
|
||||
|
||||
function upToDate(hash) {
|
||||
if (hash) lastHash = hash;
|
||||
return lastHash == __webpack_hash__;
|
||||
}
|
||||
|
||||
module.exports = function(hash, moduleMap, options) {
|
||||
var reload = options.reload;
|
||||
if (!upToDate(hash) && module.hot.status() == 'idle') {
|
||||
if (options.log) console.log('[HMR] Checking for updates on the server...');
|
||||
check();
|
||||
}
|
||||
|
||||
function check() {
|
||||
var cb = function(err, updatedModules) {
|
||||
if (err) return handleError(err);
|
||||
|
||||
if (!updatedModules) {
|
||||
if (options.warn) {
|
||||
console.warn('[HMR] Cannot find update (Full reload needed)');
|
||||
console.warn('[HMR] (Probably because of restarting the server)');
|
||||
}
|
||||
performReload();
|
||||
return null;
|
||||
}
|
||||
|
||||
var applyCallback = function(applyErr, renewedModules) {
|
||||
if (applyErr) return handleError(applyErr);
|
||||
|
||||
if (!upToDate()) check();
|
||||
|
||||
logUpdates(updatedModules, renewedModules);
|
||||
};
|
||||
|
||||
var applyResult = module.hot.apply(applyOptions, applyCallback);
|
||||
// webpack 2 promise
|
||||
if (applyResult && applyResult.then) {
|
||||
// HotModuleReplacement.runtime.js refers to the result as `outdatedModules`
|
||||
applyResult.then(function(outdatedModules) {
|
||||
applyCallback(null, outdatedModules);
|
||||
});
|
||||
applyResult.catch(applyCallback);
|
||||
}
|
||||
};
|
||||
|
||||
var result = module.hot.check(false, cb);
|
||||
// webpack 2 promise
|
||||
if (result && result.then) {
|
||||
result.then(function(updatedModules) {
|
||||
cb(null, updatedModules);
|
||||
});
|
||||
result.catch(cb);
|
||||
}
|
||||
}
|
||||
|
||||
function logUpdates(updatedModules, renewedModules) {
|
||||
var unacceptedModules = updatedModules.filter(function(moduleId) {
|
||||
return renewedModules && renewedModules.indexOf(moduleId) < 0;
|
||||
});
|
||||
|
||||
if (unacceptedModules.length > 0) {
|
||||
if (options.warn) {
|
||||
console.warn(
|
||||
"[HMR] The following modules couldn't be hot updated: " +
|
||||
'(Full reload needed)\n' +
|
||||
'This is usually because the modules which have changed ' +
|
||||
'(and their parents) do not know how to hot reload themselves. ' +
|
||||
'See ' +
|
||||
hmrDocsUrl +
|
||||
' for more details.'
|
||||
);
|
||||
unacceptedModules.forEach(function(moduleId) {
|
||||
console.warn('[HMR] - ' + (moduleMap[moduleId] || moduleId));
|
||||
});
|
||||
}
|
||||
performReload();
|
||||
return;
|
||||
}
|
||||
|
||||
if (options.log) {
|
||||
if (!renewedModules || renewedModules.length === 0) {
|
||||
console.log('[HMR] Nothing hot updated.');
|
||||
} else {
|
||||
console.log('[HMR] Updated modules:');
|
||||
renewedModules.forEach(function(moduleId) {
|
||||
console.log('[HMR] - ' + (moduleMap[moduleId] || moduleId));
|
||||
});
|
||||
}
|
||||
|
||||
if (upToDate()) {
|
||||
console.log('[HMR] App is up to date.');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function handleError(err) {
|
||||
if (module.hot.status() in failureStatuses) {
|
||||
if (options.warn) {
|
||||
console.warn('[HMR] Cannot check for update (Full reload needed)');
|
||||
console.warn('[HMR] ' + (err.stack || err.message));
|
||||
}
|
||||
performReload();
|
||||
return;
|
||||
}
|
||||
if (options.warn) {
|
||||
console.warn('[HMR] Update check failed: ' + (err.stack || err.message));
|
||||
}
|
||||
}
|
||||
|
||||
function performReload() {
|
||||
if (reload) {
|
||||
if (options.warn) console.warn('[HMR] Reloading page');
|
||||
window.location.reload();
|
||||
}
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user