對於開發者而言,小程序開發門檻相對較低,難度不及原生APP開發和h5開發,可以知足簡單的基礎應用,適合生活服務類線下商鋪以及非剛需低頻應用。javascript
2016年1月11日,微信之父張小龍解讀了微信的四大價值觀,並提出正在研究新的形態-「微信小程序」;html
_四大價值觀:_1.一切以用戶價值爲依歸;1.讓創造發揮價值;3.一個好的東西(或者工具)是用完即走的;4.儘量的讓商業化存在於無形之中。前端
2016年9月21日,微信小程序正式開啓內測,騰訊雲正式上線微信小程序解決方案,提供小程序在雲端服務器的技術方案;vue
2017年1月9日,歷時一年,第一批小程序正式上線;java
2017年12月28日,微信更新的 6.6.1 版本開放了小遊戲,微信啓動頁面還重點推薦了小遊戲「跳一跳」,並在首頁下拉中可查看本身最近訪問的小程序。node
1.官方微信公衆平臺有涉及開發各階段的比較健全的文檔。是開發者最好的學習途徑;
2.微信開發者工具;
3.微信承載着小程序的整個流程。包括 接入 + 開發 + 調試 + 編譯 + 測試 + 上傳發布 + 推廣運行等。
4.小程序並不等同於h5項目;二者有明顯的區別;jquery
官網對使用接入流程及使用有詳細的介紹。android
根據指引填寫信息和提交相應的資料,在微信公衆平臺註冊小程序。快速跳轉git
填寫小程序基本信息,包括名稱、頭像、服務範圍等。設置
管理員設置、項目成員及權限配置
小程序ID及祕鑰
服務器域名配置
騰訊雲配置
開發者工具es6
完成小程序開發配置後,開發者可下載開發者工具參考開發文檔進行小程序的開發和調試。
完成小程序開發後,提交代碼至微信團隊審覈,審覈經過後便可發佈。
雲真機測試
區別於H5移動端開發時的開發工具+瀏覽器Device Mode預覽的模式,小程序的開發有基於本身的開發者工具。微信官方推出的微信開發者工具,集成了公衆號網頁調試和小程序調試兩種開發模式。
咱們已經習慣於在webstorm等IDE工具上快捷開發,微信開發者工具上編碼總感受不是那麼流暢。
固然小程序編碼徹底能夠在這些編輯器上進行,但目前各IDE工具尚未比較全方位的插件來替代快速開發,只有一些不太完整的插件。且就算在其餘工具開發代碼,仍是離不開微信開發者工具的配合。查看效果、調試頁面等目前還需在開發者工具進行。
在webstorm編寫代碼,首先要識別.wxss和.wxml需配置文件類型:如:
咱們接觸使用過好幾種前端MVVM框架或者前端模板引擎,能夠把小程序理解爲相似vue的h5前端框架,不過也存在着明顯的差別。
小程序不是HTML5,本質上是HyBrid技術的應用。Hybrid App(混合模式移動應用)是介於Native App(原生)、以 HTML5 爲表明的 Web App(基於Web的系統和應用)二者之間的app,它就是Native結合Web混合開發,所以兼具了Native App的大部分優點,也兼具Web App使用H5跨平臺開發低成本的特色。
固然微信小程序的總體開發語法偏向H5,但編譯運行等則差別明顯。
- 在 iOS 上,小程序的 javascript 代碼是運行在 JavaScriptCore 中,是由 WKWebView 來渲染的,環境有 iOS八、iOS九、iOS10;
- 在 Android 上,小程序的 javascript 代碼是經過 X5 JSCore來解析,是由 X5 基於 Mobile Chrome 53/57 內核來渲染的;
- 在 開發工具 上,小程序的 javascript 代碼是運行在 nwjs 中,是由 Chrome Webview 來渲染的;
- 傳統HTML5在加載的時候受限於網絡環境,須要順序加載HTML、CSS、JS,而後返回數據,最後渲染頁面顯 示在瀏覽器中。用戶常常須要等待很長時間,體驗會受到影響。
- 相比之下,小程序的兩個線程:Appservice Thread和View Thread會同時進行、並行加載,甚至Appservice Thread會更早執行,當視圖線程加載完,通知Appservice,Appservice 會把準備好的數據用setData的方法返回給視圖線程。
小程序的這種優化策略,能夠減小用戶的等待時間、加快小程序的響應速度。
參考文檔
此外開發的具體區別見下文。
微信小程序開發門檻低,除了基於javaScript的語法入門簡單的特色,還歸功於官網提供了整個開發流程詳盡的參考文檔,減小自行摸石頭過河的時間;官方開發者社區也提供了開發者互相交流、分享經驗、反饋bug,快速解決問題的開放平臺(目前帖子很少-.-!)。
快速入口:接入指南、設計規範、開發指南、框架設計、基礎組件、微信原生API、開發者工具、運營規範、數據分析; 開發者社區; 微信小遊戲開放中...微信小遊戲文檔連接(臨時)
有h5開發、vue框架等開發經驗,大概看一下文檔,進行微信開發毫無障礙。具體開發
網上有基於小程序的開發框架及UI組件, 同時可藉助網上已有開源項目熟悉具體項目開發。 做爲參考:微信小程序開源項目庫集合、微信小程序資源整理(比較老舊);
具體開發前最好先熟悉一下微信開發者工具!
在小程序默認的項目模板基礎上開發。
創建普通快速啓動模板選項
能夠快速創建一個dome項目結構。
- json 後綴的 JSON 配置文件
- wxml 後綴的 WXML 模板文件
- wxss 後綴的 WXSS 樣式文件
- js 後綴的 JS 腳本邏輯文件
- .wxs 後綴的 小程序 腳本文件
其中根目錄下的app.json、app.js是必須的,文件名不能修改。(app.json做爲入口文件,缺失直接致使項目沒法運行;缺失app.js會致使沒法預覽、沒法上傳)。
具體每一個頁面中四種類型文件名保持一致,小程序加載頁面時,會根據頁面路徑,讀取該路徑下同名的其餘幾個文件類型。
在項目的根目錄有一個 app.json
和 project.config.json
配置文件
app.json
app.json
文件用來對微信小程序進行全局配置,決定頁面文件的路徑、窗口表現、設置網絡超時時間、設置多 tab 等。
"pages": [ // 當前小程序全部頁面路徑配置 *小程序中新增/減小頁面,都須要對 pages 數組進行修改*
"pages/index/index", // 數組第一項會被指定爲程序的首頁
"pages/logs/logs"
],
"window": { // 全局樣式配置,設置小程序的狀態欄、導航條、標題、窗口背景色
"backgroundTextStyle": "light",
"navigationBarBackgroundColor": "#fff",
"navigationBarTitleText": "微信小程序",
"navigationBarTextStyle": "black"
},
"tabBar": { // 底部或頂部的 tab 欄配置,可配置顏色、點擊表現等,點擊能夠切換頁面
"color": "#6e6d6b",
"selectedColor": "#e64340",
"borderStyle": "black",
"backgroundColor": "#D2F2A1",
"list": [ // tab欄只能配置最少2個、最多5個,tab 按數組的順序排序。
{
"pagePath": "pages/index/index",
"iconPath": "images/nav/home-off.png",
"selectedIconPath": "images/nav/home-on.png",
"text": "首頁"
},
{
"pagePath": "pages/my/index",
"iconPath": "images/nav/my-off.png",
"selectedIconPath": "images/nav/my-on.png",
"text": "個人"
}
]
},
"networkTimeout": { // 能夠設置各類網絡請求的超時時間
"request": 10000,
"downloadFile": 10000
},
"debug": true // 是否在開發者工具中開啓 debug 模式,方便調試
複製代碼
配置項細節能夠參考文檔 小程序的配置app.json;
project.config.json
工具的一些個性化配置,例如界面顏色、編譯配置等。
配置項細節能夠參考文檔 [開發者工具的配置](mp.weixin.qq.com/debug/wxado… %E7%8A%B6%E6%80%81%E5%B1%95%E7%A4%BA)。
page.json
能夠對本頁面的窗口表現、屬性進行配置,例如具體頁面頂部顏色、是否容許下拉刷新等等。頁面中配置項會覆蓋 app.json 的 window 中相同的配置項。
配置項細節能夠參考文檔
[官方文檔]
在小程序中全部頁面的路由所有由框架進行管理。須要在app.json中配置好頁面路徑信息,多tab欄應用一樣設置好頁面路徑。
快速新建路由及頁面的兩種方法:
1.開發者工具編輯器中新建目錄後新建page;
2.app.json文件中pages下直接增長目錄頁面路徑,保存後自動生成頁面目錄。
小程序以頁面棧的形式維護了當前的全部頁面,表現爲路由頁面切換的規則,當發生路由切換的時候,內部維護出入棧數據。入棧則是至關因而 緩存了頁面加載的路徑,出棧則至關因而清除了頁面加載路徑,當清除後,點擊返回按鈕時,則不會返回,或則就不存在返回按鈕。
不一樣的路由切換方式,頁面棧的表現不一樣,以下圖:
getCurrentPages()
函數用於獲取當前頁面棧的實例,以數組形式按棧的順序給出,第一個元素爲首頁,最後一個元素爲當前頁面。 不要嘗試修改頁面棧,會致使路由以及頁面狀態錯誤。
可直接調用查看當前頁面棧,看下圖,包含的信息比較豐富。
跳轉的頁面必需要在app.json中註冊。
路由觸發方式有 API 調用(5種方法)、navigator 組件跳轉[文檔] 和 Tab 切換三種方式;
對於路由的觸發方式以及頁面生命週期函數以下:
api接口說明,配合頁面棧的表現理解:
wx.navigateTo
,原頁面保留,可以使用wx.navigateBack
返回到原頁面,只能打開非 tabBar 的頁面的路徑。wx.redirectTo
頁面重定向,關閉當前頁面,只能打開非 tabBar 的頁面的路徑。wx.navigateBack
,關閉當前頁面,返回上一頁面或多級頁面。可經過 getCurrentPages()) 獲取當前的頁面棧,決定須要返回幾層。wx.switchTab
,跳轉到 tabBar 頁面,並關閉其餘全部非 tabBar 頁面,只能打開 tabBar 頁面。wx.reLaunch
,關閉全部頁面,從新打開到應用內的某個頁面,重啓動,能夠打開任意頁面。navigator組件內的open-type屬性值與api對應,調用效果一致。
小程序啓動會有兩種狀況,一種是「冷啓動」,一種是「熱啓動」。
假如用戶已經打開過某小程序,而後在必定時間內再次打開該小程序,此時無需從新啓動,只需將後臺態的小程序切換到前臺,這個過程就是熱啓動;
冷啓動指的是用戶首次打開或小程序被微信主動銷燬後再次打開的狀況,此時小程序須要從新加載啓動。
當用戶點擊左上角關閉,或者按了設備 Home 鍵離開微信,小程序並無直接銷燬,而是進入了後臺;當再次進入微信或再次打開小程序,又會從後臺進入前臺。須要注意的是:只有當小程序進入後臺必定時間,或者系統資源佔用太高,纔會被真正的銷燬。
小程序沒有重啓的概念,當小程序進入後臺,客戶端會維持一段時間的運行狀態,超過必定時間後(目前是5分鐘)會被微信主動銷燬;
置頂的小程序不會被微信主動銷燬;
當收到系統內存告警也會進行小程序的銷燬;
小程序冷啓動時若是發現有新版本,將會異步下載新版本的代碼包,並同時用客戶端本地的包進行啓動,即新版本的小程序須要等下一次冷啓動纔會應用上。
小程序中的javaScript腳本支持大部分ES6語法(部分特性受運行內核影響,支持程度不一樣);也支持模塊化;能夠調用微信特有的API。
但沒有操做DOM的能力(Js語言自己就是不包括DOM操做的,DOM操做是瀏覽器環境爲JS作的擴展)。
負責與WXHL進行交互,包括用戶操做事件、頁面組件的配置參數變更。調用微信原生API,實現豐富的手機端操做功能。
小程序app.js中使用 App()
函數用來註冊一個小程序。接受一個 object 參數,其指定小程序的生命週期函數等。 (多個app()註冊都會執行)
例子:
App({
/**
* 當小程序初始化完成時,會觸發 onLaunch(全局只觸發一次)
*/
onLaunch: function () {
// 展現本地存儲能力
var logs = wx.getStorageSync('logs') || []
logs.unshift(Date.now())
wx.setStorageSync('logs', logs)
// 登陸
wx.login({
success: res => {
// 發送 res.code 到後臺換取 openId, sessionKey, unionId
}
})
// 獲取用戶信息
wx.getSetting({
success: res => {
if (res.authSetting['scope.userInfo']) {
// 已經受權,能夠直接調用 getUserInfo 獲取頭像暱稱,不會彈框
wx.getUserInfo({
success: res => {
// 能夠將 res 發送給後臺解碼出 unionId
this.globalData.userInfo = res.userInfo
// 因爲 getUserInfo 是網絡請求,可能會在 Page.onLoad 以後才返回
// 因此此處加入 callback 以防止這種狀況
if (this.userInfoReadyCallback) {
this.userInfoReadyCallback(res)
}
}
})
}
}
})
},
/**
* 當小程序啓動,或從後臺進入前臺顯示,會觸發 onShow
*/
onShow: function (options) {
},
/**
* 當小程序從前臺進入後臺,會觸發 onHide
*/
onHide: function () {
},
/**
* 當小程序發生腳本錯誤,或者 api 調用失敗時,會觸發 onError 並帶上錯誤信息
*/
onError: function (msg) {
},
globalData: { // 全局變量
userInfo: null
}
})
複製代碼
約定 在app()
函數的globalData
對象中設置全局變量。其餘邏輯層中經過getApp()獲取實例後讀取全局變量。
[官方文檔]
頁面事件處理函數、生命週期、setData()函數更新頁面數據等查看文檔。
Page()
函數用來註冊一個頁面。
Page函數接受一個 object 參數,用以指定頁面的初始數據、生命週期函數、事件處理函數等。
object 參數內容在頁面加載時會進行一次深拷貝,需考慮數據大小對頁面加載的開銷,下圖爲參數概要:
把data對象稱爲初始數據,是由於在頁面第一次渲染時,data對象會以 JSON 的形式由邏輯層傳至渲染層,渲染層經過 WXML 對數據進行綁定。 然後續直接更改data對象值,將沒法改變頁面的狀態,會形成數據不一致(這不一樣於Vue、angular的數據雙向綁定)。
其數據必須是能夠轉成 JSON 的格式:字符串,數字,布爾值,對象,數組。
邏輯層更新視圖層頁面數據,須要調用setData
函數。他是Page原型上添加的方法Page.prototype.setData()
。setData
函數調用時改變對應的 this.data 的值(同步),將數據從邏輯層發送到視圖層(異步)。
第二個參數callback(選填) 是一個回調函數,在此次setData對界面渲染完畢後調用。
* 1.5.0基礎庫後才支持callback;
* 單次設置的數據不能超過1024kB,請儘可能避免一次設置過多的數據。
* 請不要把 data 中任何一項的 value 設爲 undefined ,不然這一項將不被設置並可能遺留一些潛在問題。
複製代碼
生命週期函數的調用詳見頁面路由中
onLoad: 頁面加載
一個頁面只會調用一次,能夠在 onLoad 中獲取打開當前頁面所調用的 query 參數。
複製代碼
onShow: 頁面顯示
每次打開頁面都會調用一次
複製代碼
onReady: 頁面初次渲染完成
一個頁面只會調用一次,表明頁面已經準備穩當,能夠和視圖層進行交互。
對界面的設置如wx.setNavigationBarTitle請在onReady以後設置。詳見生命週期
複製代碼
onHide: 頁面隱藏
當navigateTo或底部tab切換時調用。
複製代碼
onUnload: 頁面卸載
當redirectTo或navigateBack的時候調用。
複製代碼
onPullDownRefresh: 下拉刷新
監聽用戶下拉刷新事件。
須要在app.json的window選項中或頁面配置中開啓enablePullDownRefresh。
當處理完數據刷新後,wx.stopPullDownRefresh能夠中止當前頁面的下拉刷新。
複製代碼
onReachBottom: 上拉觸底
監聽用戶上拉觸底事件。
能夠在app.json的window選項中或頁面配置中設置觸發距離onReachBottomDistance。
在觸發距離內滑動期間,本事件只會被觸發一次。
複製代碼
onPageScroll: 頁面滾動
監聽用戶滑動頁面事件。
參數爲 Object,包含如下字段:scrollTop(頁面在垂直方向已滾動的距離(單位px))
複製代碼
onShareAppMessage: 用戶轉發
只有定義了此事件處理函數,右上角菜單纔會顯示「轉發」按鈕。
用戶點擊轉發按鈕的時候會調用。
此事件須要 return 一個 Object,用於自定義轉發內容。
自定義轉發字段Object,包含兩個字段title和path:
{
title: '自定義轉發標題',
path: '/page/user?id=123'
}
複製代碼
除了初始化數據和生命週期函數,Page 中還能夠定義自定義一些特殊的函數:事件處理函數。在渲染層能夠在組件中加入事件綁定,當達到觸發事件時,就會執行 Page 中定義的事件處理函數。
實例代碼:
<!--WXML-->
<view bindtap="viewTap"> click me </view>
複製代碼
// js
Page({
viewTap: function() {
console.log('view tap')
}
})
複製代碼
小程序秉承了JavaScript模塊化的機制,採用CommonJS規範,經過module.exports暴露對象,經過require來獲取對象。
能夠將一些公共的代碼抽離成爲一個單獨的 js 文件,做爲一個模塊。模塊只有經過 module.exports 或者 exports 才能對外暴露接口。
function sayHello(name) {
console.log(`Hello ${name} !`)
}
function sayGoodbye(name) {
console.log(`Goodbye ${name} !`)
}
module.exports.sayHello = sayHello
exports.sayGoodbye = sayGoodbye
複製代碼
在須要使用這些模塊的文件中,使用 require(path) 將公共代碼引入。
Page({
helloMINA: function() {
common.sayHello('MINA')
},
goodbyeMINA: function() {
common.sayGoodbye('MINA')
}
})
複製代碼
require 暫時不支持絕對路徑;
小程序目前不支持直接引入 node_modules ,使用第三方模塊時,沒法經過require直接導入模塊,須要對第三方模塊強制導出後才能正常導入。
複製代碼
[官方文檔]WXS(WeiXin Script
)是小程序的一套腳本語言,結合 WXML,能夠構建出頁面的結構。
- wxs 不依賴於運行時的基礎庫版本,能夠在全部版本的小程序中運行。
- wxs 與 javascript 是不一樣的語言,有本身的語法,並不和 javascript 一致。
- wxs 的運行環境和其餘 javascript 代碼是隔離的,wxs 中不能調用其餘 javascript 文件中定義的函數,也不能調用小程序提供的API。
- wxs 函數不能做爲組件的事件回調。
- 因爲運行環境的差別,在 iOS 設備上小程序內的 wxs 會比 javascript 代碼快 2 ~ 20 倍。在 android 設備上兩者運行效率無差別。
微信爲咱們提供了兩個使用 WXS 方法:直接插入 WXS 代碼,以及引用 WXS 文件。
<!--wxml中直接插入WXS標籤的代碼-->
<wxs module="m1">
var msg = "hello world";
module.exports.message = msg;
</wxs>
<view> {{m1.message}} </view>
<!--wxml中引用對應路徑下的WXS文件-->
<wxs module='hello' src='./test.wxs'>
複製代碼
每個 WXS 模塊,都須要用 module 標籤進行命名。命名模塊後,開發者工具才能正常進行編譯、在 WXML 中引用模塊中的變量與函數。
WXS有本身的語法,並不與JS徹底一致
(與HTML區別)
<view class="container">
<view class="userinfo">
<button wx:if="{{!hasUserInfo && canIUse}}"> 獲取頭像暱稱 </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>
複製代碼
<!--import-->
<import src="../template/a.wxml"/>
<!--include-->
<include src="../include/footer.wxml"/>
複製代碼
文件引入在小程序作模塊化拆分的過程當中很是重要。
5.可插入 wxs
標籤的小程序腳本語言。
(附WXSS與CSS的區別)
[官方文檔-WXSS]
WXSS 具備 CSS 大部分特性。同時爲了更適合開發微信小程序,WXSS 對 CSS 進行了擴充以及修改;
.class, #id, element, ele,ele, ::before, ::after
。官方文檔上暫並未說明支持後代選擇器。即便支持也不要使用,以避免出現沒必要要的bug。@import
語句能夠導入外聯樣式表,@import
後跟須要導入的外聯樣式表的相對路徑,用;表示語句結束。6.background-image
只能用網絡url或者base64 . 本地圖片要用image標籤才行。
微信小程序框架自己也是一個UI框架,基礎實用的樣式在組件裏就提供了,大大減小開發者設置樣式的時間。
[官方文檔]
快速查看效果:[小程序官方demo]
什麼是組件?
組件是視圖層的基本組成單元,與HTML頁面標籤同樣,一個組件一般包括開始標籤
和結束標籤
,``屬性用來修飾這個組件,內容
在兩個標籤以內。
框架爲開發者提供了一系列基礎組件,它們自帶一些微信風格的樣式。開發者能夠經過組合這些基礎組件進行快速開發。
基礎組件根據使用場景,分爲如下七大類:
視圖容器、 基礎內容、 表單組件、 表單、導航、 多媒體、 地圖、 畫布、 客服。
自定義組件
[官方文檔]
從小程序基礎庫版本
1.6.3
開始,小程序支持簡潔的組件化編程。 開發者能夠將頁面內的功能模塊抽象成自定義組件,以便在不一樣的頁面中重複使用;也能夠將複雜的頁面拆分紅多個低耦合的模塊,有助於代碼維護。自定義組件在使用時與基礎組件很是類似。
自定義組件的寫法與用法有些不一樣。一個例子
[官方文檔]
快速查看效果:[小程序官方demo]
小程序開發框架提供豐富的微信原生 API,能夠方便的調起微信提供的能力,如獲取用戶信息,本地存儲,支付功能等。
說明:
開發要點(草稿):
1.頁面路由說明、跳轉、與其餘路由方式對比、函數api;
2.WXML寫法區別,組件、模板、class。交互、數據驅動原理;
3.WXSS寫法區別、 動畫寫法
4.頁面js寫法、生命週期函數。 全局變量、模塊化;setData()同步頁面數據
5.微信Api。
6.網絡請求,與服務器的先後端交互。
7.es6寫法的體現,promise ;
8.小程序與外部應用的交互
9.微信canvas,小遊戲;
10.真機測試、上傳發布、 騰訊雲的應用。
11.經常使用第三方組件;
12.場景值
13.運行原理、底層實現
14.優化
15. 利用第三方框架 開發小程序和h5頁面 等多端應用
小程序官方體驗,包含各個組件和接口演示下載體驗
移動app開發三種技術及優劣勢;
微信小程序的編譯過程,開發者工具的本質;一個看法切入點
小程序實現原理解析:blog.csdn.net/xiangzhihon…
api工廠