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