Skip to content

RouterPlugin ​

Router plugin interface, designed with reference to the Swiper.js plugin architecture. Each plugin registers hooks into the PluginContext via the install method, and the router calls registered hooks sequentially at each stage of the navigation flow.

Type Definition ​

ts
interface RouterPlugin {
  /** Plugin name */
  name: string
  /**
   * Install the plugin
   * @param context - Plugin context, used to register hooks
   * @param options - Router initialization options (plugins can read their own options)
   */
  install(context: PluginContext, options: RouterOptions): void
}

Built-in Plugins ​

PluginnameDescription
ParamsPlugin'params'Page parameter passing (params/persistent), see Navigation - params
AnimationPlugin'animation'Navigation animation (App only), see Navigation - Animation
ChannelPlugin'channel'Page communication + usePageChannel(), see Navigation - Communication
InterceptorPlugin'interceptor'Intercept uni native navigation APIs, see Interceptor Mechanism

Registration ​

Register plugins via the plugins option in createRouter():

ts
import { createRouter, ParamsPlugin, AnimationPlugin, ChannelPlugin, InterceptorPlugin } from '@meng-xi/uni-router'

const router = createRouter({
  routes: [...],
  plugins: [ParamsPlugin, AnimationPlugin, ChannelPlugin, InterceptorPlugin],
  // Plugin-related options
  paramsPersistent: true,      // requires ParamsPlugin
  useUniEventChannel: true,    // requires ChannelPlugin
  interceptUniApi: true        // requires InterceptorPlugin
})

PluginContext ​

Plugin context, the hook registration interface exposed by the router to plugins.

ts
interface PluginContext {
  /** Enhance the raw route location before matcher.resolve() */
  onEnrichLocation(hook: (location: RouteLocationRaw) => RouteLocationRaw): void

  /** After resolve, before guards, extract plugin data from the enriched route location */
  onAfterResolve(hook: (enrichedLocation: RouteLocationRaw, pluginData: Record<string, any>) => void): void

  /** Before uni API call, modify navigation URL query and options */
  onPrepareNavigation(hook: (ctx: NavigationPrepareContext) => void): void

  /** After uni API call succeeds, extend NavigationResult */
  onCompleteNavigation(hook: (ctx: NavigationCompleteContext) => void): void

  /** When navigation is aborted or fails, perform cleanup */
  onNavigationAbort(hook: (pluginData: Record<string, any>) => void): void

  /** During syncCurrentRoute, extract plugin data from URL query */
  onRouteSync(hook: (query: Record<string, string>, params: Record<string, any>) => void): void

  ** Triggered when router.install() is called */
  onAppInstall(hook: (app: App) => void): void

  /** Current route location (read-only) */
  readonly currentRoute: RouteLocation

  /** Resolve a route location to a full RouteLocation object */
  resolve(location: RouteLocationRaw): RouteLocation

  /** Router instance reference */
  readonly router: Router

  /** Core ParamsManager instance */
  readonly paramsManager: ParamsManager

  /** Check if a specified plugin is registered */
  hasPlugin(name: string): boolean
}

Navigation preparation context, used by plugins before uni API calls:

ts
interface NavigationPrepareContext {
  /** Target route */
  to: RouteLocation
  /** Source route */
  from: RouteLocation
  /** Navigation mode */
  mode: 'push' | 'replace' | 'relaunch' | 'back'
  /** Data shared between plugins */
  pluginData: Record<string, any>
  /** Actual navigation URL query (mutable) */
  query: Record<string, string>
  /** uni navigation options (mutable) */
  options: UniNavigationOptions
}

Navigation completion context, used by plugins after uni API calls succeed:

ts
interface NavigationCompleteContext {
  /** Target route */
  to: RouteLocation
  /** Navigation mode */
  mode: 'push' | 'replace' | 'relaunch' | 'back'
  /** Data shared between plugins */
  pluginData: Record<string, any>
  /** Native eventChannel (only available in push mode) */
  nativeEventChannel?: EventChannel
  /** Navigation result (mutable: extended by plugins) */
  result: Record<string, any>
}

Custom Plugin Example ​

ts
import type { RouterPlugin, PluginContext } from '@meng-xi/uni-router'
import type { RouterOptions } from '@meng-xi/uni-router'

const AnalyticsPlugin: RouterPlugin = {
  name: 'analytics',

  install(context: PluginContext, options: RouterOptions) {
    // Report after navigation completes
    context.onCompleteNavigation((ctx) => {
      trackPageView(ctx.to.path, ctx.mode)
    })

    // Report when navigation is aborted
    context.onNavigationAbort(() => {
      trackEvent('navigation_aborted')
    })
  }
}

// Register
const router = createRouter({
  routes: [...],
  plugins: [AnalyticsPlugin]
})

Next Steps ​

Released under the MIT License.