umijs / dumi

📖 Static Site Generator for component library development
https://d.umijs.org
MIT License
3.58k stars 1.18k forks source link

api.getRoutes() 报错 #988

Open javaxiu opened 2 years ago

javaxiu commented 2 years ago

按照这个文档里的 demo 写的,结果报错了

// /path/to/plugin.ts
import { IApi } from 'dumi';

export default async (api: IApi) => {
  const rootRoute = await api.applyPlugins({
    key: 'dumi.getRootRoute',
    type: api.ApplyPluginsType.modify,
    initialValue: await api.getRoutes(),
  });
};

Browserslist: caniuse-lite is outdated. Please run: npx browserslist@latest --update-db

Why you should do it regularly: https://github.com/browserslist/browserslist#browsers-data-updating Cannot read properties of null (reading 'routes') TypeError: Cannot read properties of null (reading 'routes') at /Users/u/workspace/wec/node_modules/@umijs/core/lib/Route/Route.js:88:53 at Generator.next () at asyncGeneratorStep (/Users/u/workspace/wec

Originally posted by @javaxiu in https://github.com/umijs/dumi/issues/842#issuecomment-999236650

最小复现 Demo

https://github.com/javaxiu/dumidoc

PeachScript commented 2 years ago

文档有误,插件函数体顶层代码执行时 Umi 的 Service 还未初始化好,可以将逻辑按需移入到某个 Umi 的插件的钩子里,例如构建完成时 onBuildCompletehttps://umijs.org/plugins/api#onbuildcomplete-err-stats-

javaxiu commented 2 years ago

确实在 onDevBuildComplete 里可以正确获取到。 我想实现的效果是根据文件目录约定来自动填写路由,免去在每个 markdown 头部写 path title 的麻烦。

尝试了如下方法修改,

  api.onDevCompileDone(async () => {
    const routes = await api.getRoutes();
    routes.find(v => v.path === '/').routes.push({
      ....try to add some new
    })
    const final = await api.applyPlugins({
      key: 'dumi.getRootRoute',
      type: api.ApplyPluginsType.modify,
      initialValue: routes,
    });
    console.log('#####', routes)
    console.log('@@@@', final);
  })

但是试了一下,onDevBuildComplete 的时候改来不及了,其他 umi 事件好像也都是不合适的时机,请问有什么合适的时机可以改路由吗