基于svelte3.x+svelteKit构建仿微信App聊天应用svelte-chatroom

svelte-chatroom 基于svelte.js+svelteKit+mescroll.js+svelte-popup等技术搭建开发的仿微信app界面聊天项目。支持发送图文消息/gif动图、图片/视频预览、下拉刷新、红包及朋友圈等功能。

一、技术框架

  • 编码器:VScode
  • 框架技术:svelte^3.46.0+svelteKit
  • 下拉组件:mescroll.js^1.4.2
  • 样式处理:sass+svelte-preprocess
  • 弹窗组件:svelte-popup
  • 数据模拟:mockjs^1.1.0

svelte.js 一款号称比vue.js还快的前端新框架。体积小、运行速度快、无虚拟DOM、快速的响应能力。

https://svelte.dev/

二、项目结构目录

使用svelte+svelteKit构建的项目,目录结构如下。

◆ Svelte.js自定义导航栏Navbar+菜单栏Tabbar

项目中顶部导航条及底部菜单栏均是基于svelte定制开发的自定义组件。

至于如何使用svelte开发自定义组件,就不作过多的介绍,大家感兴趣的话,可以去看看这篇分享文章。

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

◆ Svelte.js自定义手机端弹窗组件

svelte-popup 一款基于Svelte3.x开发自定义多功能svPopup弹出框组件,支持超过20+参数自由配置、组件式+函数式混合调用方式。

具体的实现步骤这里不作详细介绍,大家可以去看看下面这篇分享文章。

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

◆ svelte.config.js配置文件

如何在svelte.js项目中使用sass/less编写样式?可以安装 sass 及 svelte-preprocess 依赖。

  1. /**
  2. * svelte.config.js基础配置文件
  3. */
  4.  
  5. import adapter from '@sveltejs/adapter-auto'
  6. import path from 'path'
  7. import SvelteProcess from 'svelte-preprocess'
  8.  
  9. /** @type {import('@sveltejs/kit').Config} */
  10. const config = {
  11. kit: {
  12. adapter: adapter(),
  13. vite: {
  14. resolve: {
  15. alias: {
  16. '@': path.resolve('./src'),
  17. '@assets': path.resolve('./src/assets'),
  18. '@utils': path.resolve('./src/utils')
  19. }
  20. }
  21. }
  22. },
  23. // allow you to use Svelte with tools like TypeScript, PostCSS, SCSS, and Less.
  24. preprocess: SvelteProcess()
  25. };
  26.  
  27. export default config

◆ SvelteKit公共模板及错误页

使用svelteKit构建的项目,公共模板__layout.svelte及错误页__error.svelte配置如下。

  1. <script>
  2. import { onMount } from 'svelte'
  3. import { page } from '$app/stores'
  4. import { goto } from '$app/navigation'
  5. import { userinfo } from '@/store/index.js'
  6.  
  7. let whiteRoute = ['/auth/login', '/auth/register']
  8.  
  9. onMount(() => {
  10. if(!$userinfo) {
  11. goto('/auth/login')
  12. }else {
  13. if(whiteRoute.includes($page.url.pathname)) {
  14. goto('/')
  15. }else {
  16. goto($page.url.pathname)
  17. }
  18. }
  19. })
  20. </script>
  21.  
  22. <div class="sv__container flexbox flex-col">
  23. <slot />
  24. </div>
  25.  
  26. <style>
  27. @import '@/app.scss';
  28. @import '@assets/css/reset.scss';
  29. @import '@assets/css/layout.scss';
  30. @import '@assets/fonts/iconfont.css';
  31. </style>
  1. <!-- //Svelte错误页 -->
  2. <script context="module">
  3. export function load({ error, status }) {
  4. return {
  5. props: { error, status }
  6. }
  7. }
  8. </script>
  9.  
  10. <script>
  11. import Navbar from '$lib/Navbar'
  12.  
  13. export let status
  14. export let error
  15.  
  16. function goBack() {
  17. history.go(-1)
  18. }
  19. </script>
  20.  
  21. <svelte:head>
  22. <title>404错误</title>
  23. </svelte:head>
  24.  
  25. <Navbar title="Page Error!!!" />
  26.  
  27. <div class="sv__scrollview flex1">
  28. <div class="sv__page-error flexbox flex-col flex-alignc flex-justifyc">
  29. <div class="sv__page-error-img">
  30. <img src="404.png" alt="" />
  31. </div>
  32. <div class="sv__page-error-content">
  33. <div class="c-red fs-36">┗| {status} |┛ 嗷~~</div>
  34. <div class="c-999 mt-10">{error.message}</div>
  35. <div class="mt-20 sv__btn sv__btn-default" on:click={goBack}><i class="iconfont icon-arrL"></i> 返回首页</div>
  36. </div>
  37. </div>
  38. </div>

◆ Svelte.js状态管理+本地存储

svelte框架也提供了创建状态管理svelte/store,配置localStorage本地化存储服务。

  1. /**
  2. * Svelte状态管理
  3. */
  4.  
  5. import { writable } from 'svelte/store'
  6.  
  7. const createStore = (value, key) => {
  8. const { subscribe, set, update } = writable(value)
  9. return {
  10. // 持久化存储
  11. useStorage: () => {
  12. const data = localStorage.getItem(key)
  13. if(data) {
  14. set(JSON.parse(data))
  15. }
  16. // 订阅
  17. subscribe(val => {
  18. [null, undefined].includes(val) ? localStorage.removeItem(key) : localStorage.setItem(key, JSON.stringify(val))
  19. })
  20. },
  21. subscribe,
  22. set,
  23. update,
  24. }
  25. }
  26.  
  27. export const userinfo = createStore(localStorage.getItem('userinfo')||null, 'userinfo')

◆ Svelte.js实现仿朋友圈下拉刷新

使用 svelte.js+mescroll 实现仿朋友圈下拉转圈功能。

  1. <!-- //朋友圈模板 -->
  2. <script>
  3. import { onMount } from 'svelte'
  4. import Navbar from '$lib/Navbar'
  5.  
  6. import MeScroll from 'mescroll.js/mescroll.min.js'
  7. import 'mescroll.js/mescroll.min.css'
  8. onMount(() => {
  9. let mescroll = new MeScroll('mescroll', {
  10. down: {
  11. auto: false,
  12. offset: 40,
  13. callback: downCallback
  14. },
  15. // up: {
  16. // callback: upCallback
  17. // }
  18. })
  19. // 下拉刷新的回调
  20. function downCallback() {
  21. console.log('下拉刷新...')
  22. setTimeout(() => {
  23. // 隐藏下拉刷新的状态;
  24. mescroll.endSuccess()
  25. }, 2000)
  26. }
  27. // 上拉加载的回调 page = {num:1, size:10}; num:当前页 默认从1开始, size:每页数据条数,默认10
  28. function upCallback(page) {
  29. console.log('上拉加载...')
  30. var pageNum = page.num; // 页码, 默认从1开始
  31. var pageSize = page.size; // 页长, 默认每页10条
  32. }
  33. })
  34.  
  35. // ...
  36. </script>
  37.  
  38. <Navbar title="朋友圈" center transparent>
  39. <svelte:fragment slot="right">
  40. <div><i class="iconfont icon-tupian"></i></div>
  41. <div class="ml-30"><i class="iconfont icon-fabu"></i></div>
  42. </svelte:fragment>
  43. </Navbar>
  44.  
  45. <div class="sv__scrollview flex1">
  46. <div id="mescroll" class="mescroll">
  47. <div>
  48. <div class="sv__uzone">
  49. ...
  50. </div>
  51. </div>
  52. </div>
  53. </div>

◆ Svelte实现聊天功能

聊天页面文本框支持文字+emoj混排,光标处插入表情、网址/图片/视频预览、红包等功能。并且底部文本框单独抽离了一个editor.svelte组件。

  1. <script>
  2. /**
  3. * @Desc Svelte.js实现聊天编辑框组件
  4. * @Time andy by 2022-04
  5. * @About Q:282310962 wx:xy190310
  6. */
  7.  
  8. // 编辑器内容
  9. export let editor
  10.  
  11. import { tick, createEventDispatcher } from 'svelte'
  12. const dispatch = createEventDispatcher()
  13.  
  14. let editorNode
  15. let lastCursor = null
  16.  
  17. // 获取光标最后位置
  18. function getLastCursor() {
  19. let sel = window.getSelection()
  20. if(sel && sel.rangeCount > 0) {
  21. return sel.getRangeAt(0)
  22. }
  23. }
  24.  
  25. // 光标位置插入内容
  26. export async function addHtmlInCursor(html) {
  27. // ...
  28. }
  29.  
  30. // 删除编辑器内容
  31. export async function deleteHtml() {
  32. let range
  33. let sel = window.getSelection()
  34. if(lastCursor) {
  35. sel.removeAllRanges()
  36. sel.addRange(lastCursor)
  37. }
  38. range = getLastCursor()
  39. range.collapse(false)
  40. document.execCommand('delete')
  41.  
  42. await tick()
  43. editorNode.blur()
  44. }
  45.  
  46. function handleInput() {
  47. editor = editorNode.innerHTML
  48. lastCursor = getLastCursor()
  49. }
  50.  
  51. function handleClick() {
  52. dispatch('click')
  53. lastCursor = getLastCursor()
  54. }
  55.  
  56. function handleFocus() {
  57. dispatch('focus')
  58. lastCursor = getLastCursor()
  59. }
  60.  
  61. function handleBlur() {
  62. dispatch('blur')
  63. }
  64. </script>
  65.  
  66. <div
  67. class="editor"
  68. bind:this={editorNode}
  69. contenteditable="true"
  70. bind:innerHTML={editor}
  71. on:input={handleInput}
  72. on:click={handleClick}
  73. on:focus={handleFocus}
  74. on:blur={handleBlur}
  75. style="user-select: text; -webkit-user-select: text;"
  76. ></div>

以上就是基于svelte.js+svelteKit开发仿微信app界面聊天实例的一些分享,希望对大家有所帮助!

最后附上一个uniapp+uview-ui开发移动端后台管理系统

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

Svelte3聊天室|svelte+svelteKit仿微信聊天实例|svelte.js开发App的更多相关文章

  1. uni-app聊天室|vue+uniapp仿微信聊天实例|uniapp仿微信App界面

    一.介绍 运用UniApp+Vue+Vuex+swiper+uniPop等技术开发的仿微信原生App聊天室|仿微信聊天界面实例项目uniapp-chatroom,实现了发送图文消息.表情(gif图), ...

  2. Vue3.0聊天室|vue3+vant3仿微信聊天实例|vue3.x仿微信app界面

    一.项目简介 基于Vue3.0+Vant3.x+Vuex4.x+Vue-router4+V3Popup等技术开发实现的仿微信手机App聊天实例项目Vue3-Chatroom.实现了发送图文表情消息/g ...

  3. vue聊天室|h5+vue仿微信聊天界面|vue仿微信

    一.项目简介 基于Vue2.0+Vuex+vue-router+webpack2.0+es6+vuePhotoPreview+wcPop等技术架构开发的仿微信界面聊天室——vueChatRoom,实现 ...

  4. Taro聊天室|react+taro仿微信聊天App界面|taro聊天实例

    一.项目简述 taro-chatroom是基于Taro多端实例聊天项目,运用Taro+react+react-redux+taroPop+react-native等技术开发的仿微信App界面聊天室,实 ...

  5. react聊天室|react+redux仿微信聊天IM实例|react仿微信界面

    一.项目概况 基于react+react-dom+react-router-dom+redux+react-redux+webpack2.0+react-photoswipe+swiper等技术混合开 ...

  6. Tauri-Vue3桌面端聊天室|tauri+vite3仿微信|tauri聊天程序EXE

    基于tauri+vue3.js+vite3跨桌面端仿微信聊天实例TauriVue3Chat. tauri-chat 运用最新tauri+vue3+vite3+element-plus+v3layer等 ...

  7. electron聊天室|vue+electron-vue仿微信客户端|electron桌面聊天

    一.项目概况 基于Electron+vue+electron-vue+vuex+Nodejs+vueVideoPlayer+electron-builder等技术仿制微信电脑端界面聊天室实例,实现消息 ...

  8. h5聊天室web端(仿微博、微信)|h5仿微信网页端|仿微信界面弹窗

    这段时间一直在着手h5开发手机端聊天系统——html5仿微信聊天室,最近又在原先基础上开发了一个仿微信.微博网页web版聊天系统,使用到了HTML5+css3+jQuery+wcpop等技术开发,弹窗 ...

  9. Next.js+React聊天室|Next仿微信桌面端|next.js聊天实例

    一.项目介绍 next-webchat 基于Next.js+React.js+Redux+Antd+RScroll+RLayer等技术构建的PC桌面端仿微信聊天项目.实现了消息/表情发送.图片/视频预 ...

随机推荐

  1. LGP5142题解

    题意简明,不说了( 因为教练让同学们做线段树的题,早就会了线段树的我就来爆踩水水蓝了/kk 首先推一下柿子: \[\frac 1 n\sum_{i=1}^n(a_i^2-2 \times a_i \t ...

  2. Mybatis使用注解开发(未完)

    使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心 注解在接口实现 @Select("SELECT * FROM user") Lis ...

  3. 5月14日 python学习总结 视图、触发器、事务、存储过程、函数、流程控制、索引

    一.视图 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次用的直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 create view t ...

  4. 内网渗透----Token 窃取与利用

    0x00 前言 在之前的文章<渗透技巧--程序的降权启动>介绍了使用 SelectMyParent 降权的方法,本质上是通过 token 窃取实现的.这一次将要对 token 窃取和利用做 ...

  5. 什么是 Git

    概述 Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件. ...

  6. sem信号量与死锁的边缘

    1. 演示一个例子,出现死锁,用strace debug得到 #include<stdio.h> #include<pthread.h> #include<stdlib. ...

  7. 配置Django环境后,运行时报错

    (背景)安装完Django,并配置完成. 在setting.py中设置了数据库时,出现的报错. 点击查看 数据库配置 DATABASES = { 'default': { # 'ENGINE': 'd ...

  8. OSPF的五种报文

    OSPF的五种报文 Hello报文 DD(Database Description)数据库描述报文 LSR(LinkState Request)链路状态请求报文 LSU(LinkState Updat ...

  9. Golang之框架篇-Windows环境bee工具运行beego

    bee工具简介及好处     bee 工具是一个为了协助快速开发 beego 项目而创建的项目,通过 bee 你可以很容易的进行 beego 项目的创建.热编译.开发.测试.和部署. 强烈推荐新手或J ...

  10. pip 安装更新卸载 pip/yum换源

    pip安装:sudo apt-get install python3-pip pip更新:sudo pip3 install --upgrade pip pip卸载:sudo apt-get remo ...