Skip to content

Utils

packages/utils 提供各 H5 应用共享的工具函数,内部聚合了 @vh5-core/shared 的缓存和工具模块。

安装

已作为 workspace 依赖,在 H5 应用的 package.json 中引用:

json
{
  "dependencies": {
    "@vh5/utils": "workspace:*"
  }
}

异步错误处理

to()

消除 try/catch 嵌套,将 Promise 转为 [error, data] 元组,使异步错误处理更简洁。

ts
import { to } from "@vh5/utils";

// 替代 try/catch
const [err, data] = await to(getProductList());
if (err) {
  console.error("请求失败", err);
  return;
}
console.log(data);

项目中所有列表页和详情页均使用此模式:

ts
// apps/h5-vant/src/views/list/index.vue
const [err, data] = await to(getProductList());
if (err) {
  console.error("获取商品列表失败", err);
  return;
}
if (data.code === 0) {
  list.value = data.data;
}

进度条

startProgress() / stopProgress()

动态加载 NProgress,在路由导航时显示顶部进度条。

ts
import { startProgress, stopProgress } from "@vh5/utils";

router.beforeEach(() => startProgress());
router.afterEach(() => stopProgress());

全局 Loading

unmountGlobalLoading()

移除 HTML 中注入的全局骨架屏 loading,带 fade-out 过渡。在应用挂载后调用:

ts
import { unmountGlobalLoading } from "@vh5/utils";

// main.ts
unmountGlobalLoading();

日期格式化

formatDate() / formatDateTime()

基于 dayjs,支持时区处理:

ts
import { formatDate, formatDateTime } from "@vh5/utils";

formatDate(new Date()); // '2024-01-01'
formatDate(new Date(), "YYYY-MM-DD HH:mm"); // '2024-01-01 12:00'
formatDateTime(new Date()); // '2024-01-01 12:00:00'

缓存管理

StorageManager

带前缀和过期时间的 localStorage/sessionStorage 封装:

ts
import { StorageManager } from "@vh5/utils";

const storage = new StorageManager({ prefix: "my-app-" });

// 设置(带过期时间,单位毫秒)
storage.setItem("token", "xxx", 7 * 24 * 60 * 60 * 1000);

// 获取(过期自动返回 null)
const token = storage.getItem("token");

// 清除所有带前缀的 key
storage.clear();

// 清除所有过期项
storage.clearExpiredItems();

文件下载

ts
import { downloadFileFromUrl, downloadFileFromBase64, downloadFileFromBlob } from "@vh5/utils";

// 通过 URL 下载
await downloadFileFromUrl({ source: "https://example.com/file.pdf", fileName: "report.pdf" });

// 通过 Blob 下载
downloadFileFromBlob({ source: blob, fileName: "export.xlsx" });

// 通过 Base64 下载
downloadFileFromBase64({ source: base64String, fileName: "image.png" });

其他工具

函数说明
cloneDeep()深拷贝(lodash.clonedeep)
get() / set()对象路径读写(es-toolkit)
isEqual()深比较(es-toolkit)
diffObj()对象差异比较
generateTree()数组转树形结构
flatTree()树形结构展平
cn()合并 CSS 类名(clsx + tailwind-merge)
openWindow()安全打开新窗口
isUrl()URL 格式校验
unmountGlobalLoading()移除全局骨架屏

Released under the MIT License.