小程序博客搭建分享,纯微信小程序原生实现

news2024/11/23 11:30:59

本项目代码已开源,具体见:

前端工程:vue3-ts-blog-frontend

后端工程:express-blog-backend

小程序源码:blog-weapp

数据库初始化脚本:关注公众号程序员白彬,回复关键字“博客数据库脚本”,即可获取。

前言

我是在 2019 年启动这个全栈博客项目的,当时自己的前端技术其实也不怎么样,但是我脑子里就一个想法,必须掌握一点点全栈技术,了解整个系统全栈是怎么运行起来的。于是,我就决定自己动手做一个全栈的博客,当时也还从没在公司做过小程序项目,就想着也做个小程序版的博客练练手。

我学习一个新东西不太喜欢一来就上框架,我会先开始学一点最原始的基础,有了基础后,再换框架做,这样效率高,同时遇到框架问题也不至于由于没有了解过底层基础而无从下手去解决。由于当时我对小程序技术处于一个一无所知的阶段,我决定先用微信小程序原生语法做一遍。

所以可能大家看到的小程序源码水平不是很高,不过没关系,我自认为用它来入门小程序还是没多大问题的。

小程序包含的内容

小程序基本是仿照 PC 端的内容去做的,主要还是由首页的文章瀑布流、文章详情、分类、留言板、我的等几个页面组成。

目前微信对未认证的个人小程序限制了被搜索能力,而认证是需要收保护费的,确实挺符合他们家做事风格的。

我的博客小程序被限制搜索能力了,大家可以扫这个小程序码浏览下。

image.png

内心OS:访问量不大,懒得交保护费

下面就挑几个我认为比较重要的点展开聊聊。

怎么运行项目?

要了解项目,首先要给它运行起来。

我们 clone 代码后,先照常 npm install 安装依赖。

接着我们打开微信开发者工具,导入项目后,先构建 npm,这是微信小程序中用到 npm 必须执行的一个步骤,这一步执行后会生成一个 miniprogram_npm 目录。

image.png

此时需要刷新编译一下,接着就能看到界面效果了。

image.png

自定义 tabbar

我们知道,移动端中页面通常分为 tabbar 页面和非 tabbar 页面。tabbar 页面通常用来承载核心页面,切换 tabbar 页面不是以页面栈的形式交互,来回切换不会销毁 tabbar 页面。而非 tabbar 页面是通过页面栈来维护的,页面返回时会销毁当前页面。

当你的微信小程序需要 tabbar 页面时,可以通过 app.json 的 tabBar 配置项管理。

image.png

tabBar 配置对样式的支持度很低,很难达到完全自定义的效果。因此也衍生出了自定义 tabBar 的需求。

image.png

微信小程序官方在基础库 2.5.0 以上版本支持了自定义 tabBar。

image.png

可能是由于时间错开了,当时没有用到自定义 tabBar,转而是用组件的形式承载了几个核心页面。

image.png

也就是说,目前看到的我的博客小程序其实并不是用 tabBar 页面来组织首页、分类、留言、我的等几个页面,这几个页面是 index 页面中的几个组件。

当然,我不是很推荐用这种方式实现自定义底部 tabBar 样式,虽然看起来视觉效果也一样,但是肯定不如官方推荐的
custom-tab-bar 组件。

授权开放信息

博客小程序需要拿到用户的开放信息,主要是头像和昵称,用于评论留言功能。

微信对用户信息这块卡得一直很死,从最初可以结合 open-type=“getUserInfo” 和 wx.getUserInfo API 做到只需要用户授权一次后续就能静默取得用户信息,到后来只能用 open-data 组件展示开放信息,再到现在,昵称和头像都拿不到了,必须引导用户填写,你就说服不服吧。

image.png

本小程序就是采用的 API 调用用户信息,判断用户是否授权过 userInfo,如果没有授权过,通过 open-type=“getUserInfo” 的 button 组件引导用户授权;

image.png

如果授权过,就可以调用 wx.getUserInfo 直接取用户信息。

image.png

而现在,如果你不进行代码调整,通过上述方式拿到的头像就是灰色默认头像了,而昵称则是“微信用户”这种没有什么用的信息。

更牛的是,现在获取手机号授权也要收费了,一个字,绝!

image.png

0.gif

接口封装

看过博客 PC 端前端源码的应该知道,API 接口可以封装到类里面,然后对外输出一个单例。

image.png

调用实例的方法就相当于调用后端 API。

image.png

那么小程序端能不能这样封装呢?也可以的,不过我换了一种形式,不是用类封装,而是用函数封装。

image.png

函数有函数的好处,类有类的好处。

函数的好处在于它对构建工具是友好的,如果一个函数是纯函数,虽然它被定义了,但是没有被引用过,那么在编译阶段可以通过 Tree Shaking 去掉它。

而 Class 实例是一个对象,是一个整体,不能摇树去掉其中的某个方法。但是 Class 有面向对象的优点,调用起来很简单,能免去 import 多个函数的繁琐。

大家可以两种方式都体验一下,根据实际情况再去选择。

前端封装 API 调用的核心还是通过 Promise 封装平台提供的 Request 能力,封装好了之后,对外暴露 Class 实例或者函数,这样可以做到不管是在 Web、还是小程序、甚至桌面应用、跨端 APP,对于业务代码来说,调用体验一模一样,我在公司内部项目中就做了这样的事情。

不同平台提供的 Request 能力不一样,

  • Web 端底层是 XMLHttpRequest 或者 fetch,接着可能被 axios 之类的库又封装了一遍,那么我们的封装就是基于 axios 去包装即可。
  • 小程序,以微信小程序为例,它提供的 Request API 是 wx.request,直接对它进行封装即可,不必使用第三方库再进行封装。
  • uniapp,提供的是 uni.request,封装它就行。

封装的范式是什么样呢?简单给个例子:

const request = () => {
  return new Promise((resolve, reject) => {
    底层request库请求()
    如果 success, resolve()
    如果 fail, reject()
  })
}

当然,如果用到 axios 这样的库,我们通常在其拦截器中处理。

复杂的封装还会在其中考虑并发,鉴权,业务错误码判定,无感刷新 token,甚至微前端通讯等等。

不过这些对业务调用方来说都是无感知的,内核多复杂都没关系,上层调用要简单化!

markdown 渲染

我们的文章内容是用 markdown 存储的,在小程序上的文章详情页中应该怎么渲染出来呢?

小程序没有 innerHTML 能力,这意味着 Web 生态的 markdown 引擎在小程序端都不奏效了。小程序要实现 markdown 渲染,应该怎么做呢?用 rich-text 组件行不行呢?理论上可以,但是 rich-text 组件内会屏蔽所有事件,这意味着如果你希望很难与其中节点进行交互。

image.png

如果你希望支持更多的交互能力,就需要将 markdown 解析成结构化数据(本质上是节点树的结构),再遍历这个结构化数据,将其渲染成微信小程序的各种组件(比如 view, text, image, video 等等)。有几个库可以参考,虽然都不算完美,但是提供了一种实现思路。

  • towxml

image.png

  • wemark

CI 的实现

小程序发布版本流程比较繁琐,其中还需要在微信开发者工具中手动上传代码到微信公众平台。

那么有没有办法把这个过程自动化呢?

嗯,可以的,至少通过脚本上传代码到微信公众平台是可以实现的,官方提供了 miniprogram-ci 来做这件事情。

使用前需要使用小程序管理员身份访问"微信公众平台-开发-开发设置"后下载代码上传密钥,并配置 IP 白名单,才能进行上传、预览操作。

image.png

具体使用方式可以参考博客源码ci.js。

image.png

你完全可以考虑把这个脚本集成到 CI/CD 流程中。

image.png

上传完代码后,还有提交版本审核环节,这一步是不在 miniprogram-ci 支持范围内的。

如果确实有这方面需要,可以考虑用 Puppeteer 或者抓包分析实现,这里就不做延申了。

个人感受

写小程序代码和写 html, css, js 三件套本质上没多大区别,各家小程序的使用语法其实跟 Vue Options API 风格也挺像的。小程序最大的不同是:它是双线程的,渲染层和逻辑层是分开的,渲染层基于定制化的 WebView,逻辑层也是一个沙箱环境,很多 API (DOM/BOM相关)都被屏蔽了,由于小程序是双线程模型,这使得很多 API 操作都是异步的,比如你要获取一个元素节点的属性状态,这就是异步的,需要线程间通信。理解了这些,上手小程序开发就不是很困难。

  • 开源地址:vue3-ts-blog-frontend
  • 专栏导航:Vue3+TS+Node打造个人博客(总览篇)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1937221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ML练习】决策树

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、决策树算法概述 二、代码实现 代码目标:我们希望通过鸢尾花数据,训练一个决策树模型,之后应用该模型,可以…

新的铸造厂通过 PROFIBUS 技术实现完全自动化

钢铁生产商某钢以其在厚钢板类别中极高的产品质量而闻名。其原材料(板坯连铸机)在钢铁厂本地生产,该厂最近新建了一座垂直连铸厂。该项目的一个主要目标是从一开始就完全自动化这座新工厂和整个铸造过程,以高成本效率实现最佳产品…

ue5 使用动画蒙太奇,混合上半身持枪姿势

ue5 使用动画蒙太奇 1.创建动画蒙太奇 添加上半身插槽,在添加持枪动画 搜索equip stand,t,添加进上半身插槽 2.设置动画蓝图 3.播放动画蒙太奇

AFAC2024-基于保险条款的问答 比赛日记 llamafactory qwen npu 910B1

AFAC2024: 基于保险条款的问答挑战——我的实战日记 概述 在最近的AFAC2024竞赛中,我参与了基于保险条款的问答赛道。这是一次深度学习与自然语言处理的实战演练,旨在提升模型在复杂保险文本理解与问答生成方面的能力。本文将分享我的参赛过程&#xf…

C语言 #字符指针

文章目录 前言 一、指针概念简述 二、字符指针 二、字符在内存中的存储 总结 前言 以例子为导向来分析字符指针的中存的是什么,以及常量字符串在内存中是如何存储的。 一、指针概念简述 想要详细地了解指针的概念可以戳此链接(详细的万字讲解&#xff…

机器学习基础入门(1)

最近也在努力的想要学习些机器学习的知识,目前正在了解各个概念及术语,下面就把学习到的概念都列出来。 人工智能 (AI) Artificial intelligence 人工智能生成内容(AIGC) 机器学习(ML) Machine Learning …

《汇编语言 基于x86处理器》- 读书笔记 - Visual Studio 2019 配置 MASM环境

安装 Visual Studio 2019 配置 MASM环境 下载 Visual Studio Installer安装 Visual Studio 20191. 双击运行2. 自定义安装内容3. 修改 MSVC 工具集版本4. 设置主题(可选)5. 安装代码高亮插件 AsmDude(可选)6. 通义灵码&#xff08…

【AI学习】关于Scaling Law的相关学习

一、苦涩的教训 首先,学习一段重要话语: The biggest lesson that can be read from 70 years of AI research is that general methods that leverage computation are ultimately the most effective, and by a large margin. 从70年的人工智能研究中…

服务器借助笔记本热点WIFI上网

一、同一局域网环境 1、当前环境,已有交换机组网环境,服务器已配置IP信息。 设备ip服务器125.10.100.12交换机125.10.100.0/24笔记本125.10.100.39 2、拓扑图 #mermaid-svg-D4moqMym9i0eeRBm {font-family:"trebuchet ms",verdana,arial,sa…

FastAPI(六十五)实战开发《在线课程学习系统》基础架构的搭建

在之前三篇,我们分享的就是需求的分析,基本接口的整理,数据库链接的配置。这次我们分享项目的基本框架,目录结构大致如下: common目录: 通用目录,放一些通用的处理 models目录&#xf…

达梦数据库(一)mysql2dm

达梦数据库(一)mysql2dm 文章目录 达梦数据库(一)mysql2dm一、安装篇ForWindows二、数据库初始化篇三、数据迁移篇出现的问题找不到对应表或者视图 注意字符集模式迁移出错大小写敏感解决方案 四、 代码修改篇group_concatGROUP BY方法一方法二(最笨)方法补充 多表联查更新参考…

【AI资讯】7.19日凌晨OpenAI发布迷你AI模型GPT-4o mini

性价比最高的小模型 北京时间7月19日凌晨,美国OpenAI公司推出一款新的 AI 模型“GPT-4o mini”,即GPT-4o的更小参数量、简化版本。OpenAI表示,GPT-4o mini是目前功能最强大、性价比最高的小参数模型,性能逼近原版GPT-4&#xff0…

python--实验15 数据分析与可视化

目录 知识点 1 数据分析概述 1.1流程 1.2定义 1.3数据分析常用工具 2 科学计算 2.1numpy 2.1.1定义 2.1.2创建数组的方式 2.1.3np.random的随机数函数 3 数据可视化 3.1定义 3.2基本思想 3.3Matplotlib库 3.3.1模块 4 数据分析 4.1Pandas 4.2数据结构 4.3基…

RE学习7.16-17

[HDCTF 2023]买了些什么呢 是一个经典的算法题吧 物品的重量和价值为: | 物品编号 | 重量 | 价值 | | 1 | 2 | 8 | | 2 | 5 | 1 | | 3 | 10 | 5 | | 4 | 9 | 9 | | 5 | 3 | 5 | | 6 | 6 | 6 | | 7 | 2 | 8 | | 8 | 2 | 2 | | 9 | 6 | 3 | | 10 | 8 | 7 | | 11 | 2 | 5 | | 1…

在 PostgreSQL 中怎样进行数据库的容量规划?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!📚领书:PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 中怎样进行数据库的容量规划?一、为什么容量规划如此重要?二、影…

探索 JavaScript Polyfill:跨越浏览器兼容性的桥梁

🎉 博客主页:【剑九 六千里-CSDN博客】 🎨 上一篇文章:【构建高效Node.js中间层:探索请求合并转发的艺术】 🎠 系列专栏:【面试题-八股系列】 💖 感谢大家点赞👍收藏⭐评…

【Linux系统化学习】数据链路层

目录 数据链路层解决的问题 以太网 认识局域网 以太网帧格式 两个问题 认识MAC地址 认识MTU ARP协议 ARP协议的作用 ARP数据报格式 ARP协议的工作流程 数据链路层解决的问题 对于TCP/IP四层协议来说,数据链路层才是真正从传送数据进行跑腿办事情的&…

display: flex 和 justify-content: center 强大居中

你还在为居中而烦恼吗,水平居中多个元素、创建响应式布局、垂直和水平同时居中内容。它,display: flex 和 justify-content: center 都可以完成! display: flex:将元素定义为flex容器 justify-content:定义项目在主轴…

分享:咕嘎批量查找文件移动存储系统,一次性查找多个PDF文件,如何根据txt文本列出的文件名批量查找指定文件夹里的文件,并复制到新的文件夹,不需要写任何代码,点点鼠标批量处理一次性搞定

简介: 该文介绍了一个批量查找PDF文件(不限于找PDF)的工具,用于在多级文件夹中快速查找并复制特定文件。用户可以加载PDF库,输入文件名列表,设置操作参数(如保存路径、复制或删除)及…

一个非常好的美图展示网站整站打包源码,集成了wordpress和开源版ripro主题,可以完美运营。

一个非常好的美图展示网站整站打包源码,集成了wordpress和开源版ripro主题,可以完美运营。 自带了5个多g的美图资源,让网站内容看起来非常大气丰富,可以快速投入运营。 这个代码包,原网站已经稳定运营多年&#xff0…