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.