vite2-electron-douyin 基于vite2.x+electron模仿抖音短视频应用实例。

整合了vite2+electron跨端开发技术仿制抖音界面桌面版exe应用软件。基于Vite2.x+Electron12+Vant3+Swiper6+V3popup等技术开发实现,支持键盘上下键切换短视频、新开多窗口等功能。

技术栈

  • 编码/技术:vscode / vue3.0 + vuex4 + vue-router@4
  • 组件库:vant3 (有赞移动端vue3组件库)
  • 滑动组件:swiper^6.5.0
  • 弹窗组件:v3popup(基于vue3.0自定义弹层)
  • 打包工具:electron-builder
  • iconfont图标:阿里字体图标库

项目结构目录

项目整合了vite2和electron技术,实现跨平台开发应用。短视频|直播页面滑动切换效果,使用的是swiper组件来实现。

Electron主进程入口文件

使用vue-cli-plugin-electron-builder构建的项目,根目录会有一个background.js入口文件。

/*** 主进程配置文件*/'use strict'import { app, protocol, BrowserWindow, globalShortcut } from 'electron'
import { createProtocol } from 'vue-cli-plugin-electron-builder/lib'
// import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer'import Windows from './module/windows'const isDevelopment = process.env.NODE_ENV !== 'production'protocol.registerSchemesAsPrivileged([{ scheme: 'app', privileges: { secure: true, standard: true } }
])async function createWindow() {let window = new Windows()window.listen()window.createWin({isMainWin: true, resize: false})window.createTray()
}// Quit when all windows are closed.
app.on('window-all-closed', () => {// On macOS it is common for applications and their menu bar// to stay active until the user quits explicitly with Cmd + Qif (process.platform !== 'darwin') {app.quit()}
})app.on('activate', () => {// On macOS it's common to re-create a window in the app when the// dock icon is clicked and there are no other windows open.if (BrowserWindow.getAllWindows().length === 0) createWindow()
})// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', async () => {if (isDevelopment && !process.env.IS_TEST) {// Install Vue Devtools// try {//   await installExtension(VUEJS_DEVTOOLS)// } catch (e) {//   console.error('Vue Devtools failed to install:', e.toString())// }}createWindow()
})// Exit cleanly on request from parent process in development mode.
if (isDevelopment) {if (process.platform === 'win32') {process.on('message', (data) => {if (data === 'graceful-exit') {app.quit()}})} else {process.on('SIGTERM', () => {app.quit()})}
}

渲染页面入口配置main.js

/*** 渲染进程页面配置*/import { createApp } from 'vue'
import App from './App.vue'// 引入Router及Vuex
import Router from './router'
import Store from './store'// 引入公用组件
import Plugins from './plugins'import { winCfg, loadWin } from './module/actions'// 引入Js
import '@/assets/js/fontSize'// 引入公用样式
import '@/assets/fonts/iconfont.css'
import '@/assets/css/reset.css'
import '@/assets/css/layout.css'loadWin().then(args => {winCfg.window = argscreateApp(App).use(Router).use(Store).use(Plugins).mount('#app')
})

Electron自定义拖拽区域+Tabbar组件

项目整体采用无边框模式 frame: false,css3中设置 -webkit-app-region: drag 即可实现自定义拖拽区域。

<WinBar bgcolor="transparent" transparent><template #wbtn><a class="wbtn" title="二维码名片" @click="isShowPersonalCard=true"><i class="iconfont icon-erweima"></i></a><a class="wbtn" title="设置" @click="isShowSideMenu=true"><i class="iconfont icon-menu"></i></a></template>
</WinBar><WinBar bgcolor="linear-gradient(to right, #36384a, #36384a)"><template #title>视频预览</template><template #wbtn><a class="wbtn" title="另存为" @click="handleDownLoad"><i class="iconfont icon-down"></i></a></template>
</WinBar>

底部tabbar组件采用整屏透明效果。

<tabbar bgcolor="linear-gradient(to bottom, transparent, rgba(0,0,0,.75))"color="rgba(245,255,235,.75)"activeColor="#fa367a"fixed
/>

Electron仿QQ托盘图标+闪烁

createTray() {const trayMenu = Menu.buildFromTemplate([{label: '我在线上', icon: path.join(__dirname, '../resource/icon-online.png'),click: () => null},{label: '隐身', icon: path.join(__dirname, '../resource/icon-invisible.png'),click: () => null},{type: 'separator'},{label: '关闭消息闪动', click: () => {this.flashTray(false)}},{type: 'separator'},{label: '显示窗口', click: () => {try {for(let i in this.winLs) {let win = this.getWin(i)if(!win) returnif(win.isMinimized()) win.restore()win.show()}} catch (error) {console.log(error)}}},{label: '退出', click: () => {try {for(let i in this.winLs) {let win = this.getWin(i)if(win) win.webContents.send('win-logout')}app.quit()} catch (error) {console.log(error)}}},])this.tray = new Tray(this.trayIco1)this.tray.setContextMenu(trayMenu)this.tray.setToolTip(app.name)
}

flashTray(true|false)  即可实现开启/停止闪烁效果。

Electron+Vue3弹窗组件

项目中使用到的弹窗效果,分为electron桌面端弹窗和vue3自定义弹窗组件两种实现方式。

createWin({title: '关于',route: '/about',width: 420,height: 320,resize: false,parent: winCfg.window.id,modal: true,
})
<v3-popup v-model="isShowLogoutSys" anim="footer" type="actionsheet"content="<span><i class='iconfont icon-info c-46b6ef'></i> 确定要退出当前账号吗?</span>":btns="[{text: '退出登录', style: 'color:#fa367a;', click: logoutSys},{text: '取消', click: () => isShowLogoutSys=false},]"
>
</v3-popup>

具体的实现方式,大家可以去看看下面这两篇文章,这里就不详细介绍了。

https://www.cnblogs.com/xiaoyan2017/p/14210820.html

https://www.cnblogs.com/xiaoyan2017/p/14403820.html

Vite2+Electron打包配置

在根目录新建一个electron-builder.json文件,用来配置一些electron打包参数。

/*** @Desc     vite2+electron打包配置* @Time     andy by 2021-03* @About    Q:282310962  wx:xy190310*/{"productName": "electron-douyin", //项目名称 打包生成exe的前缀名"appId": "com.example.electrondouyin", //包名"compression": "maximum", //store|normal|maximum 打包压缩情况(store速度较快)"artifactName": "${productName}-${version}-${platform}-${arch}.${ext}", //打包后安装包名称// "directories": {//     "output": "build", //输出文件夹(默认dist_electron)// },"asar": false, //asar打包// 拷贝静态资源目录到指定位置(如根目录下的static文件夹会拷贝至打包后的dist_electron/win-unpacked/resources/static目录)"extraResources": [{"from": "/static","to": "static"},],"nsis": {"oneClick": false, //一键安装"allowToChangeInstallationDirectory": true, //允许修改安装目录"perMachine": true, //是否开启安装时权限设置(此电脑或当前用户)"artifactName": "${productName}-${version}-${platform}-${arch}-setup.${ext}", //打包后安装包名称"deleteAppDataOnUninstall": true, //卸载时删除数据"createDesktopShortcut": true, //创建桌面图标"createStartMenuShortcut": true, //创建开始菜单图标"shortcutName": "ElectronDouYin", //桌面快捷键图标名称},"win": {"icon": "/static/shortcut.ico", //图标路径}
}

注意

  • 项目路径最好不要有中文,否则打包可能会报错。
  • 最好不要使用getCurrentInstance来操作router或store,打包会报错。
  • vite.js+electron构建的项目,在渲染进程中.vue页面,调用ipcRendererremote会报如下错误

Uncaught TypeError: fs.existsSync is not a function

可在webPreferences中配置preload来解决。

webPreferences: {contextIsolation: false,nodeIntegration: false, // 启用Node集成preload: path.join(__dirname, '../resource/preload.js'),webSecurity: false,enableRemoteModule: true, // 是否启用远程模块
}

ok,以上就是vite2+electron+vant3跨端仿抖音短视频的分享,希望大家喜欢哈!

最后附上一个Vue3+Electron跨平台聊天应用

https://blog.csdn.net/yanxinyun1990/article/details/114162969

整合vite2.0+electron12+vant3.x跨端仿抖音短视频+聊天+直播exe应用相关推荐

  1. 从零搭建仿抖音短视频APP-后端开发短视频业务模块(1)

    项目持续更新中: 仿抖音短视频APP专栏 目录 发布短视频的流程梳理 传统上传流程 传统上传 CDN上传 CDN上传流程 使用Unicloud云端功能 实现app端视频上传 保存视频信息入库 发布短视 ...

  2. 从零开始搭建仿抖音短视频APP-后端开发消息业务模块(1)

    项目持续更新中: 仿抖音短视频APP专栏 目录 保存系统消息到MongoDB 系统消息入库保存-关注 系统消息入库保存-点赞短视频 系统消息入库保存-评论与回复 保存系统消息到MongoDB 我们把m ...

  3. 从零开始搭建仿抖音短视频APP-后端消息业务模块开发(2)-基础版完结篇

    项目持续更新中: 仿抖音短视频APP专栏 目录 系统消息入库保存 MongoDB分页查询系统消息列表 删除系统消息 系统消息入库保存 这里还剩下最后一个点赞评论没有完成 这里如果点赞了你的评论,你们视 ...

  4. 从零开始搭建仿抖音短视频APP-后端开发短视频业务模块(3)

    项目持续更新中: 仿抖音短视频APP专栏 目录 视频详情页展示的数据层实现 视频详情页展示的api实现 短视频下载.复制连接.二维码展示 视频保存到相册 复制链接 二维码展示 实现转为私密或公开视频 ...

  5. 从零开始搭建仿抖音短视频APP--后端开发粉丝业务模块(3)

    项目持续创作中: 仿抖音短视频APP专栏 目录 实现用户点赞视频 用户取消点赞 用户是否点赞视频的判断 实现用户点赞视频 用户在点赞我们的视频后,我们需要去实现一些相关的业务, 这里需要对应到数据库的 ...

  6. 从零开始搭建仿抖音短视频APP--后端开发粉丝业务模块(1)

    项目持续更新中: 仿抖音短视频APP专栏 目录 关注短视频博主 Redis技术妙用 取消关注博主 关注短视频博主 在我们的主页中,刷视频时是可以在头像下方进行一个关注 点击头像,进入对方的主页也是可以 ...

  7. 从零快速搭建仿抖音短视频APP-后端开发粉丝业务模块(4)

    项目持续更新中: 仿抖音短视频APP专栏 目录 视频页点赞总数 用户页点赞视频列表展示 我的关注视频列表展示 互粉朋友视频瀑布列表展示 视频页点赞总数 在我们的点赞下面会有一个数字,代表点赞总数.我们 ...

  8. 从零开始搭建仿抖音短视频APP-后端开发粉丝业务模块(2)

    项目持续更新中: 防抖音短视频APP项目专栏 目录 判断用户是否关注博主 我的关注列表 我的粉丝列表 实现互粉标记显示 判断用户是否关注博主 在这里我们对这个人进行关注之后,重新退出界面再次进入,并没 ...

  9. 市面售价2W的仿抖音短视频原生双端APP源码,带技术文档管理后台和数据库

    这个短视频系统源码是2w某站购买来的仿抖音视频app,原生双端开发,带技术文档管理后台和数据库.非常适合用来做类似项目的基础开发框架,能节省大量的开发时间和试错成本. 除了直播没有开通,其他功能都是精 ...

最新文章

  1. 常见的和端口,IP相关的企业面试题
  2. ubuntu18安装很慢_双硬盘装Win 10+Ubuntu 18.04双系统中的一些坑
  3. 4测试命令_科普 | 最全的Filecoin测试网挖矿步骤解析
  4. 程序员面试系列——单链表的反转
  5. ae多线程渲染工具:BG Renderer MAX for Mac(AE插件)
  6. FTP服务器管理和配置
  7. log4j.properties配置与将异常输出到Log日志文件实例
  8. 什么是冷区热区_墙角装个小柜子 冷区立马变热区 有颜值还实用!
  9. 9、两个栈实现队列(Python)
  10. 编译单元为什么只能有一个public类
  11. 我的世界java版种子多村庄_我的世界:粉丝推荐新版种子,出生附近就有11个村庄2个沙漠神殿...
  12. windows驱动开发 DDK/WDK/WDM/WDF区别
  13. 计算机一级ps怎么保存,2017年计算机等考一级PS辅导:PS图像格式详细解说
  14. 青果教务管理系统存储型XSS 一枚
  15. MacOS系统通过命令行启动Chrome浏览器并添加启动参数
  16. javascript原生脚本代码 飘浮广告
  17. 杭州卧兔:全球品牌出海峰会大咖集聚讲述品牌出海关键要素
  18. Android Studio开发:简单的登录注册界面
  19. CALIPSO数据批量下载方法
  20. 语音识别ASR和NLP有什么区别?

热门文章

  1. pku 1673 EXOCENTER OF A TRIANGLE
  2. 关于online judge系统
  3. 拼接 sql 防注入
  4. 小米平板5.0以上系统如何不root激活xposed框架的经验
  5. {软件设计师之路}程序员道路的经验之谈
  6. 怎么换账号服务器地址,用户如何更换云服务器的ip?
  7. linux支行压缩的文件系统,Linux第八章:文件,文件系统的压缩,打包备份
  8. div布局——简单视频播放的页面
  9. C#事件与委托详解【精华 多看看】--转载于https://www.cnblogs.com/sjqq/p/6917497.html
  10. ubuntu搭建wordPress