微信小程序豆瓣電影項目的改造過程經驗分享

在學習微信小程序開發(fā)過程中捆等,一部分的難點是前端邏輯的處理,也就是對前端JS的代碼編輯续室;一部分的難點是前端界面的設計展示栋烤;本篇隨筆基于一個豆瓣電影接口的小程序開源項目進行重新調整,把其中遇到的相關難點和改進的地方進行討論介紹,希望給大家提供一個參考的思路,本篇隨筆是基于前人小程序的項目基礎上進行的改進扩灯,因此在開篇之前首先對原作者的辛勞致敬及感謝改执。

1、豆瓣電影接口的小程序項目情況

豆瓣電影接口提供了很多相關的接口給我們使用,豆瓣電影接口的API地址如下所示:https://developers.douban.com/wiki/?title=movie_v2


在GitHub的開源庫里面,可以搜索到很多關于豆瓣電影接口的小程序,我本篇隨筆是基于 weapp-douban-movie 這個小程序進行的改造處理沉唠,后來找到了原作者的項目地址:wechat-weapp-movie,原作者對版本做了一次升級苛败,后來我對照我的調整和作者最新版本的源碼满葛,發(fā)現有些地方改造的思路有些類似径簿,如對于URL地址外放到統(tǒng)一的配置文件中的處理,不過還是有很多地方改造不同嘀韧。
本篇隨筆的改造方案是基于小程序項目 weapp-douban-movie 的篇亭,因此對比的代碼也是和這個進行比較,不知道這個版本是不是原作者的舊版本锄贷,不過這個版本對文件目錄的區(qū)分已經顯得非常干凈利落了译蒂,對電影信息的展示也統(tǒng)一到了模板里面,進行多次的重復利用谊却,整體的布局和代碼都做的比較好柔昼,看得出是花了不少功夫進行整理優(yōu)化的了。
小程序主界面效果如下所示:

小程序源碼目錄結構如下所示:

不過每個人都有不同的經驗和看法炎辨,對于開發(fā)小程序來說捕透,我側重于使用配置文件減少硬編碼的常量,使用Promise來優(yōu)化JS代碼的使用碴萧,將獲取和提交JSON數據的方法封裝到輔助類乙嘀,以及使用地理位置接口動態(tài)獲取當前城市名稱和坐標等等。
本篇隨筆下面的部分就是介紹使用這些內容進行代碼優(yōu)化的處理過程破喻。

2虎谢、使用配置文件定義常量內容

我們在使用任何代碼開發(fā)程序的時候,我們都是非常注意一些變量或常量的使用低缩,如果能夠統(tǒng)一定義那就統(tǒng)一定義好了嘉冒,這種在小程序的JS代碼里面也是一樣,我們盡可能抽取一些如URL咆繁,固定參數等信息到獨立的配置文件中,這樣在JS代碼引入文件顶籽,使用變量來代替
例如原來的config.js文件里面玩般,只是定義了一個地址和頁面數量的大小常量,如下所示

module.exports = {
    city: '杭州',
    count: 20
}

原來的小程序代碼在獲取待映的電影內容時候礼饱,部分源碼如下所示



其他頁面JS代碼也和這個類似坏为,頭部依舊有很多類似這樣URL地址,這個是我希望統(tǒng)一到config.js文件的地方镊绪,另外這個調用的函數是使用回調函數的處理方式匀伏,如下所示。

douban.fetchFilms.call(that, url, config.city, that.data.start, config.count)

其實我認為這里面既然是定義的外部函數蝴韭,那么這里面的url, city, config.city, config.cout都不需要這里够颠,在封裝函數內部使用這些常量即可,因此可以對他們進行改造榄鉴,如下我們統(tǒng)一抽取各個文件里面的URL履磨,以及一些常見變量到config.js里面蛉抓。

下面代碼是我優(yōu)化整理后的配置參數信息。

module.exports = {
    city: '',
    location:'0,0',
    count: 20,

    coming_soon_url: 'https://api.douban.com/v2/movie/coming_soon',
    in_theaters_url: 'https://api.douban.com/v2/movie/in_theaters',
    top_url: 'https://api.douban.com/v2/movie/top250',
    search_url: 'https://api.douban.com/v2/movie/search?tag=',
    detail_url: 'https://api.douban.com/v2/movie/subject/', //?id=
    celebrity_url: 'https://api.douban.com/v2/movie/celebrity/',
    baidu_ak:'6473aa8cbc349933ed841467bf45e46b',
    baidu_movie:'https://api.map.baidu.com/telematics/v3/movie',

    hotKeyword: ['功夫熊貓', '烈日灼心', '擺渡人', '長城', '我不是潘金蓮', '這個殺手不太冷', '驢得水', '海賊王之黃金城', '西游伏妖片', '我在故宮修文物', '你的名字'],
    hotTag: ['動作', '喜劇', '愛情', '懸疑'],

上面的配置文件config.js里面剃诅,我統(tǒng)一抽取了各個頁面的URL地址巷送、關鍵詞和標簽(hotKeyword和hotTag)、城市及地址(city和location后面動態(tài)獲让)笑跛、頁面數量count等參數信息。

另外由于部分參數統(tǒng)一通過config.js獲取聊品,就不需要再次在調用的時候傳入了飞蹂,因此簡化調用代碼的參數傳入,如下代碼所示杨刨。

douban.fetchComming(that, that.data.start)

對于原先的代碼

douban.fetchFilms.call(that, url, config.city, that.data.start, config.count)

簡化的雖然不多晤柄,但是盡可能的保持干凈簡單的接口是我們的目標,而且這里把常規(guī)的URL等參數提取到函數里面妖胀,更加符合我們編碼的習慣芥颈。
這里定義的**douban.fetchComming(that, that.data.start) **使用了Promise來簡化代碼,傳入的that參數是因為需要在函數體里面設置該頁面里面的Data等處理赚抡。
關于Promise的相關處理爬坑,我們在下面進行介紹。

3涂臣、使用Promise來優(yōu)化JS代碼

關于Promise的好處和如何使用Promise插件介紹盾计,我在隨筆《在微信小程序的JS腳本中使用Promise來優(yōu)化函數處理》中已有介紹,我很喜歡使用這種Promise的風格代碼赁遗,而且可以定義一些常用的輔助類來提高代碼的重用署辉。在我參考的這個豆瓣電影小程序還是使用常規(guī)回調的函數,對比原作者最新版本的 wechat-weapp-movie 小程序岩四,也依舊使用回調函數模式來處理哭尝,有點奇怪為什么不引入Promise插件來開發(fā)。
原來的小程序剖煌,電影接口的相關處理材鹦,統(tǒng)一在fetch.js里面進行處理,這里封裝對各種豆瓣API接口的調用耕姊。


這里我們來看看原來程序沒有采用Promise的回調函數處理代碼

var config = require('./config.js')
var message = require('../../component/message/message')

module.exports = {
    fetchFilms: function(url, city, start, count, cb) {
      var that = this
      if (that.data.hasMore) {
        wx.request({
          url: url,
          data: {
            city: config.city,
            start: start,
            count: count
          },
          method: 'GET', 
          header: {
            "Content-Type": "application/json,application/json"
          },
          success: function(res){
            if(res.data.subjects.length === 0){
              that.setData({
                hasMore: false,
              })
            }else{
              that.setData({
                films: that.data.films.concat(res.data.subjects),
                start: that.data.start + res.data.subjects.length,
                showLoading: false
              })
            }
            wx.stopPullDownRefresh()
            typeof cb == 'function' && cb(res.data)
          },
          fail: function() {
            that.setData({
                showLoading: false
            })
            message.show.call(that,{
              content: '網絡開小差了',
              icon: 'warning',
              duration: 3000
            })
          }
        })
      }
    },

這個函數是一個通用的函數桶唐,用來獲取待映、熱映茉兰、top250口碑的記錄信息尤泽,不過它把參數拋給調用者傳入,因此顯得調用比較復雜一些,我們經過使用Promise優(yōu)化代碼處理安吁,并對接口的參數進行簡化醉蚁,代碼改造如下所示。

var config = require('./config.js')
var message = require('../../component/message/message')
var app = getApp()//獲取應用實例

module.exports = {
    //待映
    fetchComming : function(page, start) {
      return this.fetchFilms(page, config.coming_soon_url, config.city, start, config.count);
    },
    //熱映
    fetchPopular : function(page, start) {
      return this.fetchFilms(page, config.in_theaters_url, config.city, start, config.count);
    },
    //top250口碑
    fetchTop : function(page, start) {
      return this.fetchFilms(page, config.top_url, config.city, start, config.count);
    },

    //通用的熱映鬼店、待映的獲取方式
    fetchFilms: function(page, url, city, start, count) {
      return new Promise((resolve, reject) => {
        var that = page;
        var json = {city: city, start: start, count: count };
        var type = "json";//特殊設置网棍,默認是application/json
        if (that.data.hasMore) {
          app.utils.get(url, json, type).then(res => {
              if(res.subjects.length === 0){
                that.setData({
                  hasMore: false,
                })
              }else{
                that.setData({
                  films: that.data.films.concat(res.subjects),
                  start: that.data.start + res.subjects.length,
                  showLoading: false
                })
              }
              wx.stopPullDownRefresh();

              resolve(res);            
          })
        }
      })
    },

最終的請求接口參數只有兩個,一個是頁面對象妇智,一個是請求的起始位置滥玷,如下代碼所示

function(page, start)

另外我們使用了代碼

app.utils.get(url, json, type)

來對wx.request方法的統(tǒng)一封裝,直接使用工具類里面的方法即可獲取結果巍棱,不需要反復的惑畴、臃腫的處理代碼。這就是我們使用Promise來優(yōu)化JS航徙,并抽取常用代碼到工具類里面的做法如贷。

我們再來對比一下獲取電影詳細信息的接口函數封裝,原來代碼如下所示到踏。

    fetchFilmDetail: function(url, id, cb) {
      var that = this;
      wx.request({
        url: url + id,
        method: 'GET',
        header: {
          "Content-Type": "application/json,application/json"
        },
        success: function(res){
          that.setData({
            filmDetail: res.data,
            showLoading: false,
            showContent: true
          })
          wx.setNavigationBarTitle({
              title: res.data.title
          })
          wx.stopPullDownRefresh()
          typeof cb == 'function' && cb(res.data)
        },
        fail: function() {
          that.setData({
              showLoading: false
          })
          message.show.call(that,{
            content: '網絡開小差了',
            icon: 'warning',
            duration: 3000
          })
        }
      })
    },

我改造后的函數代碼如下所示杠袱。

    //獲取電影詳細信息
    fetchFilmDetail: function(page, id) {      
      return new Promise((resolve, reject) => {
        var that = page;
        var url = config.detail_url + id;
        var type = "json";//特殊設置,默認是application/json
        app.utils.get(url, {}, type).then(res => {
            that.setData({
              filmDetail: res,
              showLoading: false,
              showContent: true
            });

            wx.setNavigationBarTitle({
                title: res.title
            });
            wx.stopPullDownRefresh(); 
            
            resolve(res);   
        });
      })
    },

通過對fetch.js函數代碼的改造處理窝稿,可以看到調用的JS代碼參數減少了很多楣富,而且頁面也不用保留那么多連接等參數常量信息了。

    onLoad: function() {
        var that = this
        douban.fetchComming(that, that.data.start)
    },

4伴榔、使用地理位置接口動態(tài)獲取當前城市名稱和坐標

原來程序使用硬編碼的方式設置當前城市纹蝴,如下腳本所示

module.exports = {
    city: '杭州',
    count: 20
}

不過我們不同地方的人員使用的時候,這個城市名稱肯定需要變化的踪少,因此可以使用微信的地理位置接口動態(tài)獲取當前位置信息塘安,然后寫入到配置文件里面即可。

//獲取當前位置信息
function getLocation (type) {
  return new Promise((resolve, reject) => {
    wx.getLocation({ type: type, success: resolve, fail: reject })
  })
}

//根據坐標獲取城市名稱
function getCityName (latitude = 39.90403, longitude = 116.407526) {
  var data = { location: `${latitude},${longitude}`, output: 'json', ak: '6473aa8cbc349933ed841467bf45e46b' };
  var url =  'https://api.map.baidu.com/' + 'geocoder/v2/';
  var type = 'json';
  
  return this.get(url, data, type).then(res => res.result.addressComponent.city);
}

然后我們在app.js里面編寫代碼援奢,在app啟動的時候耙旦,動態(tài)獲取城市名稱、坐標信息然后寫入配置文件即可萝究,這里使用的還是Promise的函數調用實現。

const utils  = require('./comm/script/util.js')
const config = require('./comm/script/config.js')

App({
  onLaunch: function() { 
    utils.getLocation()
    .then(res=>{
      const { latitude, longitude } = res;
      config.location = `${longitude},${latitude}`;//當前坐標
      console.log(`currentLocation : ${config.location}`);

      return utils.getCityName(latitude, longitude)
    })
    .then(name=>{
        config.city = name.replace('市', ''); //當前城市名稱
        console.log(`currentCity : ${config.city}`)
    })
    .catch(err => {
      config.city = '廣州'
      console.error(err)
    })
  },
...

最后呈上改造過代碼的運行界面锉罐,還是保留原來的功能正常使用帆竹。



以上就是我對這個小程序進行不同方面的調整思路和經驗總結,希望大家有所收益或者建議脓规,感謝閱讀支持栽连。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子秒紧,更是在濱河造成了極大的恐慌绢陌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熔恢,死亡現場離奇詭異脐湾,居然都是意外死亡,警方通過查閱死者的電腦和手機叙淌,發(fā)現死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門秤掌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鹰霍,你說我怎么就攤上這事闻鉴。” “怎么了茂洒?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵孟岛,是天一觀的道長。 經常有香客問我督勺,道長渠羞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任玷氏,我火速辦了婚禮堵未,結果婚禮上,老公的妹妹穿的比我還像新娘盏触。我一直安慰自己渗蟹,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布赞辩。 她就那樣靜靜地躺著雌芽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辨嗽。 梳的紋絲不亂的頭發(fā)上世落,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音糟需,去河邊找鬼屉佳。 笑死,一個胖子當著我的面吹牛洲押,可吹牛的內容都是我干的武花。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼杈帐,長吁一口氣:“原來是場噩夢啊……” “哼体箕!你這毒婦竟也來了专钉?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤累铅,失蹤者是張志新(化名)和其女友劉穎跃须,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體娃兽,經...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡菇民,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了换薄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玉雾。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖轻要,靈堂內的尸體忽然破棺而出复旬,到底是詐尸還是另有隱情,我是刑警寧澤冲泥,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布驹碍,位于F島的核電站,受9級特大地震影響凡恍,放射性物質發(fā)生泄漏志秃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一嚼酝、第九天 我趴在偏房一處隱蔽的房頂上張望浮还。 院中可真熱鬧,春花似錦闽巩、人聲如沸钧舌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洼冻。三九已至,卻和暖如春隅很,著一層夾襖步出監(jiān)牢的瞬間撞牢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工叔营, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屋彪,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓绒尊,卻偏偏與公主長得像撼班,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子垒酬,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容