add client-side preloading logic, move router into runtime module

This commit is contained in:
Rich Harris
2017-12-13 13:29:38 -05:00
parent c7e3fc4493
commit 941867f0a4
2 changed files with 43 additions and 27 deletions

25
runtime/router.js Normal file
View File

@@ -0,0 +1,25 @@
const router = {
init(callback) {
console.log('initing');
window.addEventListener('click', event => {
let a = event.target;
while (a && a.nodeName !== 'A') a = a.parentNode;
if (!a) return;
if (callback(new URL(a.href))) {
event.preventDefault();
history.pushState({}, '', a.href);
}
});
window.addEventListener('popstate', event => {
callback(window.location);
});
callback(window.location);
}
};
window.router = router;
export default router;

View File

@@ -1,22 +1,9 @@
window.addEventListener('click', event => {
let a = event.target;
while (a && a.nodeName !== 'A') a = a.parentNode;
if (!a) return;
if (navigate(new URL(a.href))) {
event.preventDefault();
history.pushState({}, '', a.href);
}
});
window.addEventListener('popstate', event => {
navigate(window.location);
});
import router from 'sapper/runtime/router.js';
const target = document.querySelector('__selector__');
let component;
function navigate(url) {
router.init(url => {
if (url.origin !== window.location.origin) return;
let match;
@@ -24,22 +11,26 @@ function navigate(url) {
const query = {};
function render(mod) {
if (component) {
component.destroy();
} else {
target.innerHTML = '';
}
const route = { query, params };
component = new mod.default({
target,
data: { query, params },
hydrate: !!component
Promise.resolve(
mod.default.preload ? mod.default.preload(route) : {}
).then(preloaded => {
if (component) {
component.destroy();
} else {
target.innerHTML = '';
}
component = new mod.default({
target,
data: Object.assign(route, preloaded),
hydrate: !!component
});
});
}
// ROUTES
return true;
}
navigate(window.location);
});