Skip to main content


Setting when actions should be performed during SPA transitions

By default, SPA transitions execute actions after defining the next route and after the actual transition. It is possible to change this behavior and make the execution of actions before a transition itself. Note, that in this case a page will be displayed immediately with new data, but it can cause a noticeable visual lag if actions are taken long enough.

Configurable explicitly when using the routing module:

import { createApp } from '@tramvai/core';
import { SpaRouterModule } from '@tramvai/module-router';

modules: [
SpaRouterModule.forRoot([], {
spaActionsMode: 'before', // default is 'after'


import { ROUTER_SPA_ACTIONS_RUN_MODE_TOKEN } from '@tramvai/module-router';
import { provide } from '@tramvai/core';

const providers = [
// ...,
useValue: 'before',

Load route config from external api

Create ROUTE_RESOLVE_TOKEN provider, where you need to fetch and return new route object (route will be registered in beforeResolve transition hook):

import { provide } from '@tramvai/core';
import { ROUTE_RESOLVE_TOKEN } from '@tramvai/module-router';

const provider = provide({
// will be executed for every navigation, when corresponding route is not defined in application
useValue: async (navigation) => {
const route = await fetchRouteFromExternalApi(navigation);

if (route) {
return route;

How to transform every route befor usage

Create ROUTE_TRANSFORM_TOKEN multi provider, where you can change route object directly:

import { provide } from '@tramvai/core';
import { ROUTE_TRANSFORM_TOKEN } from '@tramvai/module-router';

const provider = provide({
// in this example, paths for every routes will be modified
useValue: (route) => {
return {
path: `/prefix${route.path}`,

App behind proxy

Router doesn't support proxy setup directly. But proxy still can be used with some limitations:

  • setup proxy server to pass requests to app with rewriting request and response paths. (E.g. for nginx)
  • it won't work as expected on spa navigation on client, so only option in this case is use the NoSpaRouter