Skip to content

Latest commit

 

History

History
156 lines (120 loc) · 4.4 KB

File metadata and controls

156 lines (120 loc) · 4.4 KB

Meting 架构重构说明

重构概述

本次重构将原本单一文件中的不同音乐厂商逻辑抽离到独立的 Provider 文件中,采用了标准的 Provider 模式,提高了代码的可维护性和扩展性。

新架构结构

src/
├── meting.js                 # 主入口文件(重构后)
├── meting-original.js       # 原始文件备份
└── providers/               # 音乐平台提供者目录
    ├── index.js            # Provider 工厂类
    ├── base.js             # 基础 Provider 接口
    ├── netease.js          # 网易云音乐 Provider
    ├── tencent.js          # 腾讯音乐 Provider
    ├── kugou.js            # 酷狗音乐 Provider
    ├── baidu.js            # 百度音乐 Provider
    └── kuwo.js             # 酷我音乐 Provider

架构优势

1. 单一职责原则

  • 每个 Provider 只负责一个音乐平台的逻辑
  • 主 Meting 类只负责协调和通用功能

2. 开放封闭原则

  • 添加新平台只需创建新的 Provider,无需修改现有代码
  • 修改某个平台的逻辑不会影响其他平台

3. 内部闭环设计

  • 每个 Provider 内部处理自己的编码/解码逻辑
  • 避免了主类中的方法映射和统一处理
  • 真正实现了平台逻辑的完全隔离

4. 代码组织清晰

  • 每个文件职责明确,便于维护
  • 相关功能聚合在一起
  • 版本号在构建时从 package.json 注入,避免运行时文件读取

核心组件

BaseProvider 基础类

所有平台 Provider 的基础接口,定义了标准的方法:

  • getHeaders(): 获取请求头配置
  • search(): 搜索功能
  • song(): 获取歌曲详情
  • album(): 获取专辑信息
  • artist(): 获取艺术家作品
  • playlist(): 获取播放列表
  • url(): 获取播放链接
  • lyric(): 获取歌词
  • pic(): 获取封面图片
  • format(): 数据格式化
  • encode(): 请求编码(如需要)
  • urlDecode(): URL解码(如需要)
  • lyricDecode(): 歌词解码(如需要)

ProviderFactory 工厂类

负责创建和管理 Provider 实例:

  • create(platform, meting): 创建指定平台的 Provider
  • getSupportedPlatforms(): 获取支持的平台列表
  • isSupported(platform): 检查平台是否支持

主 Meting 类

协调各个 Provider,提供统一的 API 接口:

  • 保持原有的公共 API 不变
  • 简化为纯粹的协调者角色
  • 将具体执行逻辑完全委托给 Provider
  • 版本号在构建时注入,无运行时开销

使用方式

重构后的使用方式与原版完全兼容:

import Meting from './src/meting.js';

// 创建实例
const meting = new Meting('netease');

// 或者动态切换平台
meting.site('tencent');

// 使用 API(与原版完全相同)
const result = await meting.search('稻香');

扩展新平台

添加新平台只需要:

  1. src/providers/ 下创建新的 Provider 文件
  2. 继承 BaseProvider 并实现所需方法
  3. src/providers/index.js 中注册新 Provider

示例:

// src/providers/newplatform.js
import BaseProvider from './base.js';

export default class NewPlatformProvider extends BaseProvider {
  constructor(meting) {
    super(meting);
    this.name = 'newplatform';
  }

  getHeaders() {
    // 实现平台特定的请求头
  }

  search(keyword, option = {}) {
    // 实现搜索逻辑
  }

  // ... 实现其他必需方法
}

构建系统

Rollup 构建配置

  • 使用自定义插件在构建时注入版本号
  • 源码中使用 __VERSION__ 占位符
  • 构建时自动替换为 package.json 中的实际版本
  • 避免运行时文件系统读取,提升性能

构建流程

npm run build  # 构建 ESM 和 CJS 两种格式

构建后:

  • lib/meting.esm.js - ES Module 格式
  • lib/meting.js - CommonJS 格式

兼容性

  • ✅ 保持原有 API 接口不变
  • ✅ 保持原有使用方式不变
  • ✅ 保持原有功能特性不变
  • ✅ 支持原有的链式调用
  • ✅ 支持原有的配置方法
  • ✅ 构建时版本号注入,无运行时开销

测试验证

已通过以下测试:

  • 基础功能测试(test/test.js
  • 架构验证测试(test/simple-test.js
  • 版本号注入测试(test/build-version-test.js
  • 各平台 Provider 测试

重构成功保持了所有原有功能,同时大大提升了代码的可维护性和扩展性,并优化了运行时性能。