智能客服
你问我答,随时在线为你解决问题
您当前浏览的3.1/4.0版本文档归档不再维护,推荐您使用最新的HarmonyOS NEXT版本文档。详细请参考文档维护策略变更。
API 8工程的npm共享包的实现依赖于npm,因此您需要了解和掌握npm的基础功能和机制,可通过npm官方文档进行了解。
接下来,将简单介绍HarmonyOS npm模块的工程结构,如下图所示:

相关字段的描述如下,其余字段与Entry或Feature模块相关字段相同,可参考工程介绍。
本文将介绍如何创建HarmonyOS npm模块、如何编译HarmonyOS npm共享包、如何引用HarmonyOS npm包资源,以及如何将HarmonyOS npm共享包发布到npm仓。


创建完成后,会在工程目录中生成HarmonyOS npm共享模块及相关文件。

在开发HarmonyOS npm模块时,请注意以下事项:
开发完HarmonyOS npm模块后,选中模块名,然后通过DevEco Studio菜单栏的Build > Make Module ${libraryName}进行编译构建,生成HarmonyOS npm包。HarmonyOS npm包可用于工程其它模块的引用,或将HarmonyOS npm包上传至npm仓库,供其他开发者下载使用。

编译构建的HarmonyOS npm包可在模块下的build目录下获取,包格式为*.tgz。

在编译构建HarmonyOS npm模块时,请注意以下事项:
将打包的HarmonyOS npm包发布至npm仓,可供其他开发者安装和引用。npm包的发布,既可以发布到npm官方中心仓,也可以将其发布到DevEco Marketplace提供的HarmonyOS npm专用仓,接下来将重点介绍如何发布到HarmonyOS npm专用仓。关于发布到npm官方中心仓请参考npm官方文档。
发布HarmonyOS npm包需注册华为开发者帐号,并完成实名认证,具体请参考帐号注册和实名认证。

生成的令牌将会在发布HarmonyOS npm包时使用,请单击令牌末尾的复制按钮复制并保存令牌信息。
- npm config set @ohos:registry=https://repo.harmonyos.com/npm/
- npm config set //repo.harmonyos.com/npm/:_authToken <authToken>
- npm publish <HarmonyOS npm包名称>
引用HarmonyOS npm三方包,包括从HarmonyOS npm仓库进行安装和从本地HarmonyOS npm模块中进行安装两种方式。
- npm config set @ohos:registry=https://repo.harmonyos.com/npm/
- npm install @ohos/vcard --save
- "dependencies": {
- "@ohos/vcard": "^2.1.0"
- }
依赖设置完成后,需要执行npm install命令安装依赖包,依赖包会存储在工程的node_modules目录下。
- npm install
- npm install ../library --save
- "dependencies": {
- "library": "file:../library"
- }
依赖设置完成后,需要执行npm install命令安装依赖包,依赖包会存储在工程的node_modules目录下。
- npm install
在引用HarmonyOS npm包时,请注意以下事项:
在JS工程范式中,组件功能由hml承载,开发者可以在JS工程的hml页面通过<element>标签来引入HarmonyOS npm包中的共享hml页面,示例如下:
- <element name="comp" src="library/src/main/js/components/index/index.hml"></element>
其中,library为HarmonyOS npm包的包名,hml页面的路径为HarmonyOS npm包中的相对路径。
随后便可以通过设置的name来使用该element元素,以引用HarmonyOS npm包中的hml页面,示例如下:
- <element name="comp" src="library/src/main/js/components/index/index.hml"></element>
- <div class="container">
- <comp></comp>
- <text class="title">
- {{ $t('strings.hello') }} {{ title }}
- </text>
- </div>
- // library/src/main/ets/components/MainPage/MainPage.ets
- @Entry
- @Component
- export struct MainPage {
- @State message: string = 'Hello World'
- build() {
- Row() {
- Column() {
- Text(this.message)
- .fontSize(50)
- .fontWeight(FontWeight.Bold)
- }
- .width('100%')
- }
- .height('100%')
- }
- }
- // entry/MainAbility/pages/index.ets
-
- import { MainPage } from "library"
- @Entry
- @Component
- struct Index {
- @State message: string = 'Hello World'
-
- build() {
- Column() {
- MainPage()
- Row() {
- Text(this.message)
- .fontSize(50)
- .fontWeight(FontWeight.Bold)
- }
- .width('100%')
- }
- .height('10%')
- }
- }
ts/js方法的导出和引用,与ArkTS页面的引用相同,即在HarmonyOS npm模块中,可以通过export导出ts/js方法,示例如下所示:
- // library/index.js
- export function func() {
- return "[npm] func1";
- }
然后在其它的ts/js页面中,通过import引入导出的ts/js方法,示例如下所示:
- // entry/src/main/js/MainAbility/pages/index/index.js
- import {func} from "library"
- export default {
- data: {
- title: ""
- },
- onInit() {
- this.title = func();
- }
- }
支持在HarmonyOS npm模块和依赖HarmonyOS npm的模块中引用HarmonyOS npm模块内的资源。例如在HarmonyOS npm模块的scr/main/resources里添加字符串资源(在string.json中定义,name:hello_npm)和图片资源(icon_npm.png)。然后在Entry模块中引用该字符串资源和图片资源的示例如下:
当前暂不支持类Web范式引用i18n文件中的国际化资源。
- // entry/src/main/ets/MainAbility/pages/index.ets
- @Entry
- @Component
- struct Index {
- @State message: string = 'Hello World'
- build() {
- Column() {
- Row() {
- Text($r("app.string.hello_npm")) // 字符串资源
- .fontSize(40)
- .fontWeight(FontWeight.Bold)
- }
- .width('50%')
- Image($r("app.media.icon_npm")) // 图片资源
- }
- .height('100%')
- }
- }
在编译构建HAP中,DevEco Studio会从HAP模块及依赖的模块中收集资源文件,如果不同模块的相同限定词目录下的资源文件出现重名冲突时,DevEco Studio会按照以下优先级进行覆盖(优先级由高到低):