本文将详细介绍vue-aliplayer-v2组件从Vue2到Vue3的全面重构过程,分享技术选型与功能优化经验。前言
近期完成了开源项目vue-aliplayer-v2的重大升级,从Vue2组件全面重构为Vue3+TypeScript+Vite架构,同时针对阿里云新版Web播放器SDK新增了多项关键功能支持。
本次重构放弃了Vue2兼容方案,专注于提升组件质量与开发体验。旧项目仍可通过安装1.x版本继续使用,而v2版本将致力于打造更完善的播放器组件。
重构动机
作为阿里云Aliplayer Web SDK的Vue封装组件,旧版本已无法满足当前技术需求,主要面临以下问题:
Vue2插件架构不兼容Vue3项目
新版SDK需要License配置支持
资源路径迁移至imp-web-player
各类播放场景初始化逻辑不够明确
多实例管理机制不够完善
文档和示例不够详尽
TypeScript类型定义不完整
重构目标并非简单适配,而是重新规划组件边界,专注处理生命周期、资源加载等核心功能,播放能力仍由官方SDK实现。
技术架构
重构后的技术栈包括:
Vue 3
TypeScript
Vite
vue-tsc
Aliplayer Web SDK 2.37.0
构建输出分为两类:
dist/ GitHub Pages演示
lib/ npm包发布
Vite配置通过mode区分构建目标:
export default defineConfig(({ mode }) => {
const isDemoBuild = mode === 'demo'; return {
base: isDemoBuild ? '/vue-aliplayer-v2/' : '/',
plugins: [vue()],
publicDir: isDemoBuild ? 'public' : false,
build: isDemoBuild
? {
outDir: 'dist',
emptyOutDir: true
}
: {
outDir: 'lib',
emptyOutDir: false,
lib: {
entry: resolve(__dirname, 'packages/index.ts'),
name: 'VueAliplayerV2',
fileName: 'vue-aliplayer-v2'
},
rollupOptions: {
external: ['vue'],
output: {
exports: 'named',
globals: {
vue: 'Vue'
}
}
}
}
};
});
这种架构确保了演示页面与组件包的独立性,各司其职。
组件API设计
VueAliplayerV2组件支持全局注册与局部引入两种方式。
全局注册示例:
import { createApp } from 'vue';
import App from './App.vue';
import VueAliplayerV2 from 'vue-aliplayer-v2';const app = createApp(App);app.use(VueAliplayerV2, {
sdkVersion: '2.37.0'
});app.mount('#app');
局部使用示例:
import { reactive, ref } from 'vue';
import VueAliplayerV2, {
type AliplayerLicense,
type AliplayerOptions,
type VueAliplayerV2Expose
} from 'vue-aliplayer-v2';const playerRef = ref(null);const source = ref('//player.alicdn.com/video/aliyunmedia.mp4');const license = ref({
domain: 'example.com',
key: 'your-license-key'
});const options = reactive({
autoplay: true,
useH5Prism: true,
playsinline: true,
width: '100%',
height: '420px'
});function handleReady() {
playerRef.value?.play();
}function handleError(error: unknown) {
console.log('player error', error);
}function handleSdkError(error: Error) {
console.log('sdk load error', error.message);
}
播放器配置采用双层结构:
options参数透传至官方SDK
组件props封装常用功能