logologo
Get Started
Tutorials
Guide
Development
Plugins
API
Home
English
简体中文
日本語
한국어
Español
Português
Deutsch
Français
Русский
Get Started
Tutorials
Guide
Development
Plugins
API
Home
logologo

Quick Start

Plugin Development Overview
Write Your First Plugin
Project Structure

Server Development

Overview
Plugin
Collections
Database
DataSourceManager
ResourceManager
ACL
Middleware
Cache
Event
Context
Migration
Logger
Telemetry
I18n
Command
CronJobManager
Test

Client Development

Overview
Plugin
Context
Router
ACL
DataSourceManager
Resource
Request
Styles & Themes
Logger
I18n
Test

Others

Plugin Upgrade Guide
Languages
Dependency Management
Build
Previous PageContext
Next PageACL

#Router

NocoBase client provides a flexible router manager that supports extending pages and plugin settings pages through router.add() and pluginSettingsRouter.add().

#Registered Default Page Routes

NamePathComponentDescription
admin/admin/*AdminLayoutAdmin pages
admin.page/admin/:nameAdminDynamicPageDynamically created pages
admin.settings/admin/settings/*AdminSettingsLayoutPlugin settings pages

#Regular Page Extension

Add regular page routes via router.add(). For page components, use componentLoader so the page module is loaded only when the route is actually visited.

Page modules must use export default:

// routes/HomePage.tsx
export default function HomePage() {
  return <h1>Home</h1>;
}
import { Link, Outlet } from 'react-router-dom';
import { Application, Plugin } from '@nocobase/client';

const Layout = () => (
  <div>
    <div>
      <Link to="/">Home</Link> | <Link to="/about">About</Link>
    </div>
    <Outlet />
  </div>
);

class MyPlugin extends Plugin {
  async load() {
    this.router.add('root', { element: <Layout /> });

    this.router.add('root.home', {
      path: '/',
      // Dynamic import: the page module loads only when this route is entered
      componentLoader: () => import('./routes/HomePage'),
    });

    this.router.add('root.about', {
      path: '/about',
      componentLoader: () => import('./routes/AboutPage'),
    });
  }
}

const app = new Application({
  router: { type: 'memory', initialEntries: ['/'] },
  plugins: [MyPlugin]
});

export default app.getRootComponent();

Supports dynamic parameters

this.router.add('root.user', {
  path: '/user/:id',
  element: ({ params }) => <div>User ID: {params.id}</div>
});

If a page is heavy or not needed on first paint, prefer componentLoader. element remains suitable for layout routes or very lightweight inline pages.

#Plugin Settings Page Extension

Add plugin settings pages via pluginSettingsRouter.add(). Like regular routes, settings pages should also use componentLoader.

import { Plugin } from '@nocobase/client';

export class HelloPlugin extends Plugin {
  async load() {
    this.pluginSettingsRouter.add('hello', {
      title: 'Hello', // Settings page title
      icon: 'ApiOutlined', // Settings page menu icon
      // Dynamic import: the page module loads only when this settings route is entered
      componentLoader: () => import('./settings/HelloSettingPage'),
    });
  }
}

Multi-level routing example

import { Outlet } from 'react-router-dom';

const pluginName = 'hello';

class HelloPlugin extends Plugin {
  async load() {
    // Top-level route
    this.pluginSettingsRouter.add(pluginName, {
      title: 'HelloWorld',
      icon: '',
      element: <Outlet />,
    });

    // Child routes
    this.pluginSettingsRouter.add(`${pluginName}.demo1`, {
      title: 'Demo1 Page',
      // Dynamic import: the page module loads only when this settings route is entered
      componentLoader: () => import('./settings/Demo1Page'),
    });

    this.pluginSettingsRouter.add(`${pluginName}.demo2`, {
      title: 'Demo2 Page',
      componentLoader: () => import('./settings/Demo2Page'),
    });
  }
}