介绍

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' }") 圈子
// 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)
}
}

5.Web 优化

维护

在初步完成 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.$routerrouter-link 完成相关操作,避免每次手动修改

  1. Git 仓库
  1. Demo

Mpvue 小程序转 Web 实践总结的更多相关文章

  1. 【一套代码小程序&Native&Web阶段总结篇】可以这样阅读Vue源码

    前言 前面我们对微信小程序进行了研究:[微信小程序项目实践总结]30分钟从陌生到熟悉 在实际代码过程中我们发现,我们可能又要做H5站又要做小程序同时还要做个APP,这里会造成很大的资源浪费,如果设定一 ...

  2. 说说 PWA 和微信小程序--Progressive Web App

    作者:云图图链接:https://zhuanlan.zhihu.com/p/22578965来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 利益相关:微信小用户,谷歌小 ...

  3. 张小龙的野心:用小程序重构web|小程序好处及可能的不足

    一:张小龙的野心:用小程序重构web 一 很多年以前,张小龙写了一款软件:Foxmail. 这款软件当年有数百万用户,这是一个相当庞大的量,因为彼时网民也只有千万当量级的规模. 我是一个非常忠实的用户 ...

  4. 微信小程序的Web API接口设计及常见接口实现

    微信小程序给我们提供了一个很好的开发平台,可以用于展现各种数据和实现丰富的功能,通过小程序的请求Web API 平台获取JSON数据后,可以在小程序界面上进行数据的动态展示.在数据的关键 一环中,我们 ...

  5. 跨界!Omi 发布多端统一框架 Omip 打通小程序与 Web 腾讯开源 2月28日

    https://mp.weixin.qq.com/s/z5qm-2bHk_BCJAwaodrMIg 跨界!Omi 发布多端统一框架 Omip 打通小程序与 Web 腾讯开源 2月28日

  6. 跨界 - Omi 发布多端统一框架 Omip 打通小程序与 Web

    Omip 今天,Omi 不仅仅可以开发桌面 Web.移动 H5,还可以直接开发小程序!直接开发小程序!直接开发小程序! Github Omi 简介 Omi 框架是微信支付线研发部研发的下一代前端框架, ...

  7. 【node+小程序+web端】简单的websocket通讯

    [node+小程序+web端]简单的websocket通讯 websoket是用来做什么的? 聊天室 消息列表 拼多多 即时通讯,推送, 实时交互 websoket是什么 websocket是一个全新 ...

  8. 第一个mpvue小程序开发总结

    前言 说起小程序,其实在去年我都还只试着照着官方文档写过demo的,不过现在这家公司小程序做得比较多,我来之后也参与了几个小程序的开发了,最开始那几个是用的wepy,最近一个开始转用mpvue开发,最 ...

  9. mpvue 小程序开发之 数据埋点统计

    mpvue 小程序开发之 数据埋点统计 在开发过程中,有数据统计的需求,需要获取小程序当前页面和来源页面的数据,以及页面的停留时间 在对小程序api进行了一番研究之后,发现获取这些数据其实并不难 当前 ...

随机推荐

  1. docker学习笔记(1)——ubuntu16.04安装docker(含如何彻底卸载docker,docker拉取镜像失败解决)

    参考博客: 1.官网教程:https://docs.docker.com/engine/install/   根据本机不同的信息选择不同的安装方式:  https://docs.docker.com/ ...

  2. WPF-GridView设置列宽按比例分配

    将ListView包裹在一个父Grid中 写一个与ListView平行的Grid,设置该Grid的列数与ListView中GridView的列数相同,将该Grid各列设置列宽按比例分配 将ListVi ...

  3. 题目要求:传入数组 内容为[['lisi','男','27'],['wangwu','男',18],['zhaoliu','男','30']],将此二维数组转化为一维数组,创建自定义函数完成

    //自定义函数 function getOne($arr){ $str = ''; //定义空的字符串,用来接收值 foreach ($arr as $key=>$value){ //循环遍历数 ...

  4. k-means聚类:擒贼先擒王,找到中心点,它附近的都是一类

    属于无监督学习,聚类算法事先并不需要知道数据的类别标签,只是根据数据特征去学习,找到相似数据的特征,然后把已知的数据集划分成几个不同的类别 算法原理: 假设数据总共有m条,计划分成3个类别 先随机在这 ...

  5. 【译】.NET 6 网络改进

    原文 | Máňa Píchová 翻译 | 郑子铭 对于 .NET 的每个新版本,我们都希望发布一篇博客文章,重点介绍网络的一些变化和改进.在这篇文章中,我很高兴谈论 .NET 6 中的变化. 这篇 ...

  6. CF1278F题解

    这不是傻逼题吗?????? 考虑到第一张是王牌的概率为 \(\frac{1}{m}\),答案就是: \[\sum_{i=0}^n\binom{n}{i}(\frac{1}{m})^i(1-\frac{ ...

  7. SourceTree代码变更和FoxMail邮件管理(效率小计俩)

    代码变更溯源 工作时,我们经常会想要查看一个类文件的变更历史,最常见的场景是:"卧槽,谁改了我的代码" 新版本的Xcode溯源自我感觉相当难用,所以这里我们介绍一个工具 Sourc ...

  8. 关于linux命令的随笔第一篇

    大多数的情况下,我们都是通过ssh客户端远程连接服务器去进行维护访问,所以我们必须要掌握linux命令 linux命令大约有上百种,但是并非所有命令都属于常用命令,所以不需要死记硬背,多用多百度就可以 ...

  9. 逆置单链表(基于c语言)

    直接插入全部代码:(reverseLinklist函数是逆置操作) #include <stdio.h> #include <stdlib.h> #include <as ...

  10. async-validator 源码学习笔记(二):目录结构

    上一篇文章<async-validator 源码学习(一):文档翻译>已经将 async-validator 校验库的文档翻译为中文,看着文档可以使用 async-validator 异步 ...