uni-app修仙筆記,煉氣期入門
uni-app官方解釋是一款用vuejs開發(fā)前端應(yīng)用的跨端框架,從官方解釋的第一句話,其實(shí)就可以看出,uni-app集成了vuejs所有特性,然后具有跨端的特性,什么是跨端,通俗理解就是使用uni-app一套代碼開發(fā)h5,App,微信小程序,快應(yīng)用,支付寶小程序,QQ小程序等等。
看到上面uni-app可以開發(fā)多個(gè)平臺(tái)應(yīng)用,是不是內(nèi)心很興奮,what,android,ios程序員是不是要失業(yè)了,千萬不要讓我老板看到這種技術(shù),我只會(huì)原生ios,android開發(fā),什么?一套代碼代碼多端運(yùn)行?我只是一個(gè)切圖的,我還要做小程序?APP?快應(yīng)用?
除了吃驚,更多的是uni-app簡(jiǎn)直是萬能鑰匙啊,但是面對(duì)復(fù)雜的多端兼容性需求,程序員掉頭發(fā)肯定少不了,特別是小程序那主包不得超過1.5M,總包不得超過2M的要求,你能想像所有的微信小程序都是2M以內(nèi)的,而我一張高清圖都有6M了,除了優(yōu)化再優(yōu)化,沒有更好的選擇。
本文是一篇uni-app入門筆記,uni-app這個(gè)系列大概會(huì)寫十來篇,主要會(huì)從uni-app到云開發(fā),會(huì)以實(shí)際例子由淺入深認(rèn)識(shí)uni-app與云開發(fā),同時(shí)也是記錄開發(fā)中遇到的一些坑。
正文開始...
在開始本文之前,本文主要以下幾個(gè)方面認(rèn)識(shí)uni-app
uni-app初始化基礎(chǔ)項(xiàng)目有哪些關(guān)鍵目錄
pages.json與mainifest.json文件,探究對(duì)應(yīng)配置項(xiàng)
eazycom全局注冊(cè)組件,條件編譯多端代碼
uni-app與web開發(fā)的區(qū)別
HbuildērX
使用uni-app開發(fā)跨端項(xiàng)目,必不可少的一個(gè)開發(fā)工具就是使用HbuilderX[1],官方提供了兩種方式創(chuàng)建uni-app
可視化界面,這是官方推薦的首選,使用官方插件時(shí)非常方便
命令行vue-cli,對(duì)于喜歡命令行的,可以用這個(gè),但個(gè)人認(rèn)為使用可視化界面要高效得多
開始一個(gè)基礎(chǔ)項(xiàng)目
打開HBuilderX,文件>新建>項(xiàng)目選擇一個(gè)uni-app最簡(jiǎn)單的默認(rèn)模版
新建一個(gè)02-uni-demo大概結(jié)構(gòu)就下下面這樣
我們可以看到初始化的目錄結(jié)構(gòu)與我們普通項(xiàng)目沒什么太大的區(qū)別,但還是有些區(qū)別,因?yàn)槲覀兛吹巾?xiàng)目里有uniCloud
在uni-Cloud下主要有兩個(gè)目錄,一個(gè)是database,另一個(gè)是cloudfunctions,這兩個(gè)目錄是云開發(fā)的關(guān)鍵,在開始云開發(fā)前,你必須關(guān)聯(lián)一個(gè)服務(wù)空間[2]。注意在使用之前,我們必須用郵箱注冊(cè)登陸HbuilderX,然后用賬號(hào)登陸uni-Cloud創(chuàng)建一個(gè)空間,不過此空間是免費(fèi),你只能創(chuàng)建一個(gè)免費(fèi)空間,且云函數(shù)讀取次數(shù)只有500次/天,這量太不夠用了,相信我你一定會(huì)花錢的,但是不得不說也非常便宜。
database這個(gè)目錄是xx.scheme.json文件,當(dāng)我們?cè)谠撃夸浵滦陆╠b schema時(shí),我們?cè)谇岸隧撁婵梢灾苯邮褂迷坪瘮?shù)連接對(duì)應(yīng)的表
cloudfunctions這個(gè)目錄是存放云函數(shù)與云對(duì)象
關(guān)于云函數(shù),云對(duì)象,還有db schema我會(huì)在后續(xù)的云開發(fā)中陸續(xù)揭開
當(dāng)我們使用HBuilderX創(chuàng)建一個(gè)基礎(chǔ)項(xiàng)目后,我們是怎么運(yùn)行的呢?
當(dāng)我們運(yùn)行到瀏覽器時(shí),我們就可以打開頁面了
這個(gè)默認(rèn)的頁面路由就是pages/index/index.vue,同時(shí)也是在pages.json中注冊(cè)的第一個(gè)頁面
pages.json
我們?cè)谄胀ǖ膚eb開發(fā)中,我們的路由是會(huì)自己去手動(dòng)注冊(cè),然后必須掛載在根實(shí)例上。但是uni-app你創(chuàng)建的每一個(gè)頁面會(huì)注冊(cè)在pages.json的pages中
pages.json
{
"pages": [ //pages數(shù)組中第一項(xiàng)表示應(yīng)用啟動(dòng)頁,參考:https://uniapp.dcloud.io/collocation/pages
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "uni-app"
}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "uni-app",
"navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8"
},
"uniIdRouter": {}
}
router跳轉(zhuǎn)
在pages中,我們主要看到有path,這個(gè)path就是我們的路由地址,但是pages的第一個(gè)就是我們程序默認(rèn)啟動(dòng)的首頁,關(guān)于pages[3]的配置我們會(huì)在后續(xù)中逐一講解,我們也可以去官網(wǎng)看到更多的配置信息
我們嘗試在pages中新建一個(gè)頁面,我們?cè)趐ages右鍵點(diǎn)擊新建頁面
此時(shí)我們?cè)谛陆ǖ捻撁嬷袊L試加點(diǎn)自己的寫的內(nèi)容
pages/about/about.vue
<template>
<view>
我是關(guān)于頁面
</view>
</template>
<script>
export default {
data() {
return {
}
},
methods: {}
}
</script>
<style>
</style>
看到這個(gè)文件我們是不是非常的熟悉,是不是vue的味道?
是的,除了模版根標(biāo)簽是view,在script上所有的鉤子函數(shù)都是與vue沒有任何區(qū)別
在開頭我們就知道uni-app就是使用了vuejs開發(fā)跨端應(yīng)用的,同時(shí)又新增了小程序API與條件編譯,所以你會(huì)看到在使用uni-app開發(fā)小程序時(shí),你會(huì)看到小程序的API
當(dāng)我們?cè)跒g覽器輸入地址http://localhost:8080/#/pages/about/about時(shí)就可以打開剛才你新建的一個(gè)頁面了
關(guān)于uni-app中的路由跳轉(zhuǎn)主要有以下三種
uni.navigateTo({url: 'xxx?id=123'}); 保留當(dāng)前頁面,前往另一個(gè)非tabBar頁面,可以攜帶參數(shù),當(dāng)前頁面不會(huì)被銷毀,使用這個(gè)api跳轉(zhuǎn)另一個(gè)頁面時(shí),使用uni.navigateBack返回上一個(gè)頁面,只能打開非tabBar頁面
<template>
<view class="content">
<image class="logo" src="/static/logo.png"></image>
<view class="text-area">
<text class="title">{{title}}</text>
</view>
<view @click="goToAbout">前往關(guān)于頁面</view>
</view>
</template>
<script>
export default {
data() {
return {
title: 'Hello',
}
},
onLoad() {
},
methods: {
goToAbout() {
uni.navigateTo({
url:"/pages/about/about"
})
}
}
}
</script>
<style>
</style>
uni.redirectTo關(guān)閉當(dāng)前頁面,前往另一個(gè)頁面,與navigateTo的區(qū)別是,跳轉(zhuǎn)的新頁面不會(huì)有返回操作,只能打開非tabBar頁面
uni.reLaunch關(guān)閉所有頁面,前往指定頁面,可以打開任意頁面
uni.switchTab切換tabBar,只能打開tabBar的路由頁面
關(guān)于這幾個(gè)路由跳轉(zhuǎn)的api觸發(fā)頁面鉤子也會(huì)有所不同
當(dāng)我們使用uni.navigateTo跳轉(zhuǎn)about頁面時(shí),此時(shí)about頁面的兩個(gè)鉤子會(huì)被觸發(fā)onLoad,onShow。因?yàn)閚avigateTo不會(huì)銷毀當(dāng)前頁面,所以在about頁面返回上一個(gè)頁面時(shí)會(huì)直接從頁面棧中獲取,此時(shí)只會(huì)觸發(fā)onShow不會(huì)觸發(fā)onLoad鉤子
所以此時(shí)你會(huì)遇到一個(gè)場(chǎng)景,A頁面onLoad鉤子請(qǐng)求數(shù)據(jù),在A頁面列表也編輯進(jìn)入詳情頁保存然后返回,你會(huì)發(fā)現(xiàn)此時(shí)頁面不會(huì)更新,因?yàn)榇藭r(shí)A頁面不會(huì)觸發(fā)onLoad鉤子,所以此時(shí)請(qǐng)求放在onLoad鉤子估計(jì)不太合適,所以要么你把請(qǐng)求放在onShow中,要么就想辦法重新觸發(fā)onLoad而重新觸發(fā)onLoad你可以使用uni.reLaunch
關(guān)于路由跳轉(zhuǎn)鉤子在不同場(chǎng)景都會(huì)有不同的選擇,更多細(xì)節(jié)參考官方文檔router[4]
globalStyle
我們看到基礎(chǔ)配置就有這個(gè),主要是全局設(shè)置默認(rèn)頁面窗口的基本公用樣式,比如title、導(dǎo)航、不同平臺(tái)的默認(rèn)首頁樣式,一般是pages的第一項(xiàng)為默認(rèn)頁
tabBar
這是我們切換底部tabBar的頁面切換,最關(guān)鍵的就是list項(xiàng)的配置,當(dāng)我們配置底部tabBar后,我們的頁面底部就會(huì)出現(xiàn)三個(gè)切換項(xiàng),這里的配置是同小程序是一樣的
{
...
"tabBar": {
"color": "#7A7E83",
"selectedColor": "#3cc51f",
"list": [{
"pagePath": "pages/index/index",
"text": "Web技術(shù)",
"value": "1"
},
{
"pagePath": "pages/engineer/engineer",
"text": "工程化",
"value": "0"
},
{
"pagePath": "pages/my/my",
"text": "我的",
"value": "2"
}
]
}
}
subPackages這個(gè)選項(xiàng)能減少小程序主包的大小,算是優(yōu)化小程序體積的一種有效手段,因?yàn)樾〕绦蛑靼拗?.5M,總體積不能超過2M,所以我們非常有必要將非tabBar頁面盡可能的分包出去,從而會(huì)減少主包的大小
easycom
在官方文檔上,HBuilderX 2.5.5支持eazycom自動(dòng)引入組件模式,本質(zhì)上就是按照官方規(guī)范,組件就可以自動(dòng)注冊(cè),并全局使用,在打包后eazycom會(huì)剔除未使用的組件
關(guān)于規(guī)范引入官方一段原話
只要組件安裝在項(xiàng)目根目錄或uni_modules的components目錄下,并符合components/組件名稱/組件名稱.vue或uni_modules/插件ID/components/組件名稱/組件名稱.vue目錄結(jié)構(gòu),就可以不用引用、注冊(cè),直接在頁面中使用
這段話翻譯的簡(jiǎn)版就是在根目錄,假設(shè)我創(chuàng)建一個(gè)全局組件,在components目錄下創(chuàng)建一個(gè)custEditor的組件
components/custEditor/custEditor.vue這個(gè)組件就只要符合這種文件結(jié)構(gòu),那么我們就可以在其他頁面上不用局部注冊(cè),就可以使用
<template>
<view class="container">
<custEditor></custEditor>
</view>
</template>
<script>
// 這里不用import引入,也不需要在components內(nèi)注冊(cè)custEditor組件。template里就可以直接用
export default {
data() {
return {
}
}
}
</script>
另外一個(gè)就是在uni_modules中的符合這樣的文件目錄也會(huì)自動(dòng)被注冊(cè)
uni_modules/uni-badge/components/uni-badge/uni-badge.vue我們注意到所有官方插件都是這種目錄結(jié)構(gòu),如果你想安裝插件,就直接去官方插件市場(chǎng)搜索導(dǎo)入就可
直接導(dǎo)入你的HBuilderX即可
正常情況如果使用官方插件市場(chǎng)導(dǎo)入,那么會(huì)默認(rèn)支持eazycom自動(dòng)導(dǎo)入組件全局注冊(cè),而且eazycom是自動(dòng)開啟的,官方提供了可支持自定義配置
"easycom": {
"autoscan": true,
"custom": {
"^uni-(.*)": "@/components/uni-$1.vue", // 匹配components目錄內(nèi)的vue文件
"^vue-file-(.*)": "packageName/path/to/vue-file-$1.vue" // 匹配node_modules內(nèi)的vue文件
}
}
mainifest.json
這是一個(gè)配置文件,如果是小程序,那么需要配置對(duì)應(yīng)的appid以及對(duì)應(yīng)其他跨端的相關(guān)配置,目前只配置了小程序與web配置,沒有太多復(fù)雜東西,小程序只需要將微信公眾號(hào)新注冊(cè)的小程序appid填入即可
uni-app與web
如果沒有開發(fā)過小程序,貌似這東西很高大上,但其實(shí)并沒有太多新穎,微信小程序開發(fā)是有微信自己的一套語法API,有自己的標(biāo)簽,頁面生命周期鉤子,非常貼近vue語法。
掌握了vueJS與最基礎(chǔ)的web開發(fā),完全是很容易的上手小程序,而uni-app就是用vuejs語法開發(fā)小程序與跨端應(yīng)用的。
在uni-app頁面布局就是用view標(biāo)簽,在uni-app中,這是一個(gè)內(nèi)置組件,類似web中的div,是一個(gè)視圖容器,在uni-app中根組件必須使用view標(biāo)簽包裹。
當(dāng)然uni-app也提供了其他標(biāo)簽,比如scroll-view,swiper等,這些都是uni-app內(nèi)置的組件,在web開發(fā)中,我們會(huì)使用div,span,img等標(biāo)簽,但是uni-app最基礎(chǔ)的組件就是view,這個(gè)相當(dāng)div,我們使用的uni-app內(nèi)置組件非常有限,一般都是view與text,而在布局樣式上基本沒有什么太大的區(qū)別
在uni-app中提供了uni這樣的api訪問內(nèi)置的一些方法,比如設(shè)置緩存,獲取設(shè)備信息以及藍(lán)牙等設(shè)備信息,與普通不同的web不同的是,uni-app在其他小程序是無法訪問window對(duì)象,當(dāng)只有運(yùn)行h5時(shí),才是運(yùn)行在瀏覽器環(huán)境里,此時(shí)才可以訪問window,document對(duì)象,否則在其他平臺(tái)會(huì)報(bào)錯(cuò),所以此時(shí)你可以使用條件編譯來區(qū)分不同的端。
條件編譯
在同一個(gè)工程項(xiàng)目里使用條件編譯有選擇的編譯需要的代碼
下面這塊代碼使用條件編譯,我們發(fā)現(xiàn)是以單行注釋的方式定義編譯條件的,這塊代碼只會(huì)在H5端有作用
// #ifdef H5
window.location.href = 'xxx';
// #endif
在模版中的條件編譯
<!-- #ifdef H5 -->
<view>只會(huì)在H5顯示的內(nèi)容</view>
<!-- #endif -->
在css中的條件編譯
/* #ifdef H5 */
.h5box {
width: 100%;
height: 100rpx;
}
/* #endif */
我們只需要// #ifdef %PLATFORM% 開始,以// #endif結(jié)尾就可以標(biāo)注這塊代碼塊的條件編譯
%PLATFORM%的取值參考官方文檔PLATFORM[5]
條件編譯真的是維護(hù)多端差異的一種必要手段,因?yàn)槎喽瞬町愒谕粋€(gè)工程中,我使用該技術(shù)就可區(qū)別化不同端。
最后,最近寫了一個(gè)個(gè)人小程序,前端就是使用uni-app開發(fā)的,后端使用uni-Cloud,有使用官方的插件uni-ui也有uView,登陸注冊(cè)使用的就是官方的uni-id-pages,小程序后臺(tái)使用的是uni-admin開發(fā),基本實(shí)現(xiàn)了首頁所有模塊的增刪查改。
總結(jié)
主要認(rèn)識(shí)一個(gè)最簡(jiǎn)單的uni-app項(xiàng)目,了解項(xiàng)目基本結(jié)構(gòu),以及對(duì)HBuilderX創(chuàng)建uni-app的初步認(rèn)識(shí)
在uni-app關(guān)鍵的pages.json與mainifest.json相關(guān)配置項(xiàng),當(dāng)你新建頁面時(shí),會(huì)在pages.json的pages注冊(cè)路由,在tabBar中配置底部切換,mainifest主要是小程序端的appid,其他也沒什么太多的配置
eazycom自動(dòng)注冊(cè)全局組件,這種方式主要是遵循官方規(guī)范即可,全局組件主要有uni_moudles與components兩種方式,也可在pages.json中自定義設(shè)置eazycom規(guī)則,默認(rèn)是自動(dòng)啟動(dòng)eazycom
認(rèn)識(shí)uni-app與普通web開發(fā)的一些不同,知道條件編譯可以區(qū)分不同端,使用uni-app幾本內(nèi)置組件布局。小程序開發(fā)并沒那么高大上,門檻也沒有想象那么大,所以有小程序需求,如果是跨端項(xiàng)目,那么uni-app是一種比較可靠的技術(shù)方案
本文示例code example[6]
參考資料
[1]
HbuilderX: https://uniapp.dcloud.net.cn/quickstart-hx.html
[2]
服務(wù)空間: https://unicloud.dcloud.net.cn/
[3]
pages: https://uniapp.dcloud.net.cn/collocation/pages.html#pages
[4]
router: https://uniapp.dcloud.net.cn/api/router.html#
[5]
PLATFORM: https://uniapp.dcloud.net.cn/tutorial/platform.html
[6]
code example: https://github.com/maicFir/lessonNote/tree/master/uni-app/02-uni-demo
作者:Maic
歡迎關(guān)注微信公眾號(hào) :web技術(shù)學(xué)苑