一、引言

一个操作系统生态是否成熟,不看第一方能力多强,看第三方库多丰富

鸿蒙的 OHPM(OpenHarmony Package Manager)中心仓已运行数年,但和 npm(300 万+ 包)、Maven(500 万+ 工件)、PyPI(50 万+ 包)相比,差距依然巨大。

但这不是坏事——差距 = 机会

本文从三个角度切入:

  1. 生态现状:ohpm 上有什么、缺什么
  2. 热门库移植指南:如何把 npm/GitHub 上的库搬到鸿蒙
  3. 贡献者机会清单:哪些缺口最有价值

二、ohpm 生态现状

2.1 规模对比

npm (JavaScript)      ───── ████████████████████ 300万+ 包
Maven (Java)          ───── ████████████████     500万+ 工件  (1)
PyPI (Python)         ───── ████████             50万+ 包
CocoaPods (iOS)       ───── █████                10万+ 库
ohpm (HarmonyOS)      ───── █                    数千 库  (2)

(1) Maven 包总数最多但含大量版本快照
(2) ohpm 官方未公布精确数字,据估算数千级别

2.2 分类覆盖度

类别 npm 覆盖度 ohpm 覆盖度 缺口评估
HTTP 网络库 ⭐⭐⭐⭐⭐ ⭐⭐⭐ 够用(@ohos/axios)
UI 组件库 ⭐⭐⭐⭐⭐ ⭐⭐ 大量缺口
状态管理 ⭐⭐⭐⭐⭐ ⭐⭐⭐ 够用
日期处理 ⭐⭐⭐⭐⭐ ⭐⭐⭐ dayjs 已移植
加解密 ⭐⭐⭐⭐⭐ ⭐⭐⭐ crypto-js 已移植
图表可视化 ⭐⭐⭐⭐⭐ 严重短缺
动画引擎 ⭐⭐⭐⭐⭐ ⭐⭐ Lottie 可用,其他缺
图片处理 ⭐⭐⭐⭐⭐ ⭐⭐ 基础够,高级缺
音视频 ⭐⭐⭐⭐⭐ ⭐⭐ 基础够,编解码缺
数据库 ORM ⭐⭐⭐⭐⭐ ⭐⭐ 关系型缺
地图 SDK ⭐⭐⭐⭐ 严重短缺
支付 SDK ⭐⭐⭐⭐ ⭐⭐ 仅华为支付
推送 SDK ⭐⭐⭐⭐ ⭐⭐ 仅鸿蒙推送
AI/ML 库 ⭐⭐⭐⭐ 严重短缺

2.3 热门包排行(估算)

根据 ohpm 下载量和社区活跃度,当前最热门的三方库:

排名 包名 类型 说明
1 @ohos/axios 网络 鸿蒙版 Axios,最热门网络库
2 @ohos/crypto-js 加密 加密算法库
3 @ohos/dayjs 日期 轻量级日期处理
4 @ohos/lottie 动画 Lottie 动画渲染
5 @ohos/router 路由 页面路由管理
6 @ohos/eventbus 通信 事件总线
7 @ohos/ability-access 系统 能力访问封装

三、如何移植一个开源库到鸿蒙

如果你的项目依赖某个 npm 库,而 ohpm 上没有,不要慌——大多数纯 JS/TS 库可以直接移植

3.1 四步移植法

Step 1:评估移植难度
├── 纯 JS/TS 库(无原生依赖) → ✅ 容易,1-3 天
├── 有 C/C++ 层的库 → ⚠️ 需要 NAPI 封装,1-2 周
└── 有平台特定 API 的库 → ❌ 需要重写平台层

Step 2:创建鸿蒙工程
├── DevEco Studio → New → Module → Static Library
├── 配置 oh-package.json5
└── 复制源码到工程

Step 3:适配鸿蒙 API
├── 替换 Node.js 特有 API(fs/path/process)
├── 替换浏览器 API(window/document/navigator)
└── 替换平台 API(用鸿蒙 API 对等替换)

Step 4:测试 + 发布
├── ohpm test 跑通测试
├── 构建 HAR:Build → Make
└── ohpm publish xxx.har

3.2 常见 API 替换对照表

Node.js API → 鸿蒙 API:

Node.js HarmonyOS 替代
fs.readFile import { fileIo } from '@kit.CoreFileKit'
path.join import { fileIo } from '@kit.CoreFileKit'
process.env 无直接替代,用配置常量
crypto.createHash import { cryptoFramework } from '@kit.CryptoArchitectureKit'
Buffer import { buffer } from '@kit.ArkTS'
EventEmitter import { EventHub } from '@kit.AbilityKit'

浏览器 API → 鸿蒙 API:

浏览器 HarmonyOS 替代
fetch import { http } from '@kit.NetworkKit'
WebSocket import { webSocket } from '@kit.NetworkKit'
localStorage import { preferences } from '@kit.DataKit'
setTimeout import { timer } from '@kit.ArkTS'
console.log console.info(不变,但级别不同)
Math.random 不变(纯 JS 算法)

3.3 实战案例:移植一个 npm 日期库

目标: 移植 dayjs(纯 JS 库,无原生依赖)到鸿蒙

1. 源码下载
   git clone https://github.com/iamkun/dayjs.git
   
2. 评估
   dayjs 是纯 JS + TypeScript 类型定义
   无 Node.js API 依赖
   无浏览器 API 依赖
   难度:★★☆☆☆(低)

3. 创建鸿蒙工程
   ohpm init
   # 复制 src 和 types 到工程目录

4. 适配
   无需修改核心代码(dayjs 不依赖平台 API)
   仅需修改:
   ├─ package.json → oh-package.json5
   ├─ 调整导出方式适配 ArkTS 模块规范
   └─ 添加鸿蒙 README

5. 测试 + 发布
   实际工时:约 1-2 天

ArkTS 使用示例:

移植完成后,在鸿蒙应用中导入并使用 dayjs 库:

  1. 安装依赖:在项目的 oh-package.json5 中添加依赖:
{
  "dependencies": {
    "@ohos/dayjs": "^1.0.0"
  }
}
  1. 导入并使用:在 ArkTS 文件中使用 dayjs:
// 导入 dayjs 库
import dayjs from '@ohos/dayjs';

@Entry
@Component
struct DateExample {
  @State currentDate: string = '';
  @State relativeTime: string = '';

  aboutToAppear() {
    // 示例1:格式化当前日期
    const now = dayjs();
    this.currentDate = now.format('YYYY-MM-DD HH:mm:ss');
    
    // 示例2:计算相对时间
    const yesterday = dayjs().subtract(1, 'day');
    this.relativeTime = dayjs().to(yesterday); // "1天前"
    
    // 示例3:日期计算
    const nextWeek = dayjs().add(7, 'day');
    console.info(`下周日期: ${nextWeek.format('YYYY-MM-DD')}`);
    
    // 示例4:日期比较
    const isBefore = dayjs('2024-01-01').isBefore('2024-06-01');
    console.info(`2024-01-01 是否在 2024-06-01 之前: ${isBefore}`);
  }

  build() {
    Column({ space: 20 }) {
      Text('当前日期和时间')
        .fontSize(20)
        .fontWeight(FontWeight.Bold)
      
      Text(this.currentDate)
        .fontSize(18)
        .fontColor(Color.Blue)
      
      Divider()
        .strokeWidth(1)
        .color(Color.Gray)
      
      Text('相对时间示例')
        .fontSize(20)
        .fontWeight(FontWeight.Bold)
      
      Text(this.relativeTime)
        .fontSize(18)
        .fontColor(Color.Green)
      
      Button('刷新时间')
        .width('60%')
        .height(40)
        .onClick(() => {
          // 点击按钮更新日期
          const now = dayjs();
          this.currentDate = now.format('YYYY-MM-DD HH:mm:ss');
          this.relativeTime = dayjs().to(dayjs().subtract(2, 'hour'));
        })
    }
    .width('100%')
    .height('100%')
    .padding(20)
    .justifyContent(FlexAlign.Center)
  }
}
  1. 常用 API 示例
// 1. 创建 dayjs 对象
const date1 = dayjs();                    // 当前时间
const date2 = dayjs('2024-12-25');        // 指定日期
const date3 = dayjs(1735660800000);       // 时间戳
const date4 = dayjs(new Date());          // Date 对象

// 2. 格式化输出
console.info(dayjs().format());           // "2024-06-04T15:33:34+08:00"
console.info(dayjs().format('YYYY年MM月DD日')); // "2024年06月04日"
console.info(dayjs().format('HH:mm:ss')); // "15:33:34"

// 3. 日期计算
const tomorrow = dayjs().add(1, 'day');
const lastMonth = dayjs().subtract(1, 'month');
const startOfWeek = dayjs().startOf('week');
const endOfMonth = dayjs().endOf('month');

// 4. 日期查询
const isLeapYear = dayjs().isLeapYear();  // 是否闰年
const dayOfWeek = dayjs().day();          // 星期几 (0-6)
const daysInMonth = dayjs().daysInMonth(); // 当月天数

// 5. 日期比较
const isSame = dayjs('2024-06-04').isSame('2024-06-04', 'day');
const isAfter = dayjs('2024-12-25').isAfter('2024-06-04');
const diffDays = dayjs('2024-12-25').diff(dayjs(), 'day');
  1. 高级功能
// 插件机制(需额外安装对应插件)
import dayjs from '@ohos/dayjs';
import utc from '@ohos/dayjs/plugin/utc';
import relativeTime from '@ohos/dayjs/plugin/relativeTime';

// 扩展插件
dayjs.extend(utc);
dayjs.extend(relativeTime);

// 使用插件功能
const utcTime = dayjs().utc().format();
const timeAgo = dayjs('2024-06-01').fromNow(); // "3天前"

// 国际化(需安装 locale 文件)
import 'dayjs/locale/zh-cn';
dayjs.locale('zh-cn'); // 设置为中文

注意事项:

  • dayjs 是 immutable 的,所有操作都返回新的 dayjs 对象
  • 鸿蒙版 dayjs 保持了与原版一致的 API,迁移成本低
  • 插件系统同样可用,但需要确保插件也已完成鸿蒙适配
  • 在 ArkTS 中使用时,注意类型安全,dayjs 提供了完整的 TypeScript 类型定义### 3.4 实战案例:移植 C/C++ 加密库

目标: 移植 libsodium(C 语言加密库)到鸿蒙

1. 源码下载
   git clone https://github.com/jedisct1/libsodium.git
   
2. 评估
   纯 C 实现,无平台依赖
   需要 NAPI 桥接
   难度:★★★★☆(中高)

3. NAPI 封装
   // napi_bridge.cpp
   #include "napi/native_api.h"
   #include "sodium.h"
   
   static napi_value CryptoHash(napi_env env, napi_callback_info info) {
       // 1. 解析 JS 参数
       // 2. 调用 libsodium C API
       // 3. 返回结果给 JS
       return result;
   }
   
   static napi_value Init(napi_env env, napi_value exports) {
       napi_property_descriptor desc[] = {
           { "hash", nullptr, CryptoHash, ... }
       };
       napi_define_properties(env, exports, 1, desc);
       return exports;
   }

4. 构建配置(oh-package.json5)
   需要配置 native 编译:
   {
     "ohos": {
       "build": {
         "native": {
           "cppFlags": "-I./include",
           "libs": ["./lib/libsodium.a"]
         }
       }
     }
   }

5. 测试 + 发布
   实际工时:约 1-2 周

四、贡献者机会清单

以下是在 ohpm 上最有价值但尚未完善的领域,按优先级排列:

第一梯队:高需求 + 低供给(优先做)

缺口 原因 预估工程量
图表库 (ECharts/Chart.js 移植) 几乎所有管理后台都需要 1-2 周(纯 JS)
Markdown 渲染器 笔记/文档类 App 刚需 3-5 天(纯 JS)
SQLite ORM 本地数据持久化需求大 2-4 周(NAPI)
二维码/条形码扫描 支付/扫码场景无处不在 1-2 周(NAPI)
下拉刷新 / 轮播图 移动 App 标配 UI 3-5 天(ArkTS)

第二梯队:热门但已有替代方案

领域 现有方案 优化空间
网络请求 @ohos/axios 功能完整,但可补充拦截器插件
加密算法 @ohos/crypto-js 性能不如 C 实现,可做 NAPI 版
日期处理 @ohos/dayjs 够用,可补充国际化插件
图片加载 基础 Skia API 缺少 Glide 级的缓存/缩放/变换库

第三梯队:未来趋势

领域 为什么值得做
AI/ML 推理库 HarmonyOS 7.0 端侧 AI 普及,推理库需求将爆发
跨平台 UI 组件库 ArkUI-X 用户增长,通用组件需求上升
IoT 通信协议库 MQTT/CoAP 在鸿蒙 IoT 场景刚需
无障碍工具库 政务/企业 App 的合规需求

五、发布到 ohpm 的避坑清单

步骤 常见坑 正确做法
包命名 @your-name/pkg 但组织未认证 → 先在中心仓申请组织认证
文件完整性 缺少 LICENSE / README / CHANGELOG → 三个文件缺一不可
密钥 生成 SSH 时跳过 passphrase → 必须填写非空 passphrase
依赖 依赖了 ohpm 上没有的库 → 确认所有依赖都可解析
版本号 版本号冲突 → 遵循 semver 规范
测试 没写测试用例 → 必须包含 ohosTest 测试

关键命令备忘:

# 配置私钥
ohpm config set key_path ~/.ssh/ohpm_rsa

# 配置发布码(从个人中心获取)
ohpm config set publish_id your_publish_id

# 构建
cd your-library && hvigorw assembleHar

# 发布
ohpm publish build/default/outputs/default/your-library.har

六、生态展望:ohpm 的三阶段

Phase 1(2024-2025):从零到有
├── 核心基础设施完善(ohpm CLI + 中心仓)
├── 关键基础库完成移植(axios / crypto-js / dayjs)
└── 开发者开始了解和尝试

Phase 2(2025-2026):快速增长 ← 我们现在在这里
├── 开发者数量 800 万+
├── 终端设备 5500 万+
├── 三方库数千级别,但缺口仍大
└── 早期贡献者获得大量曝光和下载

Phase 3(2027+):生态成熟
├── 三方库数量达到数万级别
├── 覆盖主要类别
├── 头部库获得大规模使用
└── 新贡献者需要拼质量而非数量

七、写在最后

鸿蒙的三方库生态当前处于 “黄金窗口期”

  • 需求确定:数十万鸿蒙应用需要三方库
  • 竞争极小:大部分类别只有个位数甚至零个竞争者
  • 工具成熟:ohpm CLI + 中心仓 + NAPI 已就绪
  • 回报确定:早期高质量库会获得持续曝光

推演一下:如果你今天移植一个图表库到 ohpm,半年后当鸿蒙设备破亿时,你的库可能成为"鸿蒙生态图表库的标准答案"。这个机会在其他生态中已经不存在了——npm 上不再需要一个"新的图表库",但 ohpm 上非常需要。


参考资源:

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐