Skip to content

小程序代碼結構

1.JSON配置

JSON是一種數據格式,並不是程序設計語言,在小程序中,JSON扮演的靜態配置的角色。

我們可以看到在項目的根目錄有一個app.json和project.config.json,此外在pages/logs目錄下還有一個logs.json,我們依次來說明一下它們的用途。

1.1小程序配置app.json

app.json是當前小程序的全局配置,包括了小程序的所有頁面路徑、介面表現、網絡超時時間、底部tab等。

js
{
  "pages":[
    "pages/index/index",
    "pages/logs/logs"
  ],
  "window":{
    "backgroundTextStyle":"light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "TCMPP",
    "navigationBarTextStyle":"black"
  }
}

我們簡單說一下這個配置各個項的含義:

  • pages欄位:用於描述當前小程序所有頁面路徑,這是為了讓宿主用戶端知道當前您的小程序頁面定義在哪個目錄。
  • Window欄位:定義小程序所有頁面的頂部背景顏色,文字顏色定義等。

其他配置項細節可以參考文件 小程序配置app.json

1.2工具配置project.config.json

通常大家在使用一個工具的時候,都會針對各自喜好做一些個性化配置,例如編譯配置,當您換了另外一臺電腦重新安裝工具的時候,您還要重新配置。

考慮到這點,小程序開發者工具在每個項目的根目錄都會生成一個project.config.json,您在開發者工具上做的任何配置都會寫入到這個檔,當您重新安裝工具或者換電腦工作時,您只要載入同一個項目的代碼包,開發者工具就自動會幫您恢復到當時您開發專案時的個性化配置,其中會包括項目名字、代碼上傳時自動壓縮等等一系列選項。

1.3頁面配置page.json

這裡的page.json其實用來表示pages/logs目錄下的logs.json這類和小程序頁面相關的配置。

如果您整個小程序的風格是藍色調,那麼您可以在app.json裡邊聲明頂部顏色是藍色即可實際情況可能每個頁面都有不一樣的色調來區分不同功能模組,囙此我們提供了page.json,讓開發者可以獨立定義每個頁面的一些内容,例如剛剛說的頂部顏色、是否允許下拉刷新等等。

其他配置項細節可以參考文件 頁面配置

1.4JSON語法

這裡說一下小程序裏JSON配置的一些注意事項。

JSON 檔案都是被包裹在一個大括號中 {},透過 key-value 的方式來表達資料。 JSON 的 Key 必須包裹在一個雙引號中,在實作中,寫 JSON 的時候,忘了給 Key 值加雙引號或是把雙引號寫成單引號是常見錯誤。

TIP

1.JSON的值只能是以下幾種數據格式,其他任何格式都會觸發報錯,例如JavaScript中的undefined。

  • 數位,包含浮點數和整數;
  • 字串,需要包裹在雙引號中;
  • Bool值,true或者false;
  • 數組,需要包裹在方括號中[];
  • 對象,需要包裹在大括號中{};
  • Null

2.還需要注意的是JSON文件中無法使用注釋,試圖添加注釋將會引發報錯。

2.WXML 模板

從事過網頁程序設計的人知道,網頁程序設計採用的是HTML + CSS + JS這樣的組合,其中HTML是用來描述當前這個頁面的結構,CSS用來描述頁面的樣子,JS通常是用來處理這個頁面和用戶的互動。

同樣道理,在小程序中也有同樣的角色,其中WXML充當的就是類似HTML的角色打開pages/index/index.wxml,您會看到以下的內容:

js

<view class="container">  
  <view class="userinfo">    
    <button wx:if="{{!hasUserInfo && canIUse}}"> getUserInfo </button>    
    <block wx:else>      
      <image src="{{userInfo.avatarUrl}}" background-size="cover"></image>      
      <text class="userinfo-nickname">{{userInfo.nickName}}</text>    
    </block>  
  </view>  
  <view class="usermotto">    
    <text class="user-motto">{{motto}}</text>  
  </view>
</view>

和HTML非常相似,WXML由標籤、内容等等構成但是也有很多不一樣的地方,我們來一一闡述一下:

1.標籤名字不一樣

往往寫HTML的時候,經常會用到的標籤是<div>,< p>, <span>, 開發者在寫一個頁面的時候可以根據這些基礎的標籤組合出不一樣的組件,例如行事曆、彈窗等換個思路,既然大家都需要這些組件,為什麼我們不能把這些常用的組件包裝起來,大大提高我們的開發效率。

從上邊的例子可以看到,小程序的WXML用的標籤是view,button,text等,這些標籤就是小程序給開發者包裝好的基本能力,我們還提供了地圖、視頻、音訊等等組件能力。

2.多了一些 wx:if 這樣的屬性以及 {{ }} 這樣的表達式

在打開網頁的流程中,我們通常會通過JS操作DOM(對應HTML的描述產生的樹),以引起介面的一些變化響應用戶的行為例如,用戶按一下某個按鈕的時候,JS會記錄一些狀態到JS變量裡邊,同時通過DOM API操控DOM的内容或者行為,進而引起介面一些變化當項目越來越大的時候,您的代碼會充斥著非常多的介面互動邏輯和程序的各種狀態變量,顯然這不是一個很好的開發模式,囙此就有了MVVM的開發模式(例如React,Vue),提倡把渲染和邏輯分離簡單來說就是不要再讓JS直接操控DOM,JS只需要管理狀態即可,然後再通過一種模版語法來描述狀態和介面結構的關係即可。

小程序的框架也是用到了這個思路,如果您需要把一個Hello World的字串顯示在介面上。

WXML需要這麼寫:

js
<text>{{msg}}</text>

JS只需要管理狀態即可:

js
this.setData({ msg: "Hello World" })

透過 {{ }} 的語法把一個變數綁定到介面上,我們稱為資料綁定。光是透過資料綁定還不夠完整的描述狀態和介面的關係,還需要 if/else,for等控制能力,在小程序裡邊,這些控制能力都用 wx:開頭的屬性來表達。

更詳細的文件可以參考 WXML語法參攷

3.WXSS樣式

WXSS具有CSS大部分的特性,小程序在WXSS也做了一些擴充和修改。

  1. 新增了尺寸單位在寫CSS樣式時,開發者需要考慮到手機設備的荧幕會有不同的寬度和設備點數比,採用一些技巧來換算一些點數單位WXSS在底層支持新的尺寸單位rpx,開發者可以免去換算的煩惱,只要交給小程序底層來換算即可,由於換算採用的浮點數運算,所以運算結果會和預期結果有一點點偏差。
  2. 提供了全域的樣式和局部樣式和前邊app.json, page.json的概念相同,您可以寫一個app.wxss作為全域樣式,會作用於當前小程序的所有頁面,局部頁面樣式page.wxss僅對當前頁面生效。
  3. 此外WXSS僅支持部分CSS選擇器。

更詳細的文件可以參考 渲染層-WXSS

4.JS邏輯互動

一個服務僅僅只有介面展示是不够的,還需要和用戶做互動:響應用戶的按一下、獲取用戶的位置等等在小程序裡邊,我們就通過編寫JS腳本文件來處理用戶的操作。

js
<view>{{ msg }}</view>
<button bindtap="clickMe">Click me</button>

按一下button按鈕的時候,我們希望把介面上msg顯示成'Hello World',於是我們在button上聲明一個内容: bindtap , 在JS文件裡邊聲明了clickMe方法來響應這次點擊操作:

js
Page({  
  clickMe: function() {    
    this.setData({ msg: "Hello World" })  
  }
})

響應用戶的操作就是這麼簡單,更詳細的事件可以參考文件 渲染層-事件