Merge pull request #161 from sveltejs/gh-160

add preloadRoutes function
This commit is contained in:
Rich Harris
2018-03-04 19:00:14 -05:00
committed by GitHub
4 changed files with 29 additions and 9 deletions

View File

@@ -59,9 +59,6 @@ function render(Component: ComponentConstructor, data: any, scroll: ScrollPositi
detach(start);
detach(end);
}
// preload additional routes
routes.reduce((promise: Promise<any>, route) => promise.then(route.load), Promise.resolve());
}
component = new Component({
@@ -268,3 +265,20 @@ export function goto(href: string, opts = { replaceState: false }) {
window.location.href = href;
}
}
export function preloadRoutes(pathnames: string[]) {
if (!routes) throw new Error(`You must call init() first`);
return routes
.filter(route => {
if (!pathnames) return true;
return pathnames.some(pathname => {
return route.error
? route.error === pathname
: route.pattern.test(pathname)
});
})
.reduce((promise: Promise<any>, route) => {
return promise.then(route.load);
}, Promise.resolve());
}

View File

@@ -13,8 +13,9 @@ export interface Component {
export type Route = {
pattern: RegExp;
params: (match: RegExpExecArray) => Record<string, string>;
load: () => Promise<{ default: ComponentConstructor }>;
error?: string;
params?: (match: RegExpExecArray) => Record<string, string>;
ignore?: boolean;
};

View File

@@ -1,6 +1,8 @@
import { init } from '../../../runtime.js';
import { init, preloadRoutes } from '../../../runtime.js';
import { routes } from './manifest/client.js';
window.init = () => {
return init(document.querySelector('#sapper'), routes);
};
};
window.preloadRoutes = preloadRoutes;

View File

@@ -23,6 +23,10 @@ Nightmare.action('init', function(done) {
this.evaluate_now(() => window.init(), done);
});
Nightmare.action('preloadRoutes', function(done) {
this.evaluate_now(() => window.preloadRoutes(), done);
});
function run(env) {
describe(`env=${env}`, function () {
this.timeout(30000);
@@ -155,7 +159,7 @@ function run(env) {
});
it('navigates to a new page without reloading', () => {
return capture(() => nightmare.goto(base).init().wait(400))
return capture(() => nightmare.goto(base).init().preloadRoutes())
.then(() => {
return capture(() => nightmare.click('a[href="/about"]'));
})
@@ -189,7 +193,6 @@ function run(env) {
return nightmare
.goto(`${base}/about`)
.init()
.wait(200)
.then(() => {
return capture(() => {
return nightmare
@@ -215,7 +218,7 @@ function run(env) {
it('reuses prefetch promise', () => {
return nightmare
.goto(`${base}/blog`)
.init().wait(300)
.init()
.then(() => {
return capture(() => {
return nightmare