@aitu/utils
Opentu 项目的共享工具函数库,提供常用的工具函数和格式化方法。
功能模块
函数工具 (Function)
debounce
防抖函数,延迟执行函数调用。
import { debounce } from '@aitu/utils';
const debouncedFn = debounce((value: string) => {
console.log(value);
}, 300);
debouncedFn('hello'); // 300ms 后执行
throttle
节流函数,限制函数调用频率。
import { throttle } from '@aitu/utils';
const throttledFn = throttle((event: MouseEvent) => {
console.log(event);
}, 100);
window.addEventListener('scroll', throttledFn);
格式化工具 (Format)
formatFileSize
格式化文件大小为人类可读格式。
import { formatFileSize } from '@aitu/utils';
formatFileSize(1024); // "1 KB"
formatFileSize(1048576); // "1 MB"
formatFileSize(1073741824); // "1 GB"
formatDate
格式化时间戳为 YYYY-MM-DD HH:mm:ss 格式。
import { formatDate } from '@aitu/utils';
formatDate(Date.now()); // "2026-01-06 20:30:45"
formatDate(1704556800000); // "2024-01-06 20:00:00"
formatDuration
格式化毫秒数为可读的时长字符串。
import { formatDuration } from '@aitu/utils';
formatDuration(1000); // "1s"
formatDuration(65000); // "1m 5s"
formatDuration(3665000); // "1h 1m 5s"
字符串工具 (String)
sanitizeFilename
清理字符串使其适合作为文件名。
import { sanitizeFilename } from '@aitu/utils';
sanitizeFilename('Hello World! 你好世界'); // "Hello-World-你好世界"
sanitizeFilename('file@#$%name.txt', 20); // "filename.txt"
truncate
截断字符串到指定长度并添加省略号。
import { truncate } from '@aitu/utils';
truncate('Hello World', 5); // "Hello..."
truncate('Hello World', 20); // "Hello World"
truncate('Hello World', 8, '…'); // "Hello W…"
capitalize
首字母大写。
import { capitalize } from '@aitu/utils';
capitalize('hello world'); // "Hello world"
capitalize('HELLO'); // "HELLO"
toKebabCase
转换为 kebab-case 格式。
import { toKebabCase } from '@aitu/utils';
toKebabCase('HelloWorld'); // "hello-world"
toKebabCase('hello_world'); // "hello-world"
toKebabCase('Hello World'); // "hello-world"
toCamelCase
转换为 camelCase 格式。
import { toCamelCase } from '@aitu/utils';
toCamelCase('hello-world'); // "helloWorld"
toCamelCase('hello_world'); // "helloWorld"
toCamelCase('Hello World'); // "helloWorld"
颜色工具 (Color)
提供纯函数的颜色处理工具,支持 hex 颜色转换和透明度计算。
import {
applyOpacityToHex,
hexAlphaToOpacity,
removeHexAlpha,
isValidColor,
TRANSPARENT,
NO_COLOR,
WHITE
} from '@aitu/utils';
// 应用不透明度到 hex 颜色
applyOpacityToHex('#FF0000', 50); // "#FF000080" (50% 不透明度)
// 提取 hex 颜色的不透明度
hexAlphaToOpacity('#FF000080'); // 50
// 移除 alpha 通道
removeHexAlpha('#FF0000FF'); // "#FF0000"
// 颜色常量
console.log(TRANSPARENT); // "TRANSPARENT"
console.log(NO_COLOR); // "NO_COLOR"
console.log(WHITE); // "#FFFFFF"
日志工具 (Logger)
提供环境感知的日志工具,开发环境显示调试信息,生产环境仅显示警告和错误。
import { createLogger, logger } from '@aitu/utils';
// 创建命名空间日志器
const moduleLogger = createLogger('MyModule');
moduleLogger.debug('调试信息'); // 仅开发环境
moduleLogger.info('普通信息'); // 仅开发环境
moduleLogger.warn('警告信息'); // 始终显示
moduleLogger.error('错误信息'); // 始终显示
// 使用默认日志器
logger.debug('调试消息');
logger.error('发生错误');
异步工具 (Async)
Promise 和事件处理相关的工具函数。
import { isPromiseLike, composeEventHandlers } from '@aitu/utils';
// 类型守卫:检查值是否为 Promise
const value: unknown = fetchData();
if (isPromiseLike(value)) {
value.then(data => console.log(data));
}
// 组合多个事件处理器
const userHandler = (e) => console.log('用户处理');
const libHandler = (e) => console.log('库处理');
const composed = composeEventHandlers(userHandler, libHandler);
button.addEventListener('click', composed);
数组工具 (Array)
数组操作和转换的工具函数。
import { splitRows, chunk } from '@aitu/utils';
// 将数组分割为指定大小的行
const items = [1, 2, 3, 4, 5, 6, 7];
splitRows(items, 3); // [[1, 2, 3], [4, 5, 6], [7]]
// chunk 是 splitRows 的别名
chunk(items, 2); // [[1, 2], [3, 4], [5, 6], [7]]
TypeScript 类型工具 (Types)
TypeScript 类型推断辅助类型。
import type { ResolutionType, ValueOf } from '@aitu/utils';
// 提取 Promise 解析类型
async function fetchUser() {
return { id: 1, name: 'Alice' };
}
type User = ResolutionType<typeof fetchUser>; // { id: number; name: string }
// 提取对象值类型
const colors = {
red: '#FF0000',
blue: '#0000FF',
} as const;
type ColorValue = ValueOf<typeof colors>; // '#FF0000' | '#0000FF'
编码工具 (Encoding)
数据编码和格式转换工具。
import { base64ToBlob } from '@aitu/utils';
// 将 base64 data URL 转换为 Blob
const dataUrl = 'data:image/png;base64,iVBORw0KGgo...';
const blob = base64ToBlob(dataUrl);
// 使用 Blob 进行文件下载、上传等操作
const url = URL.createObjectURL(blob);
URL 工具 (URL)
URL 解析、域名检查和文件扩展名检测工具。
import {
isDomainMatch,
isVolcesDomain,
getFileExtension,
getHostname,
isDataURL,
isAbsoluteURL,
} from '@aitu/utils';
// 检查 URL 是否匹配特定域名模式
isDomainMatch('https://cdn.example.com/file.jpg', ['.example.com']);
// true
// 检查是否为火山引擎域名(专用函数)
isVolcesDomain('https://cdn.volces.com/video.mp4');
// true
// 从 URL 或 MIME 类型获取文件扩展名
getFileExtension('https://example.com/image.jpg');
// "jpg"
getFileExtension('data:image/svg+xml;base64,...');
// "svg"
getFileExtension('https://api.example.com/download/123', 'video/mp4');
// "mp4"
// 提取主机名
getHostname('https://www.example.com/path');
// "www.example.com"
// 检查是否为 data URL
isDataURL('data:image/png;base64,...');
// true
// 检查是否为绝对 URL
isAbsoluteURL('https://example.com/path');
// true
开发
# 安装依赖
pnpm install
# 类型检查
pnpm exec tsc --noEmit -p packages/utils
# 代码检查
pnpm exec eslint packages/utils/src
# 构建
pnpm exec nx build utils
# 运行测试
pnpm exec nx test utils
# 运行测试并生成覆盖率报告
cd packages/utils && pnpm exec vitest run --coverage
License
MIT