svelte-webchat:基于svelte3+svelteKit仿微信mac网页版聊天实战案例。

采用了最新前端svelte.js框架,基于svelte3+svelteKit+sass+svelteLayer+svelteScroll等技术开发仿微信网页端聊天项目。整体虚化背景UI质感,全新的Dock可左右滚动菜单。


svelte-webchat 支持发送消息+emoj、图片/视频/链接预览、拖拽+粘贴截图发送图片、红包/朋友圈、主题换肤等功能。


运用技术

  • 前端框架:svelte^3.46.5+svelteKit
  • 状态管理:svelte/store
  • 下拉组件:mescroll.js
  • 自定义滚动条:svelte-scrollbar
  • 自定义弹窗:svelte-layer
  • sass/less预处理:sass^1.50+svelte-preprocess


项目中的滚动条是基于svelte.js开发的自定义组件svelte-scrollbar实现功能。

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


而各种弹窗效果,则是基于svelte.js开发的自定义弹窗组件svelte-layer实现功能。
https://blog.csdn.net/yanxinyun1990/article/details/124240717

项目结构目录

预览




svelte公共布局

项目整体分为左侧+右侧主体内容+底部dock菜单三大模块。

<div class="sv__container flexbox flex-alignc flex-justifyc" style="--themeSkin: {$skin}"><div class="sv__wrapper" class:maximize={$isWinMaximize}>{#if $userinfo}<div class="sv__board flexbox flex-col"><!-- <div class="sv__topbar">顶部模块</div> --><div class="sv__mainwrap flex1 flexbox"><!-- <div class="sv__sidebar">侧边栏</div> --><Middle /><div class="sv__mainbx flex1 flexbox flex-col"><Winbar /><slot /></div></div><Dock /></div>{:else}<div class="sv__board flexbox flex-col"><div class="sv__mainwrap flex1 flexbox"><slot /></div></div>{/if}</div>
</div>

通过svelte/store自定义状态管理,判断是否登录拦截。

<script>import { onMount } from 'svelte'import { page } from '$app/stores'import { goto } from '$app/navigation'import { userinfo, isWinMaximize, skin } from '@/store/index.js'import Middle from '@/layout/Middle/index.svelte'import Winbar from '@/layout/Winbar.svelte'import Dock from '@/layout/Dock.svelte'let whiteRoute = ['/auth/login', '/auth/register']onMount(() => {userinfo.useStorage()isWinMaximize.useStorage()skin.useStorage()if(!$userinfo) {goto('/auth/login')}else {if(whiteRoute.includes($page.url.pathname)) {goto('/')}else {goto($page.url.pathname)}}})
</script>

新建一个 store/index.js 文件。

/*** Svelte状态管理
*/import { writable } from 'svelte/store'
import Storage from "@/utils/storage"const createStore = (key) => {const { subscribe, set, update } = writable(typeof window !== 'undefined' ? Storage.get(key) : null)return {// 持久化存储useStorage: () => {const data = Storage.get(key)if(data) {set(JSON.parse(data))}// 订阅subscribe(val => {[null, undefined].includes(val) ? Storage.del(key) : Storage.set(key, JSON.stringify(val))})},subscribe,set,update,}
}// 用户信息
export const userinfo = createStore('userinfo')
// 窗口是否最大化
export const isWinMaximize = createStore('isWinMaximize')
// 侧边栏收缩
export const isMidCollapsed = createStore('isMidCollapsed')
// 窗口皮肤
export const skin = createStore('skin')



svelte实现dock菜单


dock菜单支持path: '/friends'路径跳转,自定义img图片和iconfont图标、红底圆点提醒等功能。
还支持拖拽图标、左右滚动滑动切换。

<div class="sv__dockbar flexbox flex-justifyc"><div class="sv__dock-scroll" style="background: {bgcolor};"><Scrollbar autohide size={2} mousewheel><div class="sv__dock-wrap" bind:this={dockEl}><!-- dock菜单项 -->{#each menu as item,index}{#if item.type == 'divider'}<div class="sv__dock-divider"></div>{:else}<div class="sv__dock-item flexbox" class:cur={currentTabIndex == index} id={item.id || 'dock'+index} role="{item.title}" style="color: {currentTabIndex == index ? activeColor : color}" on:click={changeTab(index, item)}>{#if item.icon}<span class="iconfont {item.icon}" style="color: {item.color}; font-size: {item.iconSize}">{item.icon.charAt(1) == '' ? item.icon : ''}</span>{/if}{#if item.img}<img class="iconimg" src={item.img} alt="" style="font-size: {item.iconSize};" />{/if}{#if item.badge}<span class="sv__badge sv__dock-badge">{item.badge}</span>{/if}{#if item.dot}<span class="sv__badge-dot sv__dock-badgeDot"></span>{/if}</div>{/if}{/each}</div></Scrollbar></div>
</div>


聊天编辑框支持光标处插入内容,粘贴截图发送图片功能。

监听系统paste事件

editorEl.addEventListener('paste', function(e) {e.preventDefault()let cbd = e.clipboardDatalet ua = window.navigator.userAgentif(!(e.clipboardData && e.clipboardData.items)) returnif(cbd.items && cbd.items.length === 2 && cbd.items[0].kind === "string" && cbd.items[1].kind === "file" &&cbd.types && cbd.types.length === 2 && cbd.types[0] === "text/plain" && cbd.types[1] === "Files" &&ua.match(/Macintosh/i) && Number(ua.match(/Chrome\/(\d{2})/i)[1]) < 49){return;}for(var i = 0; i < cbd.items.length; i++) {var item = cbd.items[i]// console.log(item)// console.log(item.kind)if(item.kind == 'file') {var blob = item.getAsFile()if(blob.size === 0) return// 读取图片记录var reader = new FileReader()reader.readAsDataURL(blob)reader.onload = function() {var imgpath = this.result// 返回图片给父组件dispatch('paste', imgpath)}}}
})


拖拽上传实现

/* ############# { 拖拽上传模块 } ############# */function handleDragEnter(e) {e.stopPropagation()e.preventDefault()}function handleDragOver(e) {e.stopPropagation()e.preventDefault()}function handleDrop(e) {e.stopPropagation()e.preventDefault()handleFileList(e.dataTransfer)}// 拖拽文件列表function handleFileList(filelist) {let files = filelist.filesif(files.length >= 2) {svLayer.message({content: '暂时支持拖拽一张图片', icon: 'error', time: 0, xclose: true, shade: true})return false}for(let i = 0; i < files.length; i++) {if(files[i].type != '') {handleFileAdd(files[i])}else {svLayer.message({content: '目前不支持文件夹拖拽功能', icon: 'error', time: 0, xclose: true, shade: true})}}}function handleFileAdd(file) {let len = msgList.length// 消息队列let msgArr = {id: `msg_${++len}`,msgtype: 5,isme: true,avatar: '/uimg/img-avatar08.jpg',author: 'Hison',msg: '',imgsrc: '',videosrc: ''}if(file.type.indexOf('image') == -1) {svLayer.message({content: '目前不支持非图片拖拽功能', icon: 'error', time: 0, xclose: true, shade: true})}else {let reader = new FileReader()reader.readAsDataURL(file)reader.onload = async function() {let img = this.resultmsgArr.imgsrc = imgmsgList = msgList.concat(msgArr)await tick()scrollBottom()}}}

OK,基于svelte.js+svelteKit开发网页聊天项目就分享到这里哈~~

最后附上两个最新实例项目

  • uniapp+uview仿抖音app聊天实例
    https://blog.csdn.net/yanxinyun1990/article/details/120387832

  • vite+vue3+electron中后台管理系统平台
    https://blog.csdn.net/yanxinyun1990/article/details/116936475

基于svelte3+sass仿微信网页版聊天|svelte.js 桌面聊天实例SvelteWebChat相关推荐

  1. php++仿网页版微信,vue+web端仿微信网页版聊天室功能

    一.项目介绍 基于Vue2.5.6+Vuex+vue-cli+vue-router+vue-gemini-scrollbar+swiper+elementUI等技术混合架构开发的仿微信web端聊天室- ...

  2. vue-cli脚手架集成websocket客户端实现高仿微信网页版在线聊天

    本次需求 做一个高仿微信网页版在线聊天系统,好友相互之间进行单聊 技术支持 springboot服务端提供websocket服务端连接 vue-cli提供websocket客户端与后端进行连接 实现效 ...

  3. springboot+netty 仿微信网页版聊天工具

    本程序仿照微信界面进行开发,使用springboot+netty完成整体的框架开发,数据库方面使用h2数据库,前端部分使用thymeleaf,后期将会继续开发Ant Design React版.打包时 ...

  4. vue+h5仿微信网页版聊天室vueWebChat项目

    很早之前就有使用html5技术开发过一个web版仿微信.微博聊天,后来想着用vue技术开发一版,后面由于各种事情,一直没能落定.最近有些空闲就使用vue开发了一个vueWechat聊天室IM项目. 基 ...

  5. Spring+Netty+Vue 网页版聊天应用,仿微信网页版聊天

    1:前言 最近在学习网络知识,对于java开发来说,Netty是一个非常重要的框架,无论是为了面试还是日常工作中,如RPC框架Dubbo底层其实是用了Netty, 又或者我们的聊天通信功能,都可能有N ...

  6. vue仿微信网页版|vue+web端聊天室|仿微信客户端vue版

    一.项目介绍 基于Vue2.5.6+Vuex+vue-cli+vue-router+vue-gemini-scrollbar+swiper+elementUI等技术混合架构开发的仿微信web端聊天室- ...

  7. 基于.Net平台C#的微信网页版API

    git上有很多类似的项目,但大多都是python和js的,为了便于.Net windows平台的使用,我重构了一个.Net版本的,已整理开源 https://github.com/leestar54/ ...

  8. 基于C#简单实现的微信网页版接口

    ​​一.想法来源 ​      作为程序员,对自己工具不满,就要去改造,对于微信已经厌恶极久了.总有人不合时宜的发语音,总有老板无时无刻的艾特,总有微商群发各种消息.重点是不能忍受语音.​当现有客户端 ...

  9. 网页版登录入口_企业微信网页版怎么登录?企业微信客户端和网页版有什么区别?...

    文丨语鹦企服私域管家原创,未经授权不得转载 企业微信有网页版也有客户端,很多小伙伴可能搞不清,今天语鹦企服就带你一起看看,企业微信客户端和网页版有什么区别?以及如何登录使用. ▎企业微信网页版: 与微 ...

最新文章

  1. python正则取字符串日期_python 正则表达式获取字符串中所有的日期和时间
  2. python 数据库支持sql_Python 对数据库进行SQL操作
  3. linux 查本机公网ip 网站接口 nmap工具
  4. NYOJ 108 士兵杀敌(一)
  5. 【若依(ruoyi)】弹框图标 / layer 图标
  6. 插件式程序开发及其应用(C#)
  7. 【大会】除了FFmepg和WebRTC,还有哪些新工具?
  8. Magento获取产品自定义属性及对应的值
  9. .net core 调用c dll_C++ 调用C封装DLL库的两种方式
  10. java中来获取UUID
  11. python创建自定义函数is_number()来判断一个字符是否是数字
  12. 北京自动驾驶路测名单更新:蔚来和Pony.ai也获准上路了
  13. Failed to load VMMR0.r0 (VERR_SUPLIB_OWNER_NOT_ROOT)
  14. PyCharm:Error running xxx: Cannot run program D:\Python27\python.exe
  15. 小技巧:Win7屏保变梦幻桌面
  16. Unity获取摄像机的视口区域(透视相机模式)
  17. hiveql 没有left()right()函数,可用substr()替代
  18. pytorch训练Class-Balanced Loss
  19. 微信小程序开发学习5(自定义组件)
  20. [笔记]Pytorch框架下的入门应用:resnet34实现分类

热门文章

  1. DGL RDKit | 基于GCN的多任务分类模型
  2. 牛年倒计时1天 | 华章图书祝大家牛运当头
  3. 战五渣系列之五(3分钟正则)
  4. 计算机网络(英文版 第2版),计算机网络(原书第2版)(二).pdf
  5. IT业潜规则 通奸的不如强奸的
  6. 畜生!黑客攻击宝贝回家论坛,导致数据丢失关站维护
  7. 使用fiddler工具抓包并改包数据
  8. at91sam9g25处理器uboot移植 个人笔记一
  9. 关于flair中scoring card的使用
  10. 键盘按键事件 通过键盘上下左右按键移动界面上图标