mpvue 转小程序实践总结
介绍
Mpvue 是一个使用 Vue.js 开发小程序的前端框架。 基础介绍
框架基于 Vue.js 核心,修改了 Vue.js 的 runtime 和 compiler 实现,使其可以运行在小程序环境中,
从而为小程序开发引入了整套 Vue.js 开发体验,同样也使得 一套代码同时复用在小程序和 Web 中成为可能。 webapp?
本文将以 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.youngon.com.cn
mpvue 转小程序实践总结的更多相关文章
- 使用mpvue开发小程序教程(三)
在上一篇文章中,我们熟悉了一下通过vue-cli生成的mpvue工程代码骨架的基本结构,大致了解了每一个部分的代码到底要放到何处.从本文起我们就开始涉及真正的编码部分,学习使用Vue的语法去编写小程序 ...
- 使用mpvue开发小程序教程(四)
在上一章节中,我们将vue-cli命令行工具生成的代码骨架中的src目录清理了一遍,然后从头开始配置和编写了一个可以运行的小程序页面,算是正真走上了使用mpvue开发小程序的第一步.今天我们将进一步来 ...
- 为什么选择MpVue进行小程序的开发
前言 mpvue是一款使用Vue.js开发微信小程序的前端框架.使用此框架,开发者将得到完整的 Vue.js 开发体验,同时为H5和小程序提供了代码复用的能力.如果想将 H5 项目改造为小程序,或开发 ...
- 学习笔记:mpvue开发小程序——入门
接下来可能要开发一个小程序,同事推荐使用mpvue,那么我提前熟悉下. 官网地址:http://mpvue.com/ 1.快速上手 http://mpvue.com/mpvue/quickstart/ ...
- 使用mpvue开发小程序教程(一)
前段时间,美团开源了mpvue这个项目,使得我们又多了一种用来开发小程序的框架选项.由于mpvue框架是完全基于Vue框架的(重写了其runtime和compiler),因此在用法上面是高度和Vue一 ...
- 使用mpvue开发小程序教程(二)
在上篇文章中,我们介绍了使用mpvue开发小程序所需要的一些开发环境的搭建,并创建了第一个mpvue小程序代码骨架并将其运行起来.在本文中,我们来研究熟悉一下mpvue项目的主要目录和文件结构. 在V ...
- 使用mpvue开发小程序教程(五)
在上一章节中,我们了解了组件的三个基本特性以及组件的基本使用方法.在实际的小程序开发中,我们应该以组件的思维去设计每个小程序的功能页面,对其进行合理的组件拆分,让每个部分都保持功能简洁.条理清楚.各司 ...
- 小程序实践(十一):showModal的使用
显示模态对话框,确定和取消两个选择+标题+内容的对话框 . // 编辑用户性别 tapSex:function(res){ var that = this wx.showModal({ title: ...
- 小程序实践(十):textarea实现简单的编辑文本界面
textarea是官方的原生组件,用于多行输入 简单的例子,监听文本内容.长度,以及设置最大可输入文本长度 wxml <view class='textarea-Style'> <t ...
随机推荐
- 《CSS世界》读书笔记(九)
<!-- <CSS世界>张鑫旭著 --> content内容生成技术 1. content 辅助元素生成 清除浮动: .clear:after { content: ''; d ...
- 【js】关于闭包、let、var的一个考题
题目: html: body中有2个div 遍历,给每个div添加点击事件,输出值. js: var声明: 效果: 点击每个div后都打印2. 用户点击前,for循环就已经执行完了,是2,onclic ...
- python学习笔记:装饰器2
python的装饰器本质是函数,为了不改变装饰目标函数内部代码而增加额外功能而存在 一.一般装饰函数实例: import datetime def func_name(func):#定义一个装饰函数, ...
- 剑指offer(45)扑克牌顺子
题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决 ...
- topcoder srm 560 div1
problem1 link 从大到小贪心,较大的数字应该放置在较浅的位置. problem2 link 最后的位置要么都是整数(经过偶数次变换),要么是$(p.5, q.5)$这种位置(奇数次变换). ...
- 开源列式存储引擎Parquet和ORC
转载自董的博客 相比传统的行式存储引擎,列式存储引擎具有更高的压缩比,更少的IO操作而备受青睐(注:列式存储不是万能高效的,很多场景下行式存储仍更加高效),尤其是在数据列(column)数很多,但每次 ...
- C++ 将 std::string 转换为 char*
参考: std::string to char* C++ 将 std::string 转换为 char* 目前没有直接进行转换的方法.必须通过string对象的c_str()方法,获取C-style的 ...
- 浅谈Cocos2d-js cc.director
在cocos2d-x里面,游戏的任何时间,只有一个场景对象实例处于运行状态,该对象可以作为当前游戏内容的整体包对象. 环境设定 进入游戏之前,导演会设置游戏的运行环境: 设置游戏视图,包含视图的投射, ...
- MVC _Ajax的使用【七】
一.本篇主要写的是在MVC项目中一种ajax的使用方法 1. 首先在控制器中创建两个方法,showCreate()和AddUserInfo() using System; using System. ...
- 虚拟机里C盘空间不够 用Macrium Reflect工具克隆
一个很重要的虚拟机,因为需要装slack, 进而需要装 .NET4.5 , 结果发觉C盘不够了. 只好重新添加了一个80G的虚拟硬盘,然后用 Macrium Reflect工具把原来的C盘和引导分区, ...