微信小程序原生開發主要有三大元素:框架、組件、API,而小程序開發框架,其主要功能就是將以該框架支持的語法編寫的代碼編譯轉換爲小程序原生框架所能支持的。css
本人曾在生產項目中使用太小程序原生框架開發,後見WePY發展不錯,確承認投入生產使用,便在項目設計改版之際,改用WePY編寫代碼,同時使用代碼分包,至於mpvue,只是初步瞭解,暫未實際使用。如下簡單對兩個框架作一些對比,以期對選用哪一個框架開發小程序有更多的認識與考量。html
特性:vue
├── dist 小程序運行代碼目錄(該目錄由WePY的build指令自動編譯生成,請不要直接修改該目錄下的文件) ├── node_modules ├── src 代碼編寫的目錄(該目錄爲使用WePY後的開發目錄) | ├── components WePY組件目錄(組件不屬於完整頁面,僅供完整頁面或其餘組件引用) | | ├── com_a.wpy 可複用的WePY組件a | | └── com_b.wpy 可複用的WePY組件b | ├── pages WePY頁面目錄(屬於完整頁面) | | ├── index.wpy index頁面(經build後,會在dist目錄下的pages目錄生成index.js、index.json、index.wxml和index.wxss文件) | | └── other.wpy other頁面(經build後,會在dist目錄下的pages目錄生成other.js、other.json、other.wxml和other.wxss文件) | └── app.wpy 小程序配置項(全局數據、樣式、聲明鉤子等;經build後,會在dist目錄下生成app.js、app.json和app.wxss文件) └── package.json 項目的package配置 └── wepy.config.json 項目的編譯配置 └── project.config.json 小程序開發工具的配置
請查看其使用手冊node
![WePY文件編譯示意圖]()
WePY文件編譯示意圖webpack
![WePY組件實現示意圖]()
WePY組件實現示意圖git
WePY大概作了這些工做:es6
編譯代碼爲原生框架支持的形式github
所以,使用WePY開發小程序,除遵循WePY的語法外,web
.js/.json/.wxml
原封不動複製到輸出目錄下,將.less
編譯爲同名的.wxss
wepy.app/wepy.page/wepy.component
的以.wpy
爲文件後綴名的,則數據賦值需按照WePY的方式,必要時使用$apply, $nextTick
, 而不是用setData
, 至於事件綁定語法、API調用,可根據喜愛與需求,保留原生語法 or 使用WePY優化語法WePY的文檔更新會有必定的延遲。vuex
特性:
配套設施
├── build 編譯配置 ├── config 編譯配置 ├── dist 小程序運行代碼目錄(該目錄由編譯生成) ├── node_modules ├── src 開發目錄 | ├── components 組件目錄 | | ├── com_a.vue 組件a | | └── com_b.vue 組件b | ├── pages 頁面目錄 | | ├── index index頁面(默認會在src/main.js主入口生成pages配置,路徑爲pages/index/main) ├── index.vue 由其入口文件編譯main.js後,生成index/main.js、index/main.wxml和index/main.wxss文件 ├── main.js 頁面默認入口文件(config屬性會編譯爲頁面配置文件index/main.json) | | └── other other頁面(默認會在src/main.js主入口生成pages配置,路徑爲pages/other/main) ├── index.vue 由其入口文件編譯main.js後,生成other/main.js、other/main.wxml和other/main.wxss文件 ├── main.js 頁面默認入口文件(config屬性會編譯爲頁面配置文件other/main.json) | └── app.wpy 小程序配置項(全局數據、樣式、聲明鉤子等;經build後,會在dist目錄下生成app.js、app.json和app.wxss文件) └── static 靜態文件,會直接被複制到dist/下 └── package.json 項目的package配置 └── project.config.json 小程序開發工具的配置
一點疑問:
- 頁面目錄結構上感受不如WePY簡潔,每一個頁面源代碼由兩個文件組成,且默認其入口文件命名爲main.js, 若換其餘命名的話,須要修改編譯配置
build/webpack.base.conf.js
- 爲何不借鑑小程序原生開發方式,同一頁面的文件命名相同,這樣在目錄上能夠根據喜愛選擇減小一層;若如此,需修改編譯配置pages/下的js文件默認爲入口頁面,但這樣必須保證pages/下的js文件均爲頁面入口文件;或者增長一個entry/目錄,用於存放頁面入口文件,但分包又如何支持?
- pages頁面路徑感受仍是用戶本身配置的好,不要自動生成
- mpvue 保留了 vue.runtime 核心方法,無縫繼承了 Vue.js 的基礎能力
- mpvue-template-compiler 提供了將 vue 的模板語法轉換到小程序的 wxml 語法的能力
- 修改了 vue 的建構配置,使之構建出符合小程序項目結構的代碼格式: json/wxml/wxss/js 文件
Web端與小程序如何代碼複用?
div/p/ul/li
等能夠直接使用,讓mpvue的編譯器幫你完成轉換,但對於如picker/checkbox/radio/switch/slider/swiper/progress/icon
等這些與html標籤不能簡單對應的小程序原生組件,mpvue的建議是按小程序原生組件的用法,只不過事件綁定與變量動態賦值的語法要按mpvue的寫法(mpvue使用手冊有涉及,請別踩坑)toast/loading/modal/actionsheet/picker
,Web端能夠藉助weui.js
來完成js-sdk
mpvue的最主要的功能,是Web端與小程序一致的開發體驗,以及儘量地實現UI複用,但據我目前的瞭解,UI複用也只是一些簡單的容易轉換的UI,差別化較大的仍是須要各端各自實現的,那麼,所謂的一套代碼跑多端的目的並無達到,從這個角度來看,mpvue跟WePY的功能實際上是同樣的;
因此,mpvue最大的不一樣,其實在於徹底的Vuejs開發體驗吧?
mpvue | WePY | 原生開發 | |
---|---|---|---|
開發風格 | 單文件組件 | 類Vue風格 | 每一個頁面由4個同名文件組成 |
組件化支持 | 支持,Vue單文件組件 | 支持,同時可兼容原生自定義組件 | 模板(template),自定義組件 |
外部依賴npm | 支持 | 支持 | 不支持 |
原生API Promise化 | 基本不支持,請求能夠選用fly | 大部分API均支持,選用 | 無,爲回調函數 |
優化 | 優化了setData,npm資源不引用則不會佔用體積 | setData不可太頻繁使用,需控制圖片資源大小,第三方資源不用需及時清理 | |
less/sass/es6/typescript/eslint等 | 均支持 | 均支持 | 支持es6 |
自動化構建 | vue-cli, webpack | wepy-cli | |
數據統一管理 | vuex, 選用 | wepy-redux, 選用 | 全局數據globalData, Storage |
框架體積 | 無說明 | 壓縮後 24.3KB, +8.9KB 可以使用 Promise 和 Async Function | 無 |
web H5支持 | 已上線H5頁面轉小程序,更改小部分平臺差別代碼和 webpack配置可運行 | 可輸出web版本,暫不適合投入生產 | |
理想狀態:一套代碼跑多端 | WEB、小程序(微信和支付寶)、Native(藉助weex) | Web, 小程序 | 各端有各端特性,需處理差別化 |