# Runtime Config

# Why runtime configuration?

We do compile-time configuration via .umirc.js. These does cover most of the scenarios, but some are hard to achieve at compile time.

Such as:

  • Display message prompts to the user if error occurs.
  • Show loading states when loading and navigating between routes.
  • Fire request to backend when page is loaded, then modify the routes based on response.

These are difficult or even impossible to handle at compile time.

# Configuration

umi convention is that src/app.js is the configuration file.

+ src
  - app.js      # runtime configuration file
- package.json

# Available Configurations

# patchRoutes

Used to modify routes at runtime.

Parameters:

  • routes: Array,routing configuration

e.g. Add route to /foo

export function patchRoutes(routes) {
  routes[0].unshift({
    path: '/foo',
    component: require('./routes/foo').default,
  });
}

Usecases:

  • Used with render to request data from the server and dynamically update the route based on the response.
  • Modify all routes, by adding a prefix.
  • ...

Note:

  1. The same applies to agreed routing. (NOTE not really sure what that means)
  2. Mutate routes directly,do note return new route objects

# render

Used to override the rendering of entire app to the DOM.

Parameters:

  • oldRender, Function,the initial render function,needs to be called at lease once.

e.g. Delay rendering of the app by 1s,

export function render(oldRender) {
  setTimeout(oldRender, 1000);
}

Usecases:

  1. Check permissions before rendering the app. Show login if not authorized.

# onRouteChange

Used on initial load and route changes.

Parameters:

  • Object
    • location:Object, provided by history
    • routes: Array, routing configuration
    • action: PUSH|POP|REPLACE|undefinedundefined on first load.

e.g.

export function onRouteChange({ location, routes, action }) {
  bacon(location.pathname);
}

Usecases:

  1. Navigation analytics.

Note:

  1. Also runs on the first load,but action is undefined

# rootContainer

Used to wrap the root container,you can take a part, or a layer outside and so on.

Parameters:

  • container,ReactComponent,React application root component

e.g.

export function rootContainer(container) {
  const DvaContainer = require('@tmp/DvaContainer').default;
  return React.createElement(DvaContainer, null, container);
}

Usecases:

  1. dva、intl, etc. need to have Provider in the outer layer.

# modifyRouteProps

Modify the props passed to the routing component

Parameters:

  • props,Object,original props

  • Object

    • route,Object,current routing configuration

e.g.

export function modifyRouteProps(props, { route }) {
  return { ...props, foo: 'bar' };
}

Note:

  1. Has to return new props