运行时配置

运行时配置和配置的区别是他跑在浏览器端,基于此,我们可以在这里写函数、jsx、import 浏览器端依赖等等,注意不要引入 node 依赖。

配置方式

约定 src/app.tsx 为运行时配置。

配置项

patchRoutes({ routes })

修改路由。

比如在最前面添加一个 /foo 路由,

  1. export function patchRoutes({ routes }) {
  2. routes.unshift({
  3. path: '/foo',
  4. exact: true,
  5. component: require('@/extraRoutes/foo').default,
  6. });
  7. }

比如和 render 配置配合使用,请求服务端根据响应动态更新路由,

  1. let extraRoutes;
  2. export function patchRoutes({ routes }) {
  3. merge(routes, extraRoutes);
  4. }
  5. export function render() {
  6. fetch('/api/routes').then((res) => { extraRoutes = res.routes })
  7. }

注意:

  • 直接 routes,不需要返回

render(oldRender: Function)

覆写 render。

比如用于渲染之前做权限校验,

  1. import { history } from 'umi';
  2. export function render(oldRender) {
  3. fetch('/api/auth').then(auth => {
  4. if (auth.isLogin) { oldRender() }
  5. else { history.redirectTo('/login'); }
  6. });
  7. }

onRouteChange({ routes, matchedRoutes, location, action })

在初始加载和路由切换时做一些事情。

比如用于做埋点统计,

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

比如用于设置标题,

  1. export function onRouteChange({ matchedRoutes }) {
  2. if (matchedRoutes.length) {
  3. document.title = matchedRoutes[matchedRoutes.length - 1].route.title || '';
  4. }
  5. }

rootContainer(LastRootContainer)

修改交给 react-dom 渲染时的根组件。

比如用于在外面包一个 Provider,

  1. export function rootContainer(container) {
  2. return React.createElement(ThemeProvider, null, container);
  3. }

更多配置项

Umi 允许插件注册运行时配置,如果你使用插件,肯定会插件里找到更多运行时的配置项。