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 => { import router from 'sapper/runtime/router.js';
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);
});
const target = document.querySelector('__selector__'); const target = document.querySelector('__selector__');
let component; let component;
function navigate(url) { router.init(url => {
if (url.origin !== window.location.origin) return; if (url.origin !== window.location.origin) return;
let match; let match;
@@ -24,6 +11,11 @@ function navigate(url) {
const query = {}; const query = {};
function render(mod) { function render(mod) {
const route = { query, params };
Promise.resolve(
mod.default.preload ? mod.default.preload(route) : {}
).then(preloaded => {
if (component) { if (component) {
component.destroy(); component.destroy();
} else { } else {
@@ -32,14 +24,13 @@ function navigate(url) {
component = new mod.default({ component = new mod.default({
target, target,
data: { query, params }, data: Object.assign(route, preloaded),
hydrate: !!component hydrate: !!component
}); });
});
} }
// ROUTES // ROUTES
return true; return true;
} });
navigate(window.location);