This is currently used in my project and works great. Highly recommended!
I. Implementation Principles & Architecture
HMRouter leverages HarmonyOS's componentized navigation architecture with a three-tier encapsulation for efficient routing management:
Application Layer (@HMRouter Annotations) ↔ Routing Management Layer (RouteTable) ↔ System Layer (Navigation Containers)
1. Annotation-Driven Routing Table
Automatically generates routing mappings via compile-time annotation processors
Enables type-safe navigation with metadata collection (page paths, parameter validation rules, lifecycle callbacks)
2. Dynamic Route Stack Management
Built on NavPathStack for intelligent routing maintenance
-
Supports:
- Nested routing (sub-navigation within containers)
- Cross-module navigation (requires module dependency configuration)
- Route state persistence (stack restoration after app restart)
3. Enhanced Lifecycle
- Extended lifecycle states:
export enum PageLifecycle {
onCreate = 'onCreate',
onShow = 'onShow',
onHide = 'onHide',
onDestroy = 'onDestroy'
}
II. Core Usage
2.1 Environment Configuration
// hvigor-config.json
{
"dependencies": {
"@hadss/hmrouter": "^1.0.0-rc.6",
"@hadss/hmrouter-transitions": "^1.0.0-rc.6"
}
}
Requires compilation plugin configuration in each module's hvigorfile.ts
2.2 Route Declaration
// Page route definition
@HMRouter({
pageUrl: "LoginActivity",
interceptors: [AuthInterceptor] // Global interceptors
})
@Component
export struct LoginPage {
// Parameter validation
@Validate({
name: { type: 'string', required: true },
age: { type: 'number', min: 18 }
})
static routeParams: Record<string, Validator> = {}
}
2.3 Navigation Implementation
// Basic navigation
HMRouter.push({
pageUrl: "DetailPage",
params: { id: 123 },
onResult: (res) => {
console.log('Returned data:', res)
}
})
// Interceptor-enabled navigation
HMRouter.withInterceptor(AuthInterceptor).push("ProfilePage")
III. Technical Advantages
3.1 Modular Development Support
Compile-time checks for unregistered routes
Dependency isolation via module.json declarations
Dynamic loading with @LazyRoute
3.2 Advanced Features
Feature | Implementation |
---|---|
Transition Animations | JSON-configurable scaling/fade/ shared-element animations |
Service Routes | @ServiceRoute for cross-component access |
Permission Checks | Annotation-based authorization (e.g., @RequirePermission("READ_CONTACTS")) |
3.3 Performance Metrics
Cold startup routing resolution latency: <20ms (vs. 50ms for native Navigation)
Unlimited theoretical stack depth (memory-dependent)
40% regex validation optimization
IV. Comparison with Alternatives
4.1 vs. Native Navigation
Feature | HMRouter | Native Navigation |
---|---|---|
Route Interception | ✔️ Global/local | ❌ None |
Transition Animations | ✔️ Custom JSON | ✔️ Basic only |
Compile-time Validation | ✔️ Type safety | ❌ Runtime only |
Cross-module Navigation | ✔️ Dependency required | ❌ Not supported |
4.2 vs. TheRouter
Feature | HMRouter | TheRouter |
---|---|---|
Routing Protocol | Annotation-based | Annotation + code registration |
Cross-platform | HarmonyOS only | Android/iOS/Harmony |
Dynamic Routing | ❌ Full rebuild | ✔️ Hot-update |
Lifecycle Control | ✔️ Extended callbacks | ✔️ Basic only |
V. Best Practices
5.1 E-commerce Routing Scheme
// Cart page configuration
@HMRouter({
pageUrl: "CartPage",
interceptors: [LoginInterceptor, CartValidationInterceptor],
transitions: {
enter: { type: 'slide', direction: 'right' },
exit: { type: 'fade' }
}
})
@Component
export struct CartPage {
// Automatic parameter validation
static validateParams(params: Record<string, any>) {
return params.items.every(item => item.id > 0)
}
}
// Validation on navigation
HMRouter.push("CartPage", { items: [101,102] })
.catch(err => console.error('Validation failed:', err))
5.2 Multi-module Architecture
app-root/
├── entry-module/ # Main entry
│ └── src/
│ └── main/ets/
│ └── pages/
│ └── MainActivity.ets
├── feature-module/ # Feature modules
│ ├── build.gradle
│ └── src/
│ └── main/ets/
│ └── routes.json # Module route declarations
└── shared-module/ # Shared services
└── src/
└── main/ets/
└── services/ # Shared service routes
Top comments (0)