Mpvue 小程序转 Web 实践总结
介绍
Mpvue 是一个使用 Vue.js 开发小程序的前端框架。框架基于 Vue.js 核心,修改了 Vue.js 的 runtime 和 compiler 实现,使其可以运行在小程序环境中,从而为小程序开发引入了整套 Vue.js 开发体验,同样也使得一套代码同时复用在小程序和 Web 中成为可能。本文将以 IT之家Lite 小程序的 Web 转换经过为线索,大致介绍一下转换的基本步骤及需要注意的一些事项。
目录结构
省略了部分与转换无关的文件
├─build
├─config
├─src
│ ├─components
│ ├─pages
│ ├─store
│ ├─styles
│ ├─utils
│ │ ├─api.js
│ │ ├─index.js
│ │ ├─request.js
│ │ └─wx.js
│ ├─App.vue
│ └─main.js
├─package-lock.json
└─package.json
转换步骤
0.前期准备
- 建议使用 git 进行分支管理
- 尽量避免使用不必要的小程序特有标签,如 text,image 等 #9137744
- 避免直接使用 wx 对象,使用
import wx from 'wx'
的方式引入,便于 web 中改写 #c3ef6e7
// src/utils/wx.js
export default wx
- 使用 flyio 作为请求库,配置 alias 将 flyio 指向
flyio/dist/npm/wx
- 基于原分支新建 web-version 分支
1.修改打包配置
- 可以在原有配置基础上修改,主要涉及 entry、target 及 loader 相关的配置项,这里我直接通过 vue-cli 生成了一个新的项目,复制 build、config 文件夹及 eslint、babel 等的配置文件替换原有配置,使用新项目的 package.json 并做相应修改,新建项目时各选项尽量与原项目保持一致 #ece3a76
- 修改 main.js,指定挂载元素,顺利的话,这步之后执行
npm run dev
便已经可以跑起来了,有报错的话解决相应错误即可
2.配置路由
- 添加 vue-router,并进行相应配置,建议使用 history 模式 #ddf94bc
- 修改路由参数获取相关的代码 #b949197
- 使用 router-link 替换 a 标签,避免页面重载 #eb09297
3.调整请求接口
- 配置 alias 将 flyio 指向
flyio/dist/npm/fly
- 小程序中不会有跨域的问题,但 web 中需配合后端进行请求转发或通过其他方式来解决这一问题 #f963975
4.转换小程序组件及 API
- 底部导航栏,自己布局实现 #8d6d98b
.nav(v-if="$route.meta.nav")
a.nav-item(href="/pages/news/list")
img.nav-icon(v-if="$route.name === 'NewsList'", src="/static/assets/news-active.png")
img.nav-icon(v-else, src="/static/assets/news.png")
.nav-title(:class="{ active: $route.name === 'NewsList' }") 资讯
a.nav-item(href="/pages/quanzi/list")
img.nav-icon(v-if="$route.name === 'QuanziList'", src="/static/assets/quanzi-active.png")
img.nav-icon(v-else, src="/static/assets/quanzi.png")
.nav-title(:class="{ active: $route.name === 'QuanziList' }") 圈子
- rich-text 组件,使用 v-html 实现 #1945f3f
- swiper 组件,使用 vue-swiper-component 实现 #f4a4e1a
- toast 及 loading 接口,使用 vue2-toast 实现 #cb1d9d3
// src/utils/wx.js
import Vue from 'vue'
export default {
showNavigationBarLoading () {
Vue.prototype.$loading('加载中')
},
hideNavigationBarLoading () {
Vue.prototype.$loading.close()
},
showToast ({ title }) {
Vue.prototype.$toast.center(title)
}
}
- 下拉刷新及上拉加载,使用 vue-pull-to 实现 #38647db
5.Web 优化
- 使用 minireset 重置浏览器默认样式,部分标签在小程序中的默认样式与浏览器不同,也需进行处理 #e98f5ba
- 引入 babel-polyfill,提高兼容性 #c184166
维护
在初步完成 Web 版的转换之后,便可以再次切换回主分支,后续的 feature 及 bugfix 均在主分支进行,待主分支发版后切换到 web 分支进行一次合并操作,可能会产生少量冲突,但也都会比较容易解决,最后处理下新引入的小程序特性即可,整体而言可维护性还是比较好的
总结
整个转换过程还是比较顺利的,主体部分约 1 个多小时完成,相对于小程序 web 的环境更为开放,所以大部分小程序的 api 可以通过各种方式模拟,由于是在两个不同的分支进行,也可以放心地使用各种浏览器端地特性,下面是几点开发及转换中的建议:
- 下拉刷新及上拉加载尽量以 method 的形式实现,便于 web 中复用
onPullDownRefresh () {
this.refresh()
},
onReachBottom () {
this.loadmore()
},
methods: {
...mapActions([
'getSlides',
'getNews'
]),
async refresh () {
await Promise.all([
this.getNews({ r: 2, init: true }),
this.getSlides()
])
wx.stopPullDownRefresh()
},
loadmore () {
const { news } = this
const lastnews = news[news.length - 1]
this.getNews({ r: Date.parse(new Date(lastnews.postdate)) })
},
}
- 样式及脚本尽量不要直接修改原有代码,可通过 mixin、新建 style 标签等方式实现,避免造成冲突
展望
- 双端统一的 UI 库,目前来看只能使用一些简单的 css 类库
- 更好的路由支持,理想状态下,可以通过 vue-router 的配置文件自动生成各页面的 main.js 文件,并配置 entry,开发 .vue 文件时,可以直接使用
this.$route
this.$router
及router-link
完成相关操作,避免每次手动修改
附
- Git 仓库
- Demo
- IT之家Lite Web 版: http://ithome.f-loat.xyz
Mpvue 小程序转 Web 实践总结的更多相关文章
- 【一套代码小程序&Native&Web阶段总结篇】可以这样阅读Vue源码
前言 前面我们对微信小程序进行了研究:[微信小程序项目实践总结]30分钟从陌生到熟悉 在实际代码过程中我们发现,我们可能又要做H5站又要做小程序同时还要做个APP,这里会造成很大的资源浪费,如果设定一 ...
- 说说 PWA 和微信小程序--Progressive Web App
作者:云图图链接:https://zhuanlan.zhihu.com/p/22578965来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 利益相关:微信小用户,谷歌小 ...
- 张小龙的野心:用小程序重构web|小程序好处及可能的不足
一:张小龙的野心:用小程序重构web 一 很多年以前,张小龙写了一款软件:Foxmail. 这款软件当年有数百万用户,这是一个相当庞大的量,因为彼时网民也只有千万当量级的规模. 我是一个非常忠实的用户 ...
- 微信小程序的Web API接口设计及常见接口实现
微信小程序给我们提供了一个很好的开发平台,可以用于展现各种数据和实现丰富的功能,通过小程序的请求Web API 平台获取JSON数据后,可以在小程序界面上进行数据的动态展示.在数据的关键 一环中,我们 ...
- 跨界!Omi 发布多端统一框架 Omip 打通小程序与 Web 腾讯开源 2月28日
https://mp.weixin.qq.com/s/z5qm-2bHk_BCJAwaodrMIg 跨界!Omi 发布多端统一框架 Omip 打通小程序与 Web 腾讯开源 2月28日
- 跨界 - Omi 发布多端统一框架 Omip 打通小程序与 Web
Omip 今天,Omi 不仅仅可以开发桌面 Web.移动 H5,还可以直接开发小程序!直接开发小程序!直接开发小程序! Github Omi 简介 Omi 框架是微信支付线研发部研发的下一代前端框架, ...
- 【node+小程序+web端】简单的websocket通讯
[node+小程序+web端]简单的websocket通讯 websoket是用来做什么的? 聊天室 消息列表 拼多多 即时通讯,推送, 实时交互 websoket是什么 websocket是一个全新 ...
- 第一个mpvue小程序开发总结
前言 说起小程序,其实在去年我都还只试着照着官方文档写过demo的,不过现在这家公司小程序做得比较多,我来之后也参与了几个小程序的开发了,最开始那几个是用的wepy,最近一个开始转用mpvue开发,最 ...
- mpvue 小程序开发之 数据埋点统计
mpvue 小程序开发之 数据埋点统计 在开发过程中,有数据统计的需求,需要获取小程序当前页面和来源页面的数据,以及页面的停留时间 在对小程序api进行了一番研究之后,发现获取这些数据其实并不难 当前 ...
随机推荐
- omnet++:使用教程
学习自:(6条消息) omnet++ 快速入门 | 计算机网络仿真 | omnet++ 入门教程_叶局长的博客-CSDN博客 1.使用omnet仿真的一般步骤 主要有3步: 使用ned(network ...
- 爬虫之Scrapy框架介绍及基础用法
今日内容概要 爬虫框架之Scrapy 利用该框架爬取博客园 并发编程 今日内容详细 爬虫框架Scrapy 1.什么是框架? 框架类似于房子的结构,框架会提前帮你创建好所有的文件和内部环境 你只需要往对 ...
- Django的ORM补充
Django的ORM补充 参考文档:https://www.cnblogs.com/wupeiqi/articles/6216618.html 1.查询性能补充 1.1 select_related ...
- C#控制台输入密码星号显示
在Program类中的Main方法里: 1 public class Program 2 { 3 static void Main(string[] args) 4 { 5 Console.Write ...
- [k8s] k8s基于csi使用rbd存储
描述 ceph-csi扩展各种存储类型的卷的管理能力,实现第三方存储ceph的各种操作能力与k8s存储系统的结合.通过 ceph-csi 使用 ceph rbd块设备,它动态地提供rbd以支持 Kub ...
- 明火烟雾目标检测项目部署(YoloV5+Flask)
明火烟雾目标检测项目部署 目录 明火烟雾目标检测项目部署 1. 拉取Docker PyToch镜像 2. 配置项目环境 2.1 更换软件源 2.2 下载vim 2.3 解决vim中文乱码问题 3. 运 ...
- python-用代码实现队列,处理斐波那契数列
队列在进行数据操作时必须遵循"先进先出(Firstin Firstout,FIFO)"的原则,这一特点决定了队列的基本操作需要在其两端进行 队列(Queue)的基本操作通常在队列的 ...
- Net6 Configuration & Options 源码分析 Part2 Options
Net6 Configuration & Options 源码分析 Part2 Options 第二部分主要记录Options 模型 OptionsConfigurationServiceCo ...
- el-upload用form的方式多文件上传的方法
使用el-upload组件遇到的坑. 1.第一种感觉最好,首先多个文件是一个http请求,另外还可以传除文件外其他的参数,但是没有进度条了. 发送请求的部分没有注释的部分是我分装了调后台的api,注释 ...
- [happyctf]部分writeup
题目名称:sqltest所属:MISC考察点:盲注 眼力 耐心(好吧是废话) 附件下载下来 ,到手一个流量包,用wireshark打开,大致浏览了一下,抓的应该是盲注的数据流量. 这里有一个经验问题, ...