做者:餓了麼 顧誠html
開篇也不扯那些沒用的,讓咱們高效的開始教程。前端
不管學習什麼語言、框架、庫,首先你要作的,就是登錄它的官網,認真閱讀它的入門手冊、文檔等,這比任何《xx 分鐘從入門到精通》、《xx 深刻淺出》都要靠譜得多,再加上如今編程體系的越發完善,開發者愈來愈注重基礎設施的搭建,官網絕對是學習同樣東西的首先選擇。 因此,快應用如今的 官網是:https://www.quickapp.cn 文檔是:https://doc.quickapp.cn 請認真閱讀文檔。vue
快應用宣傳的一大優點,就是對於 Web 前端開發者的低學習成本、快速上手。那麼它的這個優點,實際上是創建在你熟悉(有必定程度瞭解)類 Vuejs 的框架的前提上的。 它基本上是創建在 Vue 的體系上的,通過必定程度的改造、精簡,造成了快應用的開發體系。 本篇教程,也默認你對 Vue 已經有必定程度的瞭解,假如你尚未完成這個前提,那麼先去了解一下 Vue 也不錯。 因此,讓我假設閱讀本文的你,是一名擁有 Vue 經驗的 Web 前端開發者,對新出的快應用有必定興趣,想要了解一下它,那麼,但願文章對你有所幫助。node
上文也說了,快應用的開發,對比的就是 Vue 的體系,因此,我選擇經過對比一樣實現目標的 APP 的 Vue 版本和快應用版本,來講明你要進行快應用開發須要準備和了解哪些東西。 首先,我選擇了人民羣衆喜聞樂見的 HackerNews 做爲實現目標,它提供了完善的 API,方便咱們構建真實 APP,而且 Vue 的官方也有一個 Demo 版本的 HackerNews 源碼,省去了咱們很多工做。 因此咱們直接選擇 https://github.com/vuejs/vue-hackernews 當前 master 分支做爲 Vue 版本的代碼,大家也能夠自行 clone 查看。webpack
請根據快應用官方文檔的快速入門一節,準備好開發環境,在這裏只有一點提醒:假如你的手機尚未直接支持快應用的運行環境(提示沒有運行環境),請安裝「快應用平臺預覽版」,經過它進行調試。git
首先確認一下咱們的工程結構github
.
├── quickapp
│ ├── README.md
│ ├── build
│ ├── dist
│ ├── node_modules
│ ├── package-lock.json
│ ├── package.json
│ ├── sign
│ └── src
└── vue
├── LICENSE
├── README.md
├── index.html
├── node_modules
├── package.json
├── src
├── static
└── webpack.config.js
複製代碼
就是這樣,快應用是經過 hap 工具直接初始化的工程,做爲開發者,直接寫代碼就完事了,我想你目前應該也不關心快應用的實現原理和內部細節。web
Vue 項目的入口天然是 index.html 和 main.js,它的核心代碼結構是這樣的:vue-router
src
├── components
├── filters
├── main.js
├── store
└── variables.styl
複製代碼
好,看一下 main.jsvuex
import Vue from 'vue'
import Router from 'vue-router'
import { domain, fromNow } from './filters'
import App from './components/App.vue'
import NewsView from './components/NewsView.vue'
import ItemView from './components/ItemView.vue'
import UserView from './components/UserView.vue'
// install router
Vue.use(Router)
// register filters globally
Vue.filter('fromNow', fromNow)
Vue.filter('domain', domain)
// routing
var router = new Router()
router.map({
'/news/:page': {
component: NewsView
},
'/user/:id': {
component: UserView
},
'/item/:id': {
component: ItemView
}
})
router.beforeEach(function () {
window.scrollTo(0, 0)
})
router.redirect({
'*': '/news/1'
})
router.start(App, '#app')
複製代碼
很簡單,作了幾件事情:
OK,那麼咱們去快應用裏面看一下,快應用裏,一個 APP 的 入口,是 src/manifest.json
,一個 APP 的重要信息就定義在這裏面,咱們看一下
{
"package": "me.ele.hacknews",
"name": "quickapp-hackernews",
"versionName": "1.0.0",
"versionCode": "1",
"minPlatformVersion": "101",
"icon": "/Common/logo.png",
"features": [
{ "name": "system.prompt" },
{ "name": "system.router" },
{ "name": "system.shortcut" },
{ "name": "system.fetch" }
],
"permissions": [
{ "origin": "*" }
],
"config": {
"logLevel": "debug"
},
"router": {
"entry": "News",
"pages": {
"News": {
"component": "index"
},
"User": {
"component": "index"
},
"Item": {
"component": "index"
}
}
},
"display": {
"titleBarBackgroundColor": "#ff6600",
"titleBarTextColor": "#ffffff",
"menu": true,
"pages": {
"News": {
"titleBarText": "Hacker News | QuickApp Clone"
}
}
}
}
複製代碼
固然,這和你剛初始化完成時候的配置確定不同了,不過我只是改爲了 HackerNews 的配置,結構並無改變,來看一下:
那麼對比 Vue 的啓動配置來講,由於快應用是運行在系統集成環境中的,因此 Vue 項目要求的引入框架、庫(路由)就都不須要了,多出了系統接口的提早聲明,按需聲明就能夠了,這項目只須要最基本的路由、網絡請求權限就能夠了。
路由這塊,請參考官方文檔,稍微須要注意的就是 page 默認使用它的名稱文件夾做爲它的組件所在位置。基本上也和 Vue 版本的路由對應的配置就能夠了,須要注意的是路由參數不須要在這裏配置,而是在對應的組件內配置(做爲組件外部傳入屬性)。
到這裏,你就已經完成了快應用項目的基礎配置,固然,如今是運行不起來的,你配置的頁面尚未實現對應的組件,下面咱們就把 Vue 的頁面組件改形成快應用的組件。
看一下快應用版本的源代碼目錄結構
src
├── Common
├── Item
├── News
├── User
├── app.ux
├── filters
├── manifest.json
├── store
└── util.js
複製代碼
一個頁面對應一個目錄,app.ux 是入口組件(如今不用管它),咱們開始改造過程。
第一個頁面就是首頁(News),上改造先後對比圖,diff 圖左邊是 Vue 項目代碼,右邊是快應用代碼,咱們來逐一分析:
{{ expression }}
中,須要注意一下。text
組件內!(請認真閱讀文檔),這和 Web 開發有很大區別,HTML 的體系中,基本是個標籤就能加文本,可是快應用中不行,須要綁定在 text
組件內。文本寫在 text
組件內!文本寫在 text
組件內!$index | formatItemIndex
-> formatItemIndex($idx)
。完成以上步驟,你的 template 部分就基本改造完成了,對着手冊一一改造就能夠了。
這部分改動不多,快應用支持 ES2015 的絕大部分語法、特性,這裏有一個很差的地方,官方沒有詳細說明支持程度,可能會遇到支持性問題。
完成了以上步驟,你就基本完成了script 部分的改造,這裏有一個問題,Vuex 你不由想問,Vuex 怎麼辦,上面我寫的那個 store,是 vuex 嗎?不是。 很遺憾,假如你依賴於 Vuex,你可能會遇到麻煩,我尚未很好的辦法替代 Vuex,快應用支持全局 data,支持 watch,可是並不足以替代 Vuex,上面的 store,並非 Vuex,只是一個處理數據的服務,下文會說到。
style 部分看上去是最簡單,但實際上是最麻煩的部分:
上面這些特色,須要你認真閱讀快應用文檔的 style部分,以及各個組件的樣式部分,來了解狀況,請必定要認真閱讀,你很容易用上了不支持的 CSS 特性。
咱們這個 DEMO 項目的 style 比較簡單,Vue 項目用了 stylus,快應用顯然不支持,爲了方便轉成了 CSS,不過快應用支持 Less CSS,也是不錯的選擇。
這多是一個體驗很糟糕的過程,寫着名義上是 CSS 卻有那麼多不一樣的 style 代碼,不過不管如何,咱們總算是完成了 style 部分的改造。
很明顯,經過以上對比,你會發現,快應用的代碼體系,真的很像 Vue,可是又有那麼一些糟糕的區別。 仍是那句話,若是你想要進行快應用的開發,請認真閱讀文檔,磨刀不誤砍柴工。
顯然咱們的項目裏,通常不會只有組件這一種東西,還有一些 JavaScript 模塊,好比上文的 store,這時候正文開始了 :)。
diff 圖左邊是 Vue 項目代碼,右邊是快應用代碼
what? firebase 庫? 講道理,這是一個 JavaScript 庫,應該能夠在快應用環境中直接使用,可是實際上,不行。
firebase 庫依賴於不少瀏覽器(window)API,好比 XHR 請求,這時候,它就沒法在快應用的體系中正常運行了。 這時候你陷入了一個兩難的抉擇,對 firebase 的庫進行魔改,或者本身造一個 firebase 庫。 這時候你可能就想放棄了,事實就是這麼殘酷,你會想,我作了這個事情我怎麼不去加入 firebase?
可是教程老是要繼續,好在咱們這個項目真的很簡單,簡單到我不須要 firebase 的庫,也能夠輕鬆兼容原代碼,完成改造。
api.child
改形成直接的 fetch 調用看上去好像也沒什麼問題,由於咱們這裏的 firebase 調用足夠簡單,僅僅是請求數據而已。
萬幸,咱們完成了 store 部分的改造。
而後其實也只剩下 Item、User 等組件了,依次完成改造。按照官方開發環境的說明
預覽圖:
預覽視頻:
你要問了
Q: 爲何這麼醜? A: 沒時間調整樣式,這是個 DEMO(側面反映,普通 CSS 不能完美地直接遷移到快應用內)
Q: 爲何頁面加載這麼慢? A: 由於 firebase 的接口慢,而且接口是先請求 id 列表,而後逐一請求 item,最後合併返回,必然很慢,由於咱們不能使用 firebase 庫。。。
Q: 你吹噓的那些快、輕量、原生徹底沒體現出來! A: 確實,這個 DEMO 是在太簡單了,若是你有興趣,能夠嘗試本身動手寫一個快應用 APP,必定能夠直觀地感覺到它和普通網頁應用的區別
Q: 我看完你的教程,以爲什麼都沒講?!仍是不會寫! A: 在教程的一開始,我已經說過了,學習同樣東西,最好的方法固然是它的官網啦,其實如今快應用的快網已經很是完善了,從入門教程到手冊到性能提高建議到深刻實踐,看完你必定有所收穫。
Talk is cheap, show me the code.