1e41f4b71Sopenharmony_ci# OpenHarmony JS和TS三方组件使用指导 2e41f4b71Sopenharmony_ci## OpenHarmony JS和TS三方组件介绍 3e41f4b71Sopenharmony_ci 4e41f4b71Sopenharmony_ciOpenHarmony JS和TS三方组件使用的是OpenHarmony静态共享包,即HAR(Harmony Archive),可以包含js/ts代码、c++库、资源和配置文件。通过HAR,可以实现多个模块或者多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP,不能独立安装运行在设备上,只能作为应用模块的依赖项被引用。 5e41f4b71Sopenharmony_ci 6e41f4b71Sopenharmony_ci 7e41f4b71Sopenharmony_ci 8e41f4b71Sopenharmony_ci## 查找OpenHarmony JS和TS三方组件 9e41f4b71Sopenharmony_ci 10e41f4b71Sopenharmony_ci1. 关注Gitee官网OpenHarmony-TPC[三方组件资源汇总](https://gitee.com/openharmony-tpc/tpc_resource)项目,根据目录索引即可找到对应分类下的具体组件。 11e41f4b71Sopenharmony_ci 12e41f4b71Sopenharmony_ci 13e41f4b71Sopenharmony_ci 14e41f4b71Sopenharmony_ci2. 访问[OpenHarmony三方库中心仓](https://ohpm.openharmony.cn/),搜索需要的三方组件。 15e41f4b71Sopenharmony_ci 16e41f4b71Sopenharmony_ci 17e41f4b71Sopenharmony_ci 18e41f4b71Sopenharmony_ci## 安装并使用OpenHarmony JS和TS语言的三方组件 19e41f4b71Sopenharmony_ci 20e41f4b71Sopenharmony_ci引用三方HAR,包括从仓库进行安装和从本地库模块中进行安装两种方式。 21e41f4b71Sopenharmony_ci 22e41f4b71Sopenharmony_ci**引用仓库安装的HAR** 23e41f4b71Sopenharmony_ci 24e41f4b71Sopenharmony_ci引用ohpm仓中的HAR,首先需要设置三方HAR的仓库信息,DevEco Studio默认仓库地址是"https://repo.harmonyos.com/ohpm/",如果您想设置自定义仓库,请在DevEco Studio的Terminal窗口执行如下命令进行设置(执行命令前,请确保将DevEco Studio中ohpm安装地址配置在“环境变量-系统变量-PATH”中): 25e41f4b71Sopenharmony_ci``` 26e41f4b71Sopenharmony_ciohpm config set registry=your_registry1,your_registry2 27e41f4b71Sopenharmony_ci``` 28e41f4b71Sopenharmony_ci说明:ohpm支持多个仓库地址,采用英文逗号分隔。 29e41f4b71Sopenharmony_ci然后通过如下两种方式设置三方包依赖信息: 30e41f4b71Sopenharmony_ci - 方式一:在Terminal窗口中,执行如下命令安装三方包,DevEco Studio会自动在工程的oh-package.json5中自动添加三方包依赖。 31e41f4b71Sopenharmony_ci``` 32e41f4b71Sopenharmony_ciohpm install @ohos/lottie 33e41f4b71Sopenharmony_ci``` 34e41f4b71Sopenharmony_ci - 方式二:在工程的oh-package.json5中设置三方包依赖,配置示例如下: 35e41f4b71Sopenharmony_ci``` 36e41f4b71Sopenharmony_ci"dependencies": { "@ohos/lottie": "^2.0.0"} 37e41f4b71Sopenharmony_ci``` 38e41f4b71Sopenharmony_ci依赖设置完成后,需要执行ohpm install命令安装依赖包,依赖包会存储在工程的oh_modules目录下。 39e41f4b71Sopenharmony_ci``` 40e41f4b71Sopenharmony_ciohpm install 41e41f4b71Sopenharmony_ci``` 42e41f4b71Sopenharmony_ci 43e41f4b71Sopenharmony_ci**引用本地库模块的文件和资源** 44e41f4b71Sopenharmony_ci 45e41f4b71Sopenharmony_ci- 方式一:在Terminal窗口中,执行如下命令进行安装,并会在oh-package5.json中自动添加依赖。 46e41f4b71Sopenharmony_ci``` 47e41f4b71Sopenharmony_ciohpm install ../library 48e41f4b71Sopenharmony_ci``` 49e41f4b71Sopenharmony_ci- 方式二:在工程的oh-package.json5中设置三方包依赖,配置示例如下: 50e41f4b71Sopenharmony_ci``` 51e41f4b71Sopenharmony_ci"dependencies": { 52e41f4b71Sopenharmony_ci "library": "file:../library" 53e41f4b71Sopenharmony_ci} 54e41f4b71Sopenharmony_ci``` 55e41f4b71Sopenharmony_ci依赖设置完成后,需要执行ohpm install命令安装依赖包,依赖包会存储在工程的oh_modules目录下。 56e41f4b71Sopenharmony_ci``` 57e41f4b71Sopenharmony_ciohpm install 58e41f4b71Sopenharmony_ci``` 59e41f4b71Sopenharmony_ci 60e41f4b71Sopenharmony_ci> **说明:** 61e41f4b71Sopenharmony_ci> 62e41f4b71Sopenharmony_ci> 在引用OpenHarmony HAR时,请注意以下事项 63e41f4b71Sopenharmony_ci>- 当前只支持在模块和工程下的oh-package.json5文件中声明dependencies依赖,才会被当做OpenHarmony依赖使用,并在编译构建过程中进行相应的处理。 64e41f4b71Sopenharmony_ci>- 引用的模块的compileSdkVersion不能低于其依赖的OpenHarmony ohpm三方包(可在oh_modules目录下,找到引用的ohpm包的src > main > module.json5 中查看)。 65e41f4b71Sopenharmony_ci 66e41f4b71Sopenharmony_ci 67e41f4b71Sopenharmony_ci 68e41f4b71Sopenharmony_ci### 引用OpenHarmony HAR hml页面 69e41f4b71Sopenharmony_ci在JS工程范式中,组件功能由hml承载,开发者可以在JS工程的hml页面通过<element>标签来引入OpenHarmony HAR中的共享hml页面,示例如下: 70e41f4b71Sopenharmony_ci``` 71e41f4b71Sopenharmony_ci<element name="comp" src="library/src/main/js/components/index/index.hml"></element> 72e41f4b71Sopenharmony_ci``` 73e41f4b71Sopenharmony_ci其中,library为OpenHarmony HAR的包名,hml页面的路径为OpenHarmony HAR中的相对路径。 74e41f4b71Sopenharmony_ci随后便可以通过设置的name来使用该element元素,以引用OpenHarmony HAR中的hml页面,示例如下: 75e41f4b71Sopenharmony_ci```typescript 76e41f4b71Sopenharmony_ci<element name="comp" src="library/src/main/js/components/index/index.hml"></element> 77e41f4b71Sopenharmony_ci 78e41f4b71Sopenharmony_ci<div class="container"> 79e41f4b71Sopenharmony_ci <comp></comp> 80e41f4b71Sopenharmony_ci <text class="title"> 81e41f4b71Sopenharmony_ci {{ $t('strings.hello') }} {{ title }} 82e41f4b71Sopenharmony_ci </text> 83e41f4b71Sopenharmony_ci</div> 84e41f4b71Sopenharmony_ci``` 85e41f4b71Sopenharmony_ci### 引用OpenHarmony HAR ArkTS页面 86e41f4b71Sopenharmony_ciArkTS是TypeScript的扩展,因此导出和引入的语法与TypeScript一致。在OpenHarmony ohpm模块中,可以通过export导出ArkTS页面,示例如下: 87e41f4b71Sopenharmony_ci```typescript 88e41f4b71Sopenharmony_ci// library/src/main/ets/components/mainpage/MainPage.ets 89e41f4b71Sopenharmony_ci@Entry 90e41f4b71Sopenharmony_ci@Component 91e41f4b71Sopenharmony_ciexport struct MainPage { 92e41f4b71Sopenharmony_ci @State message: string = 'Hello World' 93e41f4b71Sopenharmony_ci build() { 94e41f4b71Sopenharmony_ci Row() { 95e41f4b71Sopenharmony_ci Column() { 96e41f4b71Sopenharmony_ci Text(this.message) 97e41f4b71Sopenharmony_ci .fontSize(50) 98e41f4b71Sopenharmony_ci .fontWeight(FontWeight.Bold) 99e41f4b71Sopenharmony_ci } 100e41f4b71Sopenharmony_ci .width('100%') 101e41f4b71Sopenharmony_ci } .height('100%') 102e41f4b71Sopenharmony_ci } 103e41f4b71Sopenharmony_ci} 104e41f4b71Sopenharmony_ci``` 105e41f4b71Sopenharmony_ci然后在其它模块中通过import引入导出的ArkTS页面,示例如下所示: 106e41f4b71Sopenharmony_ci```typescript 107e41f4b71Sopenharmony_ci// entry/MainAbility/pages/index.ets 108e41f4b71Sopenharmony_ci 109e41f4b71Sopenharmony_ciimport { MainPage } from "library" 110e41f4b71Sopenharmony_ci@Entry 111e41f4b71Sopenharmony_ci@Component 112e41f4b71Sopenharmony_cistruct Index { 113e41f4b71Sopenharmony_ci @State message: string = 'Hello World' 114e41f4b71Sopenharmony_ci build() { 115e41f4b71Sopenharmony_ci Column() { 116e41f4b71Sopenharmony_ci MainPage() 117e41f4b71Sopenharmony_ci Row() { 118e41f4b71Sopenharmony_ci Text(this.message) 119e41f4b71Sopenharmony_ci .fontSize(50) 120e41f4b71Sopenharmony_ci .fontWeight(FontWeight.Bold) 121e41f4b71Sopenharmony_ci } 122e41f4b71Sopenharmony_ci .width('100%') 123e41f4b71Sopenharmony_ci } 124e41f4b71Sopenharmony_ci .height('10%') 125e41f4b71Sopenharmony_ci } 126e41f4b71Sopenharmony_ci} 127e41f4b71Sopenharmony_ci``` 128e41f4b71Sopenharmony_ci引用OpenHarmony HAR内ts/js方法ts/js方法的导出和引用,与ArkTS页面的引用相同,即在OpenHarmony ohpm模块中,可以通过export导出ts/js方法,示例如下所示: 129e41f4b71Sopenharmony_ci```typescript 130e41f4b71Sopenharmony_ci// library/index.js 131e41f4b71Sopenharmony_ciexport function func() { 132e41f4b71Sopenharmony_ci return "[ohpm] func1"; 133e41f4b71Sopenharmony_ci} 134e41f4b71Sopenharmony_ci``` 135e41f4b71Sopenharmony_ci然后在其它的ts/js页面中,通过import引入导出的ts/js方法,示例如下所示: 136e41f4b71Sopenharmony_ci```typescript 137e41f4b71Sopenharmony_ci// entry/src/main/js/MainAbility/pages/index/index.js 138e41f4b71Sopenharmony_ciimport {func} from "library" 139e41f4b71Sopenharmony_ciexport default { 140e41f4b71Sopenharmony_ci data: { 141e41f4b71Sopenharmony_ci title: "" 142e41f4b71Sopenharmony_ci }, 143e41f4b71Sopenharmony_ci onInit() { 144e41f4b71Sopenharmony_ci this.title = func(); 145e41f4b71Sopenharmony_ci } 146e41f4b71Sopenharmony_ci} 147e41f4b71Sopenharmony_ci``` 148e41f4b71Sopenharmony_ci引用OpenHarmony HAR内资源支持在OpenHarmony ohpm模块和依赖OpenHarmony ohpm的模块中引用OpenHarmony ohpm模块内的资源。例如在OpenHarmony ohpm模块的scr/main/resources里添加字符串资源(在string.json中定义,name:hello_ohpm)和图片资源(icon_ohpm.png)。然后在Entry模块中引用该字符串资源和图片资源的示例如下: 149e41f4b71Sopenharmony_ci当前暂不支持类Web范式引用i18n文件中的国际化资源。 150e41f4b71Sopenharmony_ci```typescript 151e41f4b71Sopenharmony_ci// entry/src/main/ets/MainAbility/pages/index.ets 152e41f4b71Sopenharmony_ci@Entry 153e41f4b71Sopenharmony_ci@Component 154e41f4b71Sopenharmony_cistruct Index { 155e41f4b71Sopenharmony_ci @State message: string = 'Hello World' 156e41f4b71Sopenharmony_ci build() { 157e41f4b71Sopenharmony_ci Column() { 158e41f4b71Sopenharmony_ci Row() { 159e41f4b71Sopenharmony_ci Text($r("app.string.hello_ohpm")) // 字符串资源 160e41f4b71Sopenharmony_ci .fontSize(40) 161e41f4b71Sopenharmony_ci .fontWeight(FontWeight.Bold) 162e41f4b71Sopenharmony_ci } 163e41f4b71Sopenharmony_ci .width('50%') 164e41f4b71Sopenharmony_ci Image($r("app.media.icon_ohpm")) // 图片资源 165e41f4b71Sopenharmony_ci } 166e41f4b71Sopenharmony_ci .height('100%') 167e41f4b71Sopenharmony_ci } 168e41f4b71Sopenharmony_ci} 169e41f4b71Sopenharmony_ci``` 170e41f4b71Sopenharmony_ci在编译构建HAP中,DevEco Studio会从HAP模块及依赖的模块中收集资源文件,如果不同模块的相同限定词目录下的资源文件出现重名冲突时,DevEco Studio会按照以下优先级进行覆盖(优先级由高到低): 171e41f4b71Sopenharmony_ci- AppScope(仅API 9的Stage模型支持) 172e41f4b71Sopenharmony_ci- HAP包自身模块 173e41f4b71Sopenharmony_ci- 依赖的OpenHarmonyHarmony ohpm模块