Mpvue 是一個使用 Vue.js 開發小程序的前端框架。框架基於 Vue.js 核心,修改了 Vue.js 的 runtime 和 compiler 實現,使其能夠運行在小程序環境中,從而爲小程序開發引入了整套 Vue.js 開發體驗,一樣也使得一套代碼同時複用在小程序和 Web 中成爲可能。本文將以 IT之家Lite 小程序的 Web 轉換通過爲線索,大體介紹一下轉換的基本步驟及須要注意的一些事項。css
省略了部分與轉換無關的文件html
├─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.前期準備前端
import wx from 'wx'
的方式引入,便於 web 中改寫 #c3ef6e7// src/utils/wx.js
export default wx
複製代碼
flyio/dist/npm/wx
1.修改打包配置vue
npm run dev
便已經能夠跑起來了,有報錯的話解決相應錯誤便可2.配置路由git
3.調整請求接口github
flyio/dist/npm/fly
4.轉換小程序組件及 APIweb
.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)
}
}
複製代碼
#app
pull-to(
ref="scroller",
:top-load-method="refresh",
:bottom-load-method="loadmore",
:is-top-bounce="!!onPullDownRefresh",
:is-bottom-bounce="!!onReachBottom",
@scroll="saveScrollPosition")
keep-alive
router-view(ref="current")
複製代碼
import PullTo from 'vue-pull-to'
export default {
name: 'App',
mpType: 'app',
components: {
PullTo
},
data () {
return {
onPullDownRefresh: null,
onReachBottom: null
}
},
methods: {
async refresh (loaded) {
await this.onPullDownRefresh.call(this.$refs.current)
loaded()
},
async loadmore (loaded) {
await this.onReachBottom.call(this.$refs.current)
loaded()
},
saveScrollPosition (e) {
const { current } = this.$refs
current.scrollTop = e.srcElement.scrollTop
}
},
watch: {
$route () {
this.$nextTick(() => {
const { current } = this.$refs
if (!current) return
this.onPullDownRefresh = current.$options.onPullDownRefresh
this.onReachBottom = current.$options.onReachBottom
})
}
}
}
複製代碼
5.Web 優化vue-router
在初步完成 Web 版的轉換以後,即可以再次切換回主分支,後續的 feature 及 bugfix 均在主分支進行,待主分支發版後切換到 web 分支進行一次合併操做,可能會產生少許衝突,但也都會比較容易解決,最後處理下新引入的小程序特性便可,總體而言可維護性仍是比較好的vue-cli
整個轉換過程仍是比較順利的,主體部分約 1 個多小時完成,相對於小程序,web 的環境更爲開放,因此大部分小程序的 api 能夠經過各類方式模擬,因爲是在兩個不一樣的分支進行,也能夠放心地使用各類瀏覽器端的特性,可是樣式及腳本儘可能不要直接修改原有代碼,可經過 mixin、新建 style 標籤等方式實現,避免形成衝突npm
this.$route
this.$router
及 router-link
完成相關操做,避免每次手動修改