小程序學習(二)基本結構與文件的類型
注:因為一些原因,之前學習了一段小程序之后就斷了,沒有繼續學習。現在開始繼續學習小程序的開發。
學習一些新的東西,一般都是從官方給出的dome案例開始學習的,官方給出的Dome一般比較容易理解,也有一些詳細的注解和官方的說明文檔,學習起來比較快。下面就開始學習小程序官方給出的Dome。
因為小程序的功能更新很快,可能你看到這個文章的時候,小程序已經推出了很多的新的功能。所以功能還是以官方最新的Dome為准。
一、下載Dome
官方Dome 下載地址 。我下載的版本是2017011
二、打開Dome項目
使用小程序開發工具打開官方的Dome。打開工具,選擇小程序開發,選擇添加一個項目,將Dome項目添加進來。
添加項目時要填寫AppID,當然也可以不填寫,但是沒有AppID,一些功能可能會體驗不了,所以建議還是申請一個小程序的賬號。
賬號申請的流程和工具的使用,請看上一篇文章 小程序學習(一)入門學習 ,也可以看官方給出的說明。
下面就是項目打開后的界面,首先要了解的是整個程序的目錄結構和文件
三、了解小程序項目結構
折騰半天,終於可以一睹小程序真面目了。
首先在根目錄下,有四個文件夾 image、page、util、vendor和四個文件app.js、app.json、app.wxss、config.js
從名稱名稱看,比較容易理解
image :存放圖片文件
page :存放頁面文件
util :一般存放一些公用、通用的工具
vendor :一般存放一些第三方的組件,插件
文件應該都認識,js文件,json文件,只有一個wxss比較陌生。
其中 .js
后綴的是腳本文件,.json
后綴的文件是配置文件,.wxss
后綴的是樣式表文件 (一般前端的樣式文件是css,這個叫wxss,我理解為"微信ss")
app.js
是小程序的腳本代碼。我們可以在這個文件中監聽並處理小程序的生命周期函數、聲明全局變量。調用框架提供的豐富的 API。
可以理解成.Net中的Global文件。其中onLoauch、onShow、onHide、globalData分別為:頁面初始化、頁面顯示、頁面隱藏和全局數據。
getUserOpenId 是一個方法,獲取用戶的openId,給全局數據賦值。
1 const openIdUrl = require('./config').openIdUrl 2 3 App({ 4 onLaunch: function () { 5 console.log('App Launch') 6 }, 7 onShow: function () { 8 console.log('App Show') 9 }, 10 onHide: function () { 11 console.log('App Hide') 12 }, 13 globalData: { 14 hasLogin: false, 15 openid: null 16 }, 17 // lazy loading openid 18 getUserOpenId: function(callback) { 19 var self = this 20 21 if (self.globalData.openid) { 22 callback(null, self.globalData.openid) 23 } else { 24 wx.login({ 25 success: function(data) { 26 wx.request({ 27 url: openIdUrl, 28 data: { 29 code: data.code 30 }, 31 success: function(res) { 32 console.log('拉取openid成功', res) 33 self.globalData.openid = res.data.openid 34 callback(null, self.globalData.openid) 35 }, 36 fail: function(res) { 37 console.log('拉取用戶openid失敗,將無法正常使用開放接口等服務', res) 38 callback(res) 39 } 40 }) 41 }, 42 fail: function(err) { 43 console.log('wx.login 接口調用失敗,將無法正常使用開放接口等服務', err) 44 callback(err) 45 } 46 }) 47 } 48 } 49 })
app.json
是對整個小程序的全局配置。我們可以在這個文件中配置小程序是由哪些頁面組成,配置小程序的窗口的背景色,配置導航條樣式,配置默認標題。
需要注意的一點是:該文件不可添加任何注釋,這個還是比較少見的。
1 { 2 "pages": [ 3 "page/component/index", 4 5 "page/component/pages/view/view", 6 "page/component/pages/scroll-view/scroll-view", 7 "page/component/pages/swiper/swiper", 8 9 "page/API/pages/storage/storage" 10 ], 11 "window": { 12 "navigationBarTextStyle": "black", 13 "navigationBarTitleText": "演示", 14 "navigationBarBackgroundColor": "#F8F8F8", 15 "backgroundColor": "#F8F8F8" 16 }, 17 "tabBar": { 18 "color": "#7A7E83", 19 "selectedColor": "#3cc51f", 20 "borderStyle": "black", 21 "backgroundColor": "#ffffff", 22 "list": [{ 23 "pagePath": "page/component/index", 24 "iconPath": "image/icon_component.png", 25 "selectedIconPath": "image/icon_component_HL.png", 26 "text": "組件" 27 }, { 28 "pagePath": "page/API/index", 29 "iconPath": "image/icon_API.png", 30 "selectedIconPath": "image/icon_API_HL.png", 31 "text": "接口" 32 }] 33 }, 34 "networkTimeout": { 35 "request": 10000, 36 "connectSocket": 10000, 37 "uploadFile": 10000, 38 "downloadFile": 10000 39 }, 40 "debug": false 41 }
pages:注明該小程序下面所有的頁面,官方的dome遠不止上面這些頁面,我這里只是選擇一部分貼出。
window:默認頁面的窗口的標題、樣式等信息
tabBar:底部導航的樣式、菜單數量、菜單的圖標和鏈接頁面等信息
networkTimeout:各種網絡請求的超時時間
debug:是否開啟調試模式
app.wxss
整個小程序的公共樣式表。在所有的小程序頁面上可以直接使用該文件里面的樣式。這個里面樣式的寫法和CSS樣式的寫法基本是一致的,也支持CSS3的一些特性。
1 .demo-text-3{ 2 position: relative; 3 align-items: center; 4 justify-content: center; 5 background-color: #F1F1F1; 6 color: #353535; 7 font-size: 36rpx; 8 } 9 .demo-text-3:before{ 10 content: 'C'; 11 position: absolute; 12 top: 50%; 13 left: 50%; 14 transform: translate(-50%, -50%); 15 }
config.js
小程序的配置文件。這個在之前的小程序中是沒有的。文件中主要的配置信息是一些連接服務器接口的地址。文件里推薦的騰訊雲的服務器,騰訊提供了現有的小程序后台的解決方案,可以直接部署在騰訊雲的服務器上使用。這里的相關配置也是參照騰訊提供的小程序后台設置的。有自己服務器的,也可以使用自己服務器上的后台接口地址。

1 1 // 此處主機域名是騰訊雲解決方案分配的域名 2 2 // 小程序后台服務解決方案:https://www.qcloud.com/solution/la 3 3 4 4 var host = "14592619.qcloud.la" 5 5 6 6 var config = { 7 7 8 8 // 下面的地址配合雲端 Server 工作 9 9 host, 10 10 11 11 // 登錄地址,用於建立會話 12 12 loginUrl: `https://${host}/login`, 13 13 14 14 // 測試的請求地址,用於測試會話 15 15 requestUrl: `https://${host}/testRequest`, 16 16 17 17 // 用code換取openId 18 18 openIdUrl: `https://${host}/openid`, 19 19 20 20 // 測試的信道服務接口 21 21 tunnelUrl: `https://${host}/tunnel`, 22 22 23 23 // 生成支付訂單的接口 24 24 paymentUrl: `https://${host}/payment`, 25 25 26 26 // 發送模板消息接口 27 27 templateMessageUrl: `https://${host}/templateMessage`, 28 28 29 29 // 上傳文件接口 30 30 uploadFileUrl: `https://${host}/upload`, 31 31 32 32 // 下載示例圖片接口 33 33 downloadExampleUrl: `https://${host}/static/weapp.jpg` 34 34 }; 35 35 36 36 module.exports = config
上面的一些都是一些全局的文件。下面看一下小程序頁面的文件結構。頁面一般都是存放Page文件夾下面,當然也可以存放在其他路徑下面。
小程序頁面主要分4個文件,分別為 index.js 、 index.json 、 index.wxml 、index.wxss。當我們創建一個小程序頁面時,會自動生成這4個文件。
index.js
頁面的腳本文件,在這個文件中我們可以監聽並處理頁面的生命周期函數、獲取小程序實例,聲明並處理數據,響應頁面交互事件等。

1 //index.js 2 //獲取應用實例 3 const app = getApp() 4 5 Page({ 6 data: { 7 motto: 'Hello World', 8 userInfo: {}, 9 hasUserInfo: false 10 }, 11 //事件處理函數 12 bindViewTap: function() { 13 wx.navigateTo({ 14 url: '../logs/logs' 15 }) 16 }, 17 onLoad: function () { 18 if (app.globalData.userInfo) { 19 this.setData({ 20 userInfo: app.globalData.userInfo, 21 hasUserInfo: true 22 }) 23 } else { 24 // 由於 getUserInfo 是網絡請求,可能會在 Page.onLoad 之后才返回 25 // 所以此處加入 callback 以防止這種情況 26 app.userInfoReadyCallback = res => { 27 this.setData({ 28 userInfo: res.userInfo, 29 hasUserInfo: true 30 }) 31 } 32 } 33 }, 34 getUserInfo: function(e) { 35 this.setData({ 36 userInfo: e.detail.userInfo, 37 hasUserInfo: true 38 }) 39 } 40 })
index.json
頁面的配置文件。當有頁面的配置文件時,配置項在該頁面會覆蓋 app.json 的 window 中相同的配置項。如果沒有指定的頁面配置文件,則在該頁面直接使用 app.json 中的默認配置。

1 //logs.js 2 const util = require('../../utils/util.js') 3 4 Page({ 5 data: { 6 logs: [] 7 }, 8 onLoad: function () { 9 this.setData({ 10 logs: (wx.getStorageSync('logs') || []).map(log => { 11 return util.formatTime(new Date(log)) 12 }) 13 }) 14 } 15 })
index.wxml
頁面的結構文件。頁面的編寫方式和HTML類似。不過里面的標簽種類不是很多。常用的就是view標簽,和div類似。下面使用到的標簽有 view、block、navigator、image 。
<view class="index"> <view class="index-hd"> <image class="index-logo" src="resources/kind/logo.png"></image> <view class="index-desc">以下將演示小程序接口能力,具體屬性參數詳見小程序開發文檔。</view> </view> <view class="index-bd"> <view class="kind-list"> <block wx:for-items="{{list}}" wx:key="{{item.id}}"> <view class="kind-list-item"> <view id="{{item.id}}" class="kind-list-item-hd {{item.open ? 'kind-list-item-hd-show' : ''}}" bindtap="kindToggle"> <view class="kind-list-text">{{item.name}}</view> <image class="kind-list-img" src="resources/kind/{{item.id}}.png"></image> </view> <view class="kind-list-item-bd {{item.open ? 'kind-list-item-bd-show' : ''}}"> <view class="navigator-box {{item.open ? 'navigator-box-show' : ''}}"> <block wx:for-items="{{item.pages}}" wx:for-item="page" wx:key="*item"> <navigator url="pages/{{page.url}}" class="navigator"> <view class="navigator-text">{{page.zh}}</view> <view class="navigator-arrow"></view> </navigator> </block> </view> </view> </view> </block> </view> </view> </view>
index.wxss
當前頁面使用的樣式表文件,這個樣式表和之前我們看到的app.wxss不同。這個樣式文件只對當前頁面生效。
以上就是小程序的基本結構以及常用文件的類型和作用