一级片大奶子_色又黄又爽18禁免费视频_热久久久久久久_久久久精品一区二区_日韩av不卡在线播放_精品国内自产拍在线观看视频

商城系統 注冊

怎么制作唱吧小程序,類似唱吧的小程序開發文檔

2018-08-20|HiShop
導讀:唱吧小程序開發上線還不到一個月的時間,唱吧小程序通過借助小程序的用完即走特性,使小程序用戶數突破200萬,下面就以最近接觸到的一款小程序為例,簡單總結一下小程序底層框架和一些...

唱吧小程序開發上線還不到一個月的時間,唱吧小程序通過借助小程序的用完即走特性,使小程序用戶數突破200萬,下面就以最近接觸到的一款小程序為例,簡單總結一下小程序底層框架和一些api接口方面的設計思路。

1小程序框架淺析

大家都說小程序體驗好,即開即用,和普通Webview渲染的H5相比頁面啟動速度、流暢度等方面好很多,這個問題我認為需要從幾個方面考慮,首先,拋開產品業務層面的設計和優化,就是小程序底層框架的設計和實現方面的特點。

當我們新建或打開一個小程序項目(以唱吧比賽小程序為例),即可看到如下圖的項目結構。

怎么制作唱吧小程序,類似唱吧的小程序開發文檔

小程序入口文件為app.js, 全局樣式文件為app.wxss,全局配置文件為app.json, 每個頁面中再分視圖wxml,wxss和邏輯js、文件配置json等,從這里我們可以看出,整個小程序的上層框架,也就是大體分為視圖層和邏輯層兩個部分。 (摘自官方文檔https://developers.weixin.qq.com/miniprogram/dev/framework/structure.html)

怎么制作唱吧小程序,類似唱吧的小程序開發文檔

小程序采用的MINA框架,View層主要用來渲染頁面結構,App Service層用來邏輯處理、數據請求、接口調用,它們在兩個線程里運行,整個小程序是只有一個App Service的,并且整個小程序的生命周期內它是常駐內存的。View層主要使用WebView渲染,而App Service邏輯層是使用JSCore運行。

通信方面,View和AppService是雙線程通信的,主要通過系統層的JSBridage進行通信,AppService把數據變化通知到View,表現方法也就是setData方法,觸發View頁面更新,View把觸發的事件通知到AppService進行業務處理。

這里要說的是,小程序是沒有DOM結構的,那么視圖層的渲染是如何做到的呢,就是運行環境中會把pages中的WXML的節點樹結構,轉化為JS的對象,進行渲染,這也是小程序體驗優于普通分享頁面的一大原因,省去了很多關于瀏覽器DOM的操作,由JS運行環境之間進行渲染解析。

2唱吧小程序底層搭建

那么話說回來,基于良好的框架,這次在搭建唱吧小程序底層的時候,我們其實做了哪些事情呢。

首先,我們并沒有進行純Native層的搭建和改造,而是對上述提到的API層的一次的封裝,尤其是在關于網絡請求的改造和小程序啟動的登錄流程方面,我們前端團隊嘗試去做一些分層和優化。

  • 網絡請求方面

首先網絡請求優化方面,微信提供的請求接口基本長這樣:


  1. wx.request({

  2.  url: 'test.php', //僅為示例,并非真實的接口地址

  3.  data: {

  4.     x: '' ,

  5.     y: ''

  6.  },

  7.  header: {

  8.      'content-type': 'application/json' // 默認值

  9.  },

  10.  success: function(res) {

  11.    console.log(res.data)

  12.  }

  13. })

是不是感覺和之前的某種請求模式很像,沒錯,就是古老的$.ajax,這時候我們又想起了ajax的回調地獄,如果頁面的請求很多,請求的順序還有限定,瞬間又是各種嵌套,可以說是要從請求到懵逼了。

所以為了解決回調地獄和同時優化請求代碼邏輯,我們在封裝wx.request的同時,我們在小程序開發中,引入了async/await語法糖,用到了來自facebook的regenerator模塊(詳情請戳:https://github.com/facebook/regenerator),async、await函數經babel編譯后,再用regenerator-runtime模塊用于提供功能實現,這一方面也得力于小程序支持ES6語法的編譯。

實現過程中,單獨用一個公共方法封裝,返回wx.request的promise


  1. //wechat.js

  2.  

  3. const request = (url,options) => {

  4.  return new Promise((resolve, reject) => {

  5.    wx.request({

  6.      url: url,

  7.      method: options.method,

  8.      data: Object.assign({}, options.data),

  9.      header: options.header,

  10.      success: resolve,

  11.      fail: reject

  12.    })

  13.  })

  14. }

之后在我們的上層公共庫中,編寫與請求相關的處理邏輯。


  1. // changba.js

  2.  

  3. const regeneratorRuntime = require('./regenerator-runtime.js')

  4. const wechat = require('./wechat')

  5. const URI = 'xxx'

  6.  

  7. const requestAPI = async (url,opt) => {

  8.  const app = getApp()

  9.  let options = Object.assign({data: {}},opt)

  10.    if (/^\/api\/(.+)$/.test(url)) {

  11.        url = URI + url;

  12.    }

  13.    if (!options.method) {

  14.        options.method = 'POST';

  15.    }

  16.    let header = {

  17.        'Content-Type': 'application/x-www-form-urlencoded'

  18.    }

  19.    options.header = options.header || header ;

  20.    //除了login方法  其余接口都要加入sessionInfo也就是后端加密過的session_key

  21.    if (!url.includes('/checkCode')) {

  22.      options.data['sessionInfo'] = app.globalData.sessionkey;

  23.    }

  24.    let isTimeout = false;

  25.    try {

  26.      const ree = await wechat.checkSession();

  27.    } catch (error) {

  28.      isTimeout = true;

  29.    };

  30.    try {

  31.      if (isTimeout) {

  32.        let aaa = await login(app);

  33.      }

  34.      wx.showLoading({

  35.        title: '加載中'

  36.      });

  37.        const res = await wechat.request(url,options)

  38.        if (res && res.statusCode) {

  39.            if (res.statusCode != 200) {

  40.                if (wx.hideLoading) {

  41.                    wx.hideLoading()

  42.                }

  43.                wx.showModal({

  44.                    content: wechat.errMsg(res.statusCode).message || '請求失敗,請重新嘗試',

  45.                    title: '提示',

  46.                    showCancel: false

  47.                })

  48.            } else {

  49.                if (res.data && res.data.code === 1) {

  50.                  if (wx.hideLoading) {

  51.                     wx.hideLoading()

  52.                  }

  53.                  return res.data

  54.                } else {

  55.                    // xxx 其他情況業務邏輯處理

  56.                }

  57.            }

  58.        }

  59.    } catch (error) {

  60.        console.log('請求異常信息:' + error)

  61.        if (wx.hideLoading) {

  62.          wx.hideLoading()

  63.        }

  64.        wx.showModal({

  65.            content: '請求信息異常',

  66.            title: '',

  67.            showCancel: false

  68.        })

  69.    }

  70. }

上述封裝過程中,所以除了考慮到請求超時、檢查用戶身份等操作,還可以加入session過期等相關其他的業務處理邏輯,這也是自己搭建請求的好處,針對自己的業務需求,進行匹配和改造。

然而在經歷這樣兩層封裝之后,在寫業務邏輯代碼的過程中,就可以一目了然的發送請求了,達到邏輯清晰且書寫自如,如果習慣了fetch以及axios的朋友應該都會比較喜歡這種方式。


  1.   async getdata() {

  2.     let self = this;

  3.     let cb_getdata = await app.changba.requestAPI('/api/xxx', { data: { id: self.data.id } });

  4.     if (cb_getdata && cb_getdata.code === 1) {

  5.           // xxx

  6.     }

  7.   }

  • 登錄流程方面

下面說下,啟動小程序后的登錄流程方面,在這一方面,小程序與其他不同的是,沒有固定的登錄啟動頁面,而是完全后臺交互,當然根據產品定位和需求,也可以自己做一套登錄系統~

電話咨詢 預約演示 0元開店
主站蜘蛛池模板: 国产精品第一区|亚洲偷偷自拍高清|老熟妇乱子伦=aV|国产激情久久久久久|www.亚洲人|在线观看免费视频 | 国产精品久久网站|欧美老熟妇=a=a=a=a=a=a|亚洲啊v在线|精品久久久免费|亚洲=aV无码专区在线观看成人|免费观看又色又爽又黄的崩锅 | 大胆L少妇BBBBBB流水|欧美操日韩|麻豆视传媒精品=aV|大地资源色婷婷视频在线|亚洲影视一区二区三区|成年男女免费视频在线观看不卡 | 好吊妞在线新免费视频|精品一区二区在线播放|久久=av片免费一区二区三区|无码少妇一区二区|中文=av字幕一区|国产精品久久国产精品99盘 | 日本一区二区影视|久久人人97超碰超国产|ssswww免费|久久爱在线播放视频|国产三级视屏|国产精品久久久久久久久久久免费看 | 99热国内精品永久免费观看|国产欧美高清在线观看|性一交一乱一交=a片|99视频99|国产精品成=av人在线视午夜片|久久网一区 | 国内精品久久国产|国产一区二区三区内射高清|一二三四视频在线社区中文字幕2|大地资源在线观看中文免费|午夜精品免费观看|无码成人18禁动漫网站 | 蜜桃=aV少妇久久久久久高潮不断|国产精品VIDEOSSEX国产高清|亚洲成=aⅤ人片久青草影院按摩|夜色香影院|自拍视频区|超碰综合 | 国产亚洲精=a=a在线看|玖玖在线观看视频|国产免费内射又粗又爽密桃视频|久久99精品国产麻豆蜜芽|人妻无码一区二区视频|久久99精品久久水蜜桃 | 97porm国内自拍视频|午夜精品一区二区三区在线播放|久久免费手机视频|人妻体体内射精一区二区|一级片=a|日本亚洲中文在线 | 欧美人成免费网站|图片区小说区激情区偷拍区|一级毛片免费大片|香蕉大人久久国产成人=av|亚洲欧美日本久久综合网站|亚洲精品成人=a8198=a | 啊灬啊灬啊灬快高潮视频|国语自产少妇精品视频蜜桃|欧美专区一区|人人草人人爱|一级毛片在线观|欧美国产日韩另类视频区 | 在线一区二区日韩|99只有精品|国产成人羞羞视频在线|www.成人网.com|久久在视频|日韩免费v=a | 二区视频在线|久久99精品久久久野外观看|国产欧美日韩一区二区三区在线观看|久久国产色=av免费看|樱花草在线播放免费中文|亚洲最新版=aV无码中文字幕 | 啊啊啊好爽啊|日韩性活大片|亚洲=aV日韩=aV综合在线观看|野花社区WWW在线高清观看|亚洲最黄视频|最新黄色=av | 国产精品久久久久久久小唯西川|日韩免费高清视频|亚洲另类自拍|黑森林精品=aV导航|日韩精品专区=av无码|高清精品久久 | 亚洲欧美一区二区精品中文字幕|免费=av网站在线|国产=av日韩=a∨亚洲=av|成年=a级毛片免费观看|五月丁香六月综合缴情基地|日本又黄又粗暴的gif动态图 | 久久不见久久见免费视频7|一级一级97片看一级毛片|奇迹少女第五季免费中文版|日韩字幕一中文在线综合|久久人精品|www.日韩精品.com | #NAME?|www.夜夜骑|亚洲人成网站精品片在线观看|视频在线观看入口黄最新永久免费国产|日本免费一级|巨大垂乳日本熟妇 | 强乱中文字幕=av一区乱码|1204国产成人精品视频|精品无码国产一区二区三区=aV|亚洲国产精品一区二区成人片不卡|99久久无码一区人妻=a片竹菊|无码中文字幕=av免费放 | 伊人伊成久久人综合网|99久久精品无免国产免费|亚洲精选免费视频|自拍偷拍综合|欧美人禽交zozozo视频|久久久久女人精品毛片九一韩国 | 婷婷综合久久狠狠色99H|精品国偷自产在线视频99|999久久久无码国产精品|国产精品一区二三区|激情中文小说区图片区|国产亚洲日 | 一级影片在线观看|亚洲精品久久久久9999吃药|免费毛片wwwcomcn|91一级片|超碰人人精品|GOGO亚洲肉体艺术 | 国产香蕉在线观看|亚洲=aV无码乱码国产精品久久|最新中文字幕=av无码专区不卡|日韩午夜大片|精品视频久久久久久|性少妇MDMS丰满HDFILM | 人与牲口性恔配视频免费|亚洲成=a人片4444|性XXXX18免费观看视频|狠狠亚洲婷婷综合色香五月排名|四虎影院免费|天天拍拍天天干 | 国产小视频在线免费观看|欧美亚洲综合另类|亚洲精品在线第一页|日操视频|亚洲精品久久无码老熟妇|在线观看视频色 | 久久久久资源|亚洲精品中文字幕在线播放|免费大香伊蕉在人线国产|成人久久久久|精品99人妻|午夜成午夜成年片在线观看 | c=aopom成人免费公开视频|中文字幕欧美人妻精品一区|91九幺丨成人|日韩久久国产|三年片大全免费观看|久草在在线 | 丝袜美腿一区二区三区在线观看|91手机在线视频|无套内内射视频网站|亚洲国产精久久久久久久|午夜丰满少妇性开放视频|性大毛片视频 | 99中文视频|成人手机在线免费观看|久久成人精品|日韩72页|秋霞麻豆|999视频网站 | 亚洲妇女多毛撒尿XXXⅩ|黄色毛片黄色毛片|公和我做好爽添厨房|日本韩国最新免费观看|日本=a∨精品中文字幕在线|国产免费拔擦拔擦8X高清在线 | 色综合久久综合中文综合网|午夜福利国产在线观看1|毛片免费视频观看|黑人把女人弄到高潮视频|www.国产精品视频|免费色网 | 98色婷婷在线|国产精品最新视频|欧美日本国产综合一区|日本三级精品|日本按摩高潮=a级中文片|久啪视频 | 亚洲欧美一区二区精品中文字幕|免费=av网站在线|国产=av日韩=a∨亚洲=av|成年=a级毛片免费观看|五月丁香六月综合缴情基地|日本又黄又粗暴的gif动态图 | 少妇大战黑吊在线观看|淫片毛片视频|日本精品www|国产成人久久精品77777|亚洲国产欧美在线观看的|国产精品色情国产三级在 | www欧美精品|成全在线观看免费高清动漫|富婆推油偷高潮叫嗷嗷叫|久久做受WWW|韩国羞羞|日韩亚洲欧美中文三级 | 一本久久宗合久久伊人|国产精品嫩草研究院|欧美日韩一本|娇小萝被两个黑人用半米长|国产精彩视频一区二区|成年人在线免费看视频 | 狠狠色狠狠色狠狠五月|在线看片国产|午夜院线|国产一区二区三区免费观看视频|#NAME?|深夜男人你懂的六月婷婷天堂 | 久久精品国产清高在天天线|天堂在线观看www|毛片=av在线免费观看|精品国产欧美一区二区五十路|老熟女草BX×|人妻慢慢放弃抵抗开始迎合 | 国产精品国产三级欧美二区|四虎影视在线免费观看|日日躁夜夜躁狠狠躁夜夜躁|日本高清中文字幕一区二区三区=a|日韩精品在在线一区二区中文|久久精品一区二区三区黑人印度 | 成人国产午夜在线观看|久久综合九色综合97欧美|99视频免费观看|久久久久久久国产精品毛片|久久99精品国产99久久|天堂成人国产精品一区 |