Blogger Information
Blog 291
fans 0
comment 0
visits 352629
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
基于svelteKit开发仿微信app界面聊天实例
Original
714 people have browsed it

一 、通过云开发平台快速创建初始化应用

1.创建相关应用模版请参考链接:尝鲜少代码高性能的Svelte框架

2.完成创建后就可以在github中查看到新增的Vite仓库

file

二 、 本地编写 Svelte3聊天室

1.将应用模版克隆到本地

  • 首先假定你已经安装了Git、node,没有安装请移步node官网进行安装。克隆项目:
  1. git clone + 项目地址
  • 进入项目文件
  1. cd Svelte
  • 切换到feature/1.0.0 分支上
  1. git checkout feature/1.0.0
  • 安装依赖包
  1. npm install
  • 启动服务
  1. npm run dev

这里打开浏览器8080端口,并出现默认页面。

2.项目结构目录

file

3.自定义导航栏Navbar+菜单栏Tabbar

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

file

file

file

4.自定义手机端弹窗组件

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

file

5.config.js配置文件

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

file

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

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

7.状态管理+本地存储

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

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

8.实现仿朋友圈下拉刷新

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

file

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

9.实现聊天功能

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

file

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

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

三 、 云端一键部署上线应用

1.上传代码

  1. git add .
  2. git commit -m '添加你的注释'
  3. git push

2.在日常环境部署

一键进行应用部署。在应用详情页面点击日常环境的「部署」按钮进行一键部署,部署状态变成绿色已部署以后可以点击访问部署网站查看效果。

file

3.配置自定义域名在线上环境上线

  • 配置线上环境自定义域名。在功能开发验证完成后要在线上环境进行部署,在线上环境的「部署配置」-「自定义域名」中填写自己的域名。例如我们添加一个二级域名 company.workbench.fun 来绑定我们部署的前端应用。然后复制自定义域名下方的API网关地址对添加的二级域名进行CNAME配置。

file

  • 配置CNAME地址。复制好 API网关域名地址后,来到你自己的域名管理平台(此示例中的域名管理是阿里云的域名管理控制台,请去自己的域名控制台操作)。添加记录的「记录类型」选择「CNAME」,在「主机记录」中输入你要创建的二级域名,这里我们输入「company」,在「记录值」中粘贴我们之前复制的 API网关域名地址,「TTL」保留默认值或者设置一个你认为合适的值即可。

file

  • 在线上环境部署上线。回到云开发平台的应用详情页面,按照部署的操作,点击线上环境的「部署按钮」,部署完成以后就在你自定义的域名进行了上线。CNAME 生效之后,我们输入 company.workbench.fun(示例网址) 可以打开部署的页面。至此,如何部署一个应用到线上环境,如何绑定自己的域名来访问一个线上的应用就完成了,赶紧部署自己的应用到线上环境,用自己的域名玩起来吧

file

4.项目预览效果

file

file

file

file

file

file

一键创建svelte应用模版链接 :https://workbench.aliyun.com/application/front/create?fromConfig=25&fromRepo=sol_github_25

参考文献:https://www.cnblogs.com/xiaoyan2017/p/16110203.html

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post