Mpvue 是一個(gè)使用 Vue.js 開發(fā)小程序的前端框架??蚣芑?Vue.js 核心,修改了 Vue.js 的 runtime 和 compiler 實(shí)現(xiàn),使其可以運(yùn)行在小程序環(huán)境中,從而為小程序開發(fā)引入了整套 Vue.js 開發(fā)體驗(yàn),同樣也使得一套代碼同時(shí)復(fù)用在小程序和 Web 中成為可能。本文將以 IT之家Lite 小程序的 Web 轉(zhuǎn)換經(jīng)過(guò)為線索,大致介紹一下轉(zhuǎn)換的基本步驟及需要注意的一些事項(xiàng)。
省略了部分與轉(zhuǎn)換無(wú)關(guān)的文件
├─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.前期準(zhǔn)備
// src/utils/wx.js export default wx
1.修改打包配置
2.配置路由
3.調(diào)整請(qǐng)求接口
4.轉(zhuǎn)換小程序組件及 API
.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)
}
}
pull-to(:top-load-method="refresh", :bottom-load-method="loadmore")
5.Web 優(yōu)化
在初步完成 Web 版的轉(zhuǎn)換之后,便可以再次切換回主分支,后續(xù)的 feature 及 bugfix 均在主分支進(jìn)行,待主分支發(fā)版后切換到 web 分支進(jìn)行一次合并操作,可能會(huì)產(chǎn)生少量沖突,但也都會(huì)比較容易解決,最后處理下新引入的小程序特性即可,整體而言可維護(hù)性還是比較好的
整個(gè)轉(zhuǎn)換過(guò)程還是比較順利的,主體部分約 1 個(gè)多小時(shí)完成,相對(duì)于小程序 web 的環(huán)境更為開放,所以大部分小程序的 api 可以通過(guò)各種方式模擬,由于是在兩個(gè)不同的分支進(jìn)行,也可以放心地使用各種瀏覽器端地特性,下面是幾點(diǎn)開發(fā)及轉(zhuǎn)換中的建議:
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)) })
},
}