一、鴻蒙應用開發中,HAR(靜態共享包)和HSP(動態共享包)間的頁面跳轉,有着不同的路徑配置規則依賴管理方式

特性

HAR(靜態共享包)

HSP(動態共享包)

核心跳轉方式

命名路由 (pushNamedRoute

完整Bundle路徑 (pushUrl

路徑格式

路由名 (如 'MainPage'

'@bundle:包名/模塊名/路徑/頁面名' 

前置配置

在HAR頁面使用 @Entry({routeName: '頁面名'}) 

確保HSP模塊已正確配置並隨主包部署 

適用場景

依賴關係清晰、需要避免循環依賴的模塊間跳轉 

需要運行時動態加載、模塊獨立性要求高的場景 

二、HAR包頁面跳轉

HAR包的頁面跳轉主要依賴命名路由

  1. 配置HAR頁面:在HAR包中,跳轉的頁面組件使用@Entry({routeName: '路由名'})進行裝飾。
// 在HAR包的頁面文件中
@Entry({ routeName: 'StaticPage' }) // 定義命名路由
@Component
export struct StaticPage {
  // 頁面代碼
}

     2. 跳轉到HAR頁面:在需要跳轉的地方,使用router.pushNamedRoute()方法,並指定在HAR中定義的路由名

import router from '@ohos.router';
//導入頁面文件
import "library_static/src/main/ets/components/StaticPage" //靜態導入
//import('library_static/src/main/ets/components/StaticPage') //也可以動態導入

// 在Entry或Feature模塊中跳轉
router.pushNamedRoute({
  name: 'StaticPage', // 與HAR中定義的路由名一致
  params: { key: 'value' } // 可選參數
})

備註:HAR包頁面不能直接使用pushUrl跳轉,必須採用命名路由方式

三、HSP包頁面跳轉

HSP包的頁面跳轉則必須使用完整的Bundle路徑

  1. 跳轉到HSP頁面:使用router.pushUrl()方法,其中url參數需嚴格按照'@bundle:包名(bundleName)/模塊名(moduleName)/路徑/頁面所在的文件名(不加.ets後綴)'的格式編寫
import router from '@ohos.router';

// 從Entry或Feature模塊跳轉到HSP頁面
const bundleName = (getContext(this) as common.UIAbilityContext).applicationInfo.name;

router.pushUrl({
  url: `@bundle:${bundleName}/library/ets/pages/SharedPage` // 完整的Bundle路徑
}).then(() => {
  // 跳轉成功回調
}).catch(err => {
  // 跳轉失敗處理
  console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`);
})

注意:HSP中的頁面同樣需要使用@Entry裝飾器,不需要routeName參數(其實也可以按照命名路由方式跳轉)。

HSP內的相互跳轉及返回

  • HSP跳轉到HSP:同樣使用上述的完整Bundle路徑格式。
  • HSP內返回:使用router.back()。如果需要返回到特定的HAP頁面,url可以寫為'pages/Index'這樣的相對路徑;如果返回HSP頁面,則需要使用完整的Bundle路徑。

總結

特性

HAR 包跳轉

HSP 包跳轉

依賴時機

編譯時依賴

運行時依賴

是否需要導入

必須導入目標頁面

無需導入目標頁面

跳轉方式

pushNamedRoute({name: '路由名'})

pushUrl({url: '完整路徑'})

路徑配置

使用路由名稱

使用完整Bundle路徑

類型安全

編譯時類型檢查

運行時解析,無編譯時類型檢查

耦合度

緊耦合(編譯時需要)

鬆耦合(運行時解析)

建議:

  • 簡單跳轉推薦命名路由方案,代碼更簡潔
  • route頁面棧最大容量為32個頁面,超出需要調用clear()方法清理
  • 需要複雜頁面棧管理時推薦Navigation方案
  • 若涉及多HAP跳轉,建議改用HSP動態共享包