HarmonyOS 鸿蒙Next中ArkTS不能使用JS的生态工具?

HarmonyOS 鸿蒙Next中ArkTS不能使用JS的生态工具? 想要在项目中引入prisma,ohpm install失败。看了下仓库里没有。是可以使用node引入依赖,还是无法使用?

如果不能使用的话,是只能使用ohpm仓库里已有的生态工具吗。

12 回复

还真没有prisma !

不能使用node引入这个依赖哦!

arkts 是用来开发鸿蒙应用的,prisma 还没有适配鸿蒙吧!

更多关于HarmonyOS 鸿蒙Next中ArkTS不能使用JS的生态工具?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这样吗,我还以为arkts可以直接使用js的生态😂,

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

问题核心原因

  1. ohpm仓库无Prisma支持

    • 当前OpenHarmony三方库中心仓(ohpm)未收录Prisma SDK,直接执行ohpm install @prisma/client会因包不存在而失败。
    • ohpm生态目前主要聚焦鸿蒙原生能力(如UI、硬件交互等),Node.js数据库工具链暂未纳入官方仓库。
  2. Node.js依赖与鸿蒙的兼容性

    • Prisma是Node.js生态的ORM工具,依赖Node.js运行时和底层文件系统操作,而鸿蒙ArkTS应用运行在方舟虚拟机(ArkVM)而非Node.js环境。
    • 直接通过npm install引入Prisma不可行:Node.js模块无法在鸿蒙原生应用中直接调用。

可以尝试用这个方案试试:

转换Prisma为HAR包(实验性)

  1. 通过ohpm convert尝试转换
    执行命令将Prisma转换为鸿蒙HAR包:

    ohpm convert prisma --registry https://registry.npmjs.org/
    

    但需注意

    • Prisma依赖Node.js原生模块(如fs/child_process),转换后大概率无法在ArkTS环境运行。
    • 仅适合纯JS/TS逻辑的库,且需手动修复平台兼容性问题。

ArkTS是作为TS的超类,可以使用TS的部分特性,Prisma目前还没有适配鸿蒙

https://github.com/prisma/prisma

可以自行适配prisma库,因为当前库主要由TS开发,在适配过程中需要处理源码:

【背景知识】

  • ohpm:ohpm作为OpenHarmony三方库的包管理工具,支持OpenHarmony共享包的发布、安装和依赖管理。
  • ohpm convert:将指定ohpm或npm仓库中的某个包或者本地node_modules目录下的包转换成满足ohpm格式要求的HAR包,并保存至当前工作目录,转换后的包将支持上传至ohpm-repo私仓或OpenHarmony三方库中心仓。
  • ohpm-repo私仓搭建工具:ohpm-repo是一个搭建轻量级的ohpm私仓服务的工具。它与ohpm包管理器兼容,并按需缓存所有依赖项,加速私有网络中的安装。
  • OpenHarmony三方库中心仓:用于检索、查看所需OpenHarmony三方库信息,也可管理关于ohpm的个人配置。
  • js-e2e:基于eslint进行封装、配置规则,分析出JS库代码对NodeJS和Web浏览器的内置模块、对象的依赖及兼容ES标准版本。支持检查指定源码目录和指定三方库的兼容性。

【解决方案】 主要分为2步:

  1. 第1步参考文档移植JS/TS三方库检查兼容性并在目标设备(通常为HarmonyOS NEXT手机)上执行用例,确保三方库在目标设备上功能可用。
    1. TS三方库通过DevEco Studio检查TS库的语法和兼容性。
    2. JS三方库使用js-e2e工具扫描兼容性。
  2. 第2步使用ohpm convert把JS/TS转换成HAR包。

具体实现可以参考如下步骤:

  1. 使用ohpm convert转换三方库需要先参考文档移植JS/TS三方库,如果原库为TS库不需要使用js-e2e工具分析,TS库可直接将放到DevEco Studio里面,DevEco Studio会检查是否有语法报错;JS库需要使用js-e2e工具扫描不兼容项,如果依赖NodeJS/Web库,则需要fork源库代码,进行侵入式修改,或者再找其他合适的三方库替代。
  2. 在命令行窗口使用ohpm convert将远程的npm三方库或者本地npm install后node_modules目录转换成HAR包。
// 远程的npm三方库
ohpm convert @protobuf-ts/plugin --registry https://registry.npmjs.org/
或者
// 本地npm install后node_modules目录
D:\testOhpm> npm install @protobuf-ts/plugin
D:\testOhpm> ohpm convert D:\testOhpm\node_modules
  1. 执行完成ohpm convert远程转换命令会在执行命令目录下生成convert_xxxxxx的文件夹,使用本地npm install在转换会在node_modules同级目录下会生成convert_xxxxxx的文件夹,生成的HAR包会在文件夹下。
  2. 项目中引用HAR文件有三种方式:
    1. 直接在项目中新建文件夹,把HAR包复制到文件夹下,在oh-package.json5中使用。
"dependencies": {
  "@protobuf-ts/plugin-framework": "file:./entry/src/main/ets/har/@protobuf-ts+plugin-framework.har",
  "@protobuf-ts/runtime": "file:./entry/src/main/ets/har/@protobuf-ts+runtime.har"
}
  1. 搭建ohpm-repo私仓,将HAR包上传到私仓,在oh-package.json5中使用,参考引用共享包
"dependencies": {
  "@protobuf-ts/plugin-framework": "2.9.6",
  "@protobuf-ts/runtime": "2.9.6"
}
  1. 上传到OpenHarmony三方库中心仓,在oh-package.json5中使用。
"dependencies": {
  "@protobuf-ts/plugin-framework": "2.9.6",
  "@protobuf-ts/runtime": "2.9.6"
}
  1. 依赖的HAR包中会有引用其他HAR包的情况,会出现找不到依赖的报错,有三种方式解决。
    1. 在工程级oh-package.json5中使用overrides将依赖树中的依赖替换为本地HAR包。
"overrides": {
  "typescript": "file:./entry/src/main/ets/har/typescript.har",
  "@protobuf-ts/runtime": "file:./entry/src/main/ets/har/@protobuf-ts+runtime.har"
}
  1. 把依赖的HAR包上传到ohpm-repo私仓
  2. 把依赖的HAR上传到OpenHarmony三方库中心仓

【总结】

  • 对于ArkTS中使用TS的三方库可以通过ohpm convert转换成HarmonyOS可使用的HAR包。
  • 对于HAR包中包含的依赖无法获取到时,需要上传依赖的HAR包或者使用overrides。
  • ArkTS中可以引用TS语言开发的三方库,TS文件不能引用ArkTS语言开发的三方库,参考文档
  • 对于移植的JS库需要使用js-e2e工具扫描扫,TS库则需要放入DevEco Studio检查语法。

【问题背景】:鸿蒙能不能使用node进行引入?能的话能不能引入prisma ?

【解决方案】:鸿蒙不支持使用node作为包管理工具,鸿蒙有自己的包管理工具:ohpm

开发者你好,可以通过创建 .ts 文件来引用 npm 生态库,.ets 文件可以导入 .ts 文件。需要注意的是,.ets 引入 .ts 文件时可能会遇到 anyunknown 类型问题,需要做好类型处理。

问题一:创建 .ts 文件作为 npm 生态库的适配层

.ets 文件可以 import .ts 文件,可以通过创建 .ts 文件来封装 npm 生态库的使用,然后在 .ets 文件中引入。

实现步骤

  1. 在项目中创建 .ts 文件用于封装 npm 库
// utils/prisma.ts (注意:文件扩展名为 .ts)
import { PrismaClient } from '@prisma/client'

// 定义明确的类型接口,避免 any 和 unknown
export interface DatabaseResult {
  id: number
  // 其他字段定义
}

// 封装 Prisma 客户端
class PrismaService {
  private client: PrismaClient
  
  constructor() {
    this.client = new PrismaClient()
  }
  
  /**
   * 执行数据库查询
   */
  async query(): Promise<DatabaseResult[]> {
    // 确保返回明确的类型,不要返回 any
    const results = await this.client.yourModel.findMany()
    return results as DatabaseResult[]
  }
  
  /**
   * 关闭连接
   */
  async disconnect(): Promise<void> {
    await this.client.$disconnect()
  }
}

export const prismaService = new PrismaService()
  1. 在 .ets 文件中引入 .ts 文件
// main.ets
import { prismaService, DatabaseResult } from './utils/prisma'

@ComponentV2
struct DatabasePage {
  @Local dataList: DatabaseResult[] = []
  
  /**
   * 加载数据
   */
  async loadData(): Promise<void> {
    try {
      // 调用封装好的服务,返回类型明确
      this.dataList = await prismaService.query()
    } catch (error) {
      console.error(`加载数据失败: ${error.message}`)
    }
  }
  
  build() {
    Column() {
      // UI内容
    }
  }
}

关键点

  • .ts 文件中必须定义明确的类型接口,避免返回 anyunknown
  • .ets 文件可以导入 .ts 文件,但需要注意类型安全
  • 通过类型接口封装,避免类型不匹配问题

问题二:使用类型断言处理类型问题

如果 .ts 文件中的函数返回类型不确定,可以在 .ets 文件中使用类型断言:

// utils/helper.ts
export function getData(): any {  // npm 库可能返回 any
  // npm 库的调用
  return someNpmLibrary.getData()
}

// main.ets
import { getData } from './utils/helper'

// 定义明确的接口类型
interface MyDataType {
  id: number
  name: string
}

@ComponentV2
struct MyPage {
  /**
   * 使用类型断言处理 any 类型
   */
  async loadData(): Promise<void> {
    try {
      // 使用类型断言,将 any 转换为明确类型
      const data: MyDataType = getData() as MyDataType
      // 现在可以安全使用 data
      console.info(`数据ID: ${data.id}`)
    } catch (error) {
      console.error(`加载失败: ${error.message}`)
    }
  }
  
  build() {
    Column() {
      // UI内容
    }
  }
}

关键点

  • 使用类型断言 as 将不确定类型转换为明确类型
  • 确保断言的安全性,避免运行时错误
  • 优先在 .ts 文件中定义明确类型,减少类型断言的使用

注意事项

  • 文件交互规则.ets 文件可以 import .ts 文件,但 .ts 文件不能 import .ets 文件
  • 类型安全:ArkTS 禁止使用 anyunknown 类型,必须在 .ts 文件中定义明确的类型接口
  • npm 依赖安装:需要在项目根目录创建 package.json,使用 npm install 安装依赖
  • 类型定义:建议为 npm 库的类型定义独立的接口,避免直接使用 any
  • 运行时支持:确保 npm 库在 HarmonyOS 运行时环境中可以正常工作

如果以上方案对您有帮助,欢迎采纳答案,也欢迎继续提问交流!🙏

为啥要引入prisma 是需要操作数据库吗 没必要用第三方的ORM库吧

感觉原生的不太熟悉,如果能用prisma就方便了😢,

在HarmonyOS Next中,ArkTS基于TypeScript扩展,与JS生态工具不完全兼容。由于架构差异,ArkTS采用声明式UI和静态类型,而JS生态工具多依赖动态类型和浏览器DOM环境。因此,直接使用npm、Webpack等JS工具链需适配或通过特定转换工具实现部分功能。

在HarmonyOS Next的ArkTS开发中,目前主要依赖OHPM(OpenHarmony Package Manager)作为官方包管理工具。Prisma作为Node.js生态的数据库工具,现阶段无法直接通过OHPM安装,因为OHPM仓库主要收录为OpenHarmony/HarmonyOS原生适配的库。

ArkTS虽然语法类似TypeScript,但运行环境并非Node.js,因此:

  1. 不支持直接使用npm或yarn安装Node.js生态工具
  2. 需要寻找OHPM仓库中已适配的替代方案(如本地数据库操作可使用相关原生API)
  3. 如需特定功能,建议关注华为官方生态进展或考虑自行开发适配

当前阶段建议优先使用OHPM官方仓库的包,或通过FFI机制调用C++原生库来实现特定需求。随着生态发展,未来可能会逐步扩展对Web生态工具的兼容支持。

回到顶部