code: function createRouterDispatcher({
      runtimeRouters,
      reqQuery,
      reqMethod,
      reqPath,
      viewRoot,
      extension,
      syncDataMatch,
      asyncDataMatch
  }) {
      if (Number(reqQuery.mode) === 1) {
          return;
      }
  
      let dispatcher;
      const routers = values(runtimeRouters).reduce(
          (prev, item) => prev.concat(item),
          []
      );
      routers.some(function(router) {
          const { filePath, method, sync, url, handler } = router;
  
          const METHODS = ['GET', 'POST', 'PUT', 'DELETE'];
          const upperMethod = method && method.toUpperCase() || '';
          const notMatchMethod = upperMethod && METHODS.includes(upperMethod) && upperMethod !== reqMethod;
  
          if (!reqPath.match(pathToRegexp(url)) || notMatchMethod) {
              return false;
          }
  
          dispatcher = {
              router,
              filePath,
              handler
          };
  
          if (sync) {
              const tplName = removeSuffix(filePath, extension);
              return Object.assign(dispatcher, {
                  type: 'sync',
                  pagePath: path.join(viewRoot, `${tplName}.${extension}`),
                  dataPath: syncDataMatch(ensureJSONExtension(tplName))
              });
          }
  
          return Object.assign(dispatcher, {
              type: 'async',
              dataPath: asyncDataMatch(ensureJSONExtension(filePath))
          });
      });
  
      return dispatcher;
  }
docs: 获得路由的 dispatcher 对象