HarmonyOS 鸿蒙Next中ArkTS不能使用JS的生态工具?
HarmonyOS 鸿蒙Next中ArkTS不能使用JS的生态工具? 想要在项目中引入prisma,ohpm install失败。看了下仓库里没有。是可以使用node引入依赖,还是无法使用?
如果不能使用的话,是只能使用ohpm仓库里已有的生态工具吗。
还真没有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
问题核心原因
-
ohpm仓库无Prisma支持
- 当前OpenHarmony三方库中心仓(ohpm)未收录Prisma SDK,直接执行
ohpm install @prisma/client会因包不存在而失败。 - ohpm生态目前主要聚焦鸿蒙原生能力(如UI、硬件交互等),Node.js数据库工具链暂未纳入官方仓库。
- 当前OpenHarmony三方库中心仓(ohpm)未收录Prisma SDK,直接执行
-
Node.js依赖与鸿蒙的兼容性
- Prisma是Node.js生态的ORM工具,依赖Node.js运行时和底层文件系统操作,而鸿蒙ArkTS应用运行在方舟虚拟机(ArkVM)而非Node.js环境。
- 直接通过
npm install引入Prisma不可行:Node.js模块无法在鸿蒙原生应用中直接调用。
可以尝试用这个方案试试:
转换Prisma为HAR包(实验性)
-
通过ohpm convert尝试转换
执行命令将Prisma转换为鸿蒙HAR包:ohpm convert prisma --registry https://registry.npmjs.org/但需注意:
- Prisma依赖Node.js原生模块(如
fs/child_process),转换后大概率无法在ArkTS环境运行。 - 仅适合纯JS/TS逻辑的库,且需手动修复平台兼容性问题。
- Prisma依赖Node.js原生模块(如
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步参考文档移植JS/TS三方库检查兼容性并在目标设备(通常为HarmonyOS NEXT手机)上执行用例,确保三方库在目标设备上功能可用。
- TS三方库通过DevEco Studio检查TS库的语法和兼容性。
- JS三方库使用js-e2e工具扫描兼容性。
- 第2步使用ohpm convert把JS/TS转换成HAR包。
具体实现可以参考如下步骤:
- 使用ohpm convert转换三方库需要先参考文档移植JS/TS三方库,如果原库为TS库不需要使用js-e2e工具分析,TS库可直接将放到DevEco Studio里面,DevEco Studio会检查是否有语法报错;JS库需要使用js-e2e工具扫描不兼容项,如果依赖NodeJS/Web库,则需要fork源库代码,进行侵入式修改,或者再找其他合适的三方库替代。
- 在命令行窗口使用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
- 执行完成ohpm convert远程转换命令会在执行命令目录下生成convert_xxxxxx的文件夹,使用本地npm install在转换会在node_modules同级目录下会生成convert_xxxxxx的文件夹,生成的HAR包会在文件夹下。
- 项目中引用HAR文件有三种方式:
- 直接在项目中新建文件夹,把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"
}
- 搭建ohpm-repo私仓,将HAR包上传到私仓,在oh-package.json5中使用,参考引用共享包。
"dependencies": {
"@protobuf-ts/plugin-framework": "2.9.6",
"@protobuf-ts/runtime": "2.9.6"
}
- 上传到OpenHarmony三方库中心仓,在oh-package.json5中使用。
"dependencies": {
"@protobuf-ts/plugin-framework": "2.9.6",
"@protobuf-ts/runtime": "2.9.6"
}
- 依赖的HAR包中会有引用其他HAR包的情况,会出现找不到依赖的报错,有三种方式解决。
- 在工程级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"
}
- 把依赖的HAR包上传到ohpm-repo私仓。
- 把依赖的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
- ohpm作为OpenHarmony三方库的包管理工具,支持OpenHarmony共享包的发布、安装和依赖管理。
- 目前鸿蒙三方库中暂未发现prisma
- OpenHarmony三方库中心仓
- ohpm install下载三方库时报错的解决方案
开发者你好,可以通过创建 .ts 文件来引用 npm 生态库,.ets 文件可以导入 .ts 文件。需要注意的是,.ets 引入 .ts 文件时可能会遇到 any 和 unknown 类型问题,需要做好类型处理。
问题一:创建 .ts 文件作为 npm 生态库的适配层
.ets文件可以import.ts文件,可以通过创建.ts文件来封装 npm 生态库的使用,然后在.ets文件中引入。
实现步骤:
- 在项目中创建 .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()
- 在 .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文件中必须定义明确的类型接口,避免返回any或unknown.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 禁止使用
any和unknown类型,必须在.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,因此:
- 不支持直接使用npm或yarn安装Node.js生态工具
- 需要寻找OHPM仓库中已适配的替代方案(如本地数据库操作可使用相关原生API)
- 如需特定功能,建议关注华为官方生态进展或考虑自行开发适配
当前阶段建议优先使用OHPM官方仓库的包,或通过FFI机制调用C++原生库来实现特定需求。随着生态发展,未来可能会逐步扩展对Web生态工具的兼容支持。

