0.2.4 • Published 4 months ago
mstf-kit v0.2.4
mstf-kit
English | 简体中文
一个现代化的 JavaScript/TypeScript 工具库,提供了丰富的常用工具函数。
✨ 特性
- 📦 支持 Tree Shaking
- 🔧 TypeScript 支持
- 📚 完整的类型定义
- 🎯 模块化设计
- 💪 全面的测试覆盖
- 📝 详细的文档
- 🔒 代码混淆保护
📦 安装
npm install mstf-kit
# 或
yarn add mstf-kit
# 或
pnpm add mstf-kit
🚀 使用方法
// 导入所需的工具函数
import { formatDate, isEmail } from 'mstf-kit';
// 使用日期格式化
const date = formatDate(new Date(), 'YYYY-MM-DD');
console.log(date); // 2024-03-10
// 验证邮箱
const isValidEmail = isEmail('example@email.com');
console.log(isValidEmail); // true
按需导入
为了减小打包体积,推荐使用 tree-shaking 按需导入具体的工具函数:
// 只导入需要的函数
import { capitalize, truncate } from 'mstf-kit';
import { formatDate } from 'mstf-kit';
import { createLottiePlayer } from 'mstf-kit';
// 不要这样导入整个库
// import * as mstfKit from 'mstf-kit'; // ❌ 不推荐
现代打包工具(如 webpack、rollup、vite)会自动进行 tree-shaking,只打包您实际使用的代码。
📚 API 文档
🔤 字符串工具 (String Utils)
字符串处理相关的工具函数。
capitalize(str: string): string
- 首字母大写camelCase(str: string): string
- 转换为驼峰命名truncate(str: string, length: number): string
- 截断字符串
🔢 数字工具 (Number Utils)
数字处理和计算相关的工具函数。
formatNumber(num: number, locale?: string): string
- 数字格式化round(num: number, decimals?: number): number
- 四舍五入clamp(num: number, min: number, max: number): number
- 限制数字范围random(min: number, max: number, isInteger?: boolean): number
- 生成随机数percentage(value: number, total: number, decimals?: number): number
- 计算百分比
📋 数组工具 (Array Utils)
数组操作和处理的工具函数。
unique<T>(arr: T[]): T[]
- 数组去重groupBy<T>(arr: T[], key: string | ((item: T) => string)): Record<string, T[]>
- 数组分组flatten<T>(arr: any[], depth?: number): T[]
- 数组扁平化sample<T>(arr: T[], count?: number): T | T[]
- 随机采样shuffle<T>(arr: T[]): T[]
- 数组乱序closest(arr: number[], target: number): number
- 查找最接近的值
📦 对象工具 (Object Utils)
对象操作和处理的工具函数。
deepClone<T>(obj: T): T
- 深拷贝get(obj: any, path: string | string[], defaultValue?: any): any
- 获取嵌套属性set(obj: any, path: string | string[], value: any): void
- 设置嵌套属性pick<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K>
- 选择属性omit<T, K extends keyof T>(obj: T, keys: K[]): Omit<T, K>
- 排除属性merge<T>(...objects: T[]): T
- 对象合并
📅 日期工具 (Date Utils)
日期和时间处理的工具函数。
formatDate(date: Date | number | string, format?: string): string
- 日期格式化getRelativeTime(date: Date | number | string, now?: Date): string
- 相对时间getDateRange(start: Date | number | string, end: Date | number | string): Date[]
- 日期范围addTime(date: Date | number | string, amount: number, unit: string): Date
- 添加时间isSameDay(date1: Date | number | string, date2: Date | number | string): boolean
- 判断同一天
✅ 验证工具 (Validation Utils)
数据验证相关的工具函数。
isEmail(email: string): boolean
- 验证邮箱isChinesePhone(phone: string): boolean
- 验证手机号(中国大陆)isChineseIdCard(idCard: string): boolean
- 验证身份证号(中国大陆)isUrl(url: string): boolean
- 验证URLisIPv4(ip: string): boolean
- 验证IPv4地址validatePassword(password: string, options?: object): boolean
- 验证密码强度isSafeString(str: string): boolean
- 验证XSS安全
🎵 音频工具 (Audio Utils)
音频处理相关的工具函数。
createRecorder(options?: RecorderOptions): Promise<Recorder>
- 创建录音器blobToAudioBuffer(blob: Blob, context?: AudioContext): Promise<AudioBuffer>
- 将音频Blob转换为AudioBufferplayAudioBlob(blob: Blob): HTMLAudioElement
- 播放音频Blobbase64ToAudioBlob(base64: string, mimeType: string): Blob
- 将Base64音频数据转换为BlobaudioBlobToBase64(blob: Blob): Promise<string>
- 将音频Blob转换为Base64
录音器 API
录音器对象 (Recorder
) 提供以下方法:
start()
- 开始录音pause()
- 暂停录音resume()
- 恢复录音stop()
- 停止录音并获取完整音频数据cancel()
- 取消录音getState()
- 获取当前录音状态getDuration()
- 获取当前录音时长(秒)getAudioData()
- 获取实时音频分析数据getCurrentAudio()
- 获取当前已采集的音频数据(不停止录音)release()
- 释放资源
录音模式选择
录音器支持两种工作模式:
- 流式模式:边录制边获取数据片段,适用于实时语音识别、音频可视化等场景
- 非流式模式:只在录音结束后获取完整数据,适用于普通录音场景
通过以下参数控制录音模式:
isStreaming
: 显式指定是否使用流式模式(默认基于是否提供了onDataAvailable或timeslice自动判断)timeslice
: 流式模式下数据块间隔时间(毫秒)onDataAvailable
: 流式数据回调函数
基本录音示例
import { createRecorder } from 'mstf-kit';
async function startRecording() {
try {
// 创建录音器(非流式模式)
const recorder = await createRecorder({
format: 'wav', // 音频格式: 'wav', 'mp3', 'webm', 'ogg'
sampleRate: 44100, // 采样率 (Hz)
channelCount: 1, // 通道数量
bitRate: 128, // 比特率 (kbps)
echoCancellation: true, // 回声消除
noiseSuppression: true, // 噪声抑制
autoGainControl: true, // 自动增益
isStreaming: false // 非流式模式,只在 stop() 后获取完整录音
});
// 开始录音
await recorder.start();
// 5秒后停止录音
setTimeout(async () => {
// 停止录音并获取录音数据
const audioBlob = await recorder.stop();
// 创建音频URL
const audioUrl = URL.createObjectURL(audioBlob);
console.log('录音完成,音频URL:', audioUrl);
// 播放录音
const audio = new Audio(audioUrl);
audio.play();
// 释放资源
recorder.release();
}, 5000);
} catch (error) {
console.error('录音失败:', error);
}
}
流式录音示例
使用流式获取音频数据,适用于实时语音识别、音频可视化等场景:
import { createRecorder } from 'mstf-kit';
async function streamRecording() {
try {
// 创建带流式回调的录音器(显式指定流式模式)
const recorder = await createRecorder({
format: 'wav',
sampleRate: 16000, // 16kHz 采样率,适合语音识别
isStreaming: true, // 启用流式模式
// 每300毫秒获取一次数据块
timeslice: 300,
// 流式数据回调
onDataAvailable: async (blob) => {
// 实时处理数据,例如发送到语音识别API
console.log(`收到音频数据: ${blob.size} 字节`);
// 可以发送到后端进行实时处理
// await sendToSpeechRecognition(blob);
},
// 音频可视化处理
onAudioProcess: (audioData) => {
// 音频分析数据,可用于绘制波形图等
drawAudioVisualization(audioData);
}
});
// 开始录音
await recorder.start();
// 中途获取当前录音数据(不停止录音)
setTimeout(async () => {
const currentAudio = await recorder.getCurrentAudio();
console.log(`当前已录制 ${recorder.getDuration()} 秒,数据大小: ${currentAudio.size} 字节`);
}, 3000);
// 10秒后停止录音
setTimeout(() => {
recorder.stop().then(finalBlob => {
console.log(`录音完成,总大小: ${finalBlob.size} 字节`);
recorder.release();
});
}, 10000);
} catch (error) {
console.error('录音失败:', error);
}
}
// 示例:绘制音频可视化
function drawAudioVisualization(audioData) {
// 使用Canvas或其他方式可视化音频数据
const canvas = document.getElementById('audio-canvas');
const ctx = canvas.getContext('2d');
// 清空画布
ctx.clearRect(0, 0, canvas.width, canvas.height);
// 绘制频谱
const barWidth = (canvas.width / audioData.length) * 2.5;
let x = 0;
for (let i = 0; i < audioData.length; i++) {
const barHeight = audioData[i] / 255 * canvas.height;
// 使用渐变色
const gradient = ctx.createLinearGradient(0, 0, 0, canvas.height);
gradient.addColorStop(0, '#5cf');
gradient.addColorStop(1, '#06c');
ctx.fillStyle = gradient;
ctx.fillRect(x, canvas.height - barHeight, barWidth, barHeight);
x += barWidth + 1;
}
}
服务器集成示例
将录音功能与服务器集成,可实现实时语音识别、音频处理等高级功能。
我们提供了详细的服务器集成指南,包括基于REST API和WebSocket的不同实现方式,以及Node.js和Python的服务器端示例代码:
主要集成方式:
- REST API模式:使用HTTP请求定期发送音频数据块,适合已有RESTful架构的系统
- WebSocket模式:使用WebSocket实现真正的实时音频流传输,适合需要低延迟的应用场景
服务器端实现支持:
- Node.js实现(基于Express)
- Python实现(基于FastAPI)
服务器集成指南中包含完整的客户端和服务器端代码示例,以及最佳实践和常见问题解决方案。
🔊 音频播放器
mstf-kit
提供了功能强大的音频播放工具,支持背景播放和页面渲染两种模式:
背景播放模式
import { createAudioPlayer, playAudio } from 'mstf-kit';
// 简易播放方式
const audioBlob = new Blob([...]); // 音频数据
const player = await playAudio(audioBlob, {
volume: 0.8,
loop: true
});
// 或使用完整API
const backgroundPlayer = createAudioPlayer();
await backgroundPlayer.load('https://example.com/audio.mp3');
await backgroundPlayer.play();
// 控制播放
backgroundPlayer.pause();
backgroundPlayer.setVolume(0.5);
backgroundPlayer.seek(30); // 跳转到30秒位置
页面渲染模式
import { createAudioPlayer, AUDIO_FORMATS } from 'mstf-kit';
// 创建一个带UI界面的播放器
const uiPlayer = createAudioPlayer({
renderUI: true, // 启用UI渲染
container: '#player-box', // 指定容器元素
theme: 'dark', // 使用暗色主题
showVisualization: true, // 显示音频可视化
visualizationType: 'bars' // 使用柱状频谱图
});
// 加载音频
await uiPlayer.load(audioBlob);
await uiPlayer.play();
// 播放结束后的回调
uiPlayer.onEnded = () => {
console.log('播放完成');
};
// 不需要时释放资源
uiPlayer.destroy();
Vue 集成
与 Vue3 框架无缝集成,支持直接使用 ref 作为容器:
import { ref, onMounted, onUnmounted } from 'vue';
import { createAudioPlayer } from 'mstf-kit';
export default {
setup() {
// 创建容器引用
const playerContainer = ref(null);
let audioPlayer = null;
onMounted(async () => {
// 创建播放器并使用ref作为容器
audioPlayer = createAudioPlayer({
renderUI: true,
container: playerContainer, // 直接传入ref
theme: 'dark',
showVisualization: true
});
// 加载并播放音频
await audioPlayer.load('/audio/example.mp3');
await audioPlayer.play();
});
// 组件卸载时清理资源
onUnmounted(() => {
if (audioPlayer) {
audioPlayer.destroy();
}
});
return { playerContainer };
}
}
可视化类型
播放器支持三种可视化类型:
waveform
: 波形图显示bars
: 频谱柱状图circle
: 圆形频谱图
支持的主题
default
: 默认主题(浅色)dark
: 暗色主题minimal
: 简约主题(透明背景)
🎭 Lottie动画
mstf-kit
支持 Lottie 动画的加载、渲染和控制,可以轻松地在您的应用中展示高质量的矢量动画。
基本使用
import { createLottiePlayer, playLottie } from 'mstf-kit';
// 快速加载并播放Lottie动画
const player = await playLottie(
'https://assets.lottiefiles.com/packages/lf20_UJNc2t.json',
'#animation-container',
{ loop: true, speed: 1.5 }
);
// 或使用完整API
const lottiePlayer = await createLottiePlayer({
container: '#animation-container',
renderer: 'canvas', // dotlottie-web 使用 canvas 渲染
loop: true,
autoplay: true
});
// 加载动画
await lottiePlayer.load('https://assets.lottiefiles.com/packages/lf20_UJNc2t.json');
// 控制动画
lottiePlayer.pause();
lottiePlayer.setSpeed(2.0);
lottiePlayer.play();
Vue 集成
与 Vue3 框架无缝集成,支持直接使用 ref 作为容器:
import { ref } from 'vue';
import { playLottie } from 'mstf-kit';
export default {
setup() {
// 创建容器引用
const animationContainer = ref(null);
// 加载动画(在onMounted中)
onMounted(async () => {
const player = await playLottie(
'https://assets.lottiefiles.com/packages/lf20_UJNc2t.json',
animationContainer,
{ loop: true }
);
});
return { animationContainer };
}
}
多种库加载模式
支持多种加载方式:
// 默认使用内置的 dotlottie-web
const player1 = await createLottiePlayer({
container: '#animation-container',
loop: true
});
// 使用自定义外部库
import customLottieLib from 'custom-lottie-lib';
const player2 = await createLottiePlayer({
container: '#animation-container',
libOptions: {
source: 'external',
externalLib: customLottieLib
}
});
// 从CDN加载
const player3 = await createLottiePlayer({
container: '#animation-container',
libOptions: {
source: 'cdn',
cdnURL: 'https://cdn.jsdelivr.net/npm/@lottiefiles/dotlottie-web/+esm'
}
});
渲染模式
Lottie播放器默认使用Canvas渲染模式,提供高性能的动画播放体验。
动画控制
播放器支持丰富的控制方法:
// 播放控制
player.play();
player.pause();
player.stop();
// 播放速度和方向
player.setSpeed(1.5); // 1.5倍速
player.setDirection(-1); // 反向播放
// 跳转控制
player.goToFrame(24); // 跳转到第24帧
player.goToAndPlay(24); // 跳转并播放
player.setSegment(10, 50); // 只播放10-50帧
// 循环控制
player.setLoop(true); // 无限循环
player.setLoop(3); // 循环3次
// 动画信息
console.log(`总帧数: ${player.getTotalFrames()}`);
console.log(`当前帧: ${player.getCurrentFrame()}`);
console.log(`时长: ${player.getDuration()}ms`);
console.log(`是否播放中: ${player.isPlaying()}`);
// 资源释放
player.destroy();
高级特性
- 小巧高效: 使用 dotlottie-web 库,体积更小,性能更好
- 多种库来源: 支持内置库(默认)、CDN加载或外部提供的自定义库
- Vue框架支持: 无缝支持Vue3的ref作为容器引用
- 多种来源: 支持从URL、JSON字符串或对象加载动画
- 动画事件: 提供丰富的回调函数,可监听动画状态变化
- 响应式: 通过
resize()
方法支持自适应容器大小