mpvue 轉小程序實踐總結

介紹

Mpvue 是一個使用 Vue.js 開發小程序的前端框架。   基礎介紹css

 

框架基於 Vue.js 核心修改了 Vue.js 的 runtime 和 compiler 實現,使其能夠運行在小程序環境中,html

 

從而爲小程序開發引入了整套 Vue.js 開發體驗,一樣也使得  一套代碼同時複用在小程序和 Web 中成爲可能。  webapp?前端

 

本文將以 IT之家Lite 小程序的 Web 轉換通過爲線索,大體介紹一下轉換的基本步驟及須要注意的一些事項。vue

 

目錄結構

省略了部分與轉換無關的文件
├─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

  • 建議使用 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.修改打包配置github

  • 能夠在原有配置基礎上修改, 主要涉及 entry、target 及 loader 相關的配置項,
  • 這裏我直接經過 vue-cli 生成了一個新的項目,複製 build、config 文件夾及 eslint、babel 等的配置文件替換原有配置,
  • 使用新項目的 package.json 並作相應修改,新建項目時  各選項儘可能與原項目 保持一致 #ece3a76
  • 修改 main.js,指定掛載元素,順利的話,這步以後執行 npm run dev 便已經能夠跑起來了,有報錯的話解決相應錯誤便可

2.配置路由web

  • 添加 vue-router,並進行相應配置,建議使用 history 模式 #ddf94bc
  • 修改路由參數獲取相關的代碼 #b949197
  • 使用 router-link 替換 a 標籤,避免頁面重載 #eb09297

3.調整請求接口vue-router

  • 配置 alias 將 flyio 指向 flyio/dist/npm/fly
  • 小程序中不會有跨域的問題,但 web 中需配合後端進行請求轉發或經過其餘方式來解決這一問題 #f963975

4.轉換小程序組件及 APIvue-cli

  • 底部導航欄,本身佈局實現 #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 優化npm

  • 使用 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 完成相關操做,避免每次手動修改

  1. Git 倉庫
  1. Demo
相關文章
相關標籤/搜索