寫在前面
小程式開發漸進紅利期,更多開發者慕名而來,網上的學習資料也層出不窮,有點眼花繚亂的意思了。在經過一個多月的摸索式學習後,我也終於寫了不算精美的一個小程式。
那為什麼寫這篇文章:
- 總結經驗 – 寫文章能帶來更多的思考,為後續開發做準備
- 分享經驗 – 網上的資料真的太多了,希望我這篇文章能有所用
幾個問題
- 適合哪些讀者?
本文適合對小程式有興趣,且已閱讀過官網:微信小程式開發教程,體驗過官方demo,想進一步學習開發的讀者 - 包含哪些技術點?
主要包括:微信小程式常見語法、跨頁面傳參、快取使用、本地資料模擬、第三方UI庫
的使用、富文字
轉義、資料結構設計、後端資料請求、nodejs服務代理轉發 - 有何特點?
思路、註釋、原始碼
正文
簡介
取了一個很low的名字“全民精進閱讀”,意為沉浸式閱讀體驗,是一款rss源閱讀小程式,主要功能包括:已關注源、源列表、源文章詳情、源中心。可直接閱讀知乎每日精選、the week等優質中英文源。
使用起來效果是這樣的:
也可以直接微信掃碼體驗:
靈感來源
資訊大爆炸時代,每天可看的實在太多,頭條、公眾號、知乎、各垂直平臺、大佬部落格……只想找一個“安靜”的地方,便捷地閱讀一些精選的東西。於是乎就想起了RSS,想著將其與小程式結合,抱著試一試的心態寫了一下,順便當做練習。
模組分析(這個部分是廢話,乾貨請直接查閱“程式碼實現”部分或者下載原始碼體驗)
有了目標,接下來就是具體構思了。
最終需求為實現對RSS源的關注、展示。拆解為如下原子功能:
- RSS源關注
- RSS源已關注展示
- RSS源內容列表展示
- RSS源文章詳細內容展示
- RSS源取消關注
同時,為了能夠選擇到想關注的RSS源以及能有一個有效的反饋渠道和宣告,還需兩個個功能:
- RSS源推薦列表
- RSS源簡介
- RSS源反饋渠道、宣告展示
針對上述功能,進行模組設計,這裡推薦使用UE線上編輯應用墨刀來嘗試完成。
根據《Do not make me think》的原則,可以設計為如下5模組(頁面):
- 已關注源展示
- RSS源已關注展示
- RSS源取消關注
- 源中心
- RSS源推薦列表
- RSS源簡介
- RSS源關注
- 源內容展示
- RSS源內容列表展示
- 源文章詳細展示
- RSS源文章詳細內容展示
- 更多
- RSS源簡介
- RSS源反饋渠道、宣告展示
各模組間的互動如下圖(省略返回):
關於UI設計,作為前端開發首先能想到的就是宮格–簡明扼要,很符合預期。所以就沒有做專門的UI設計,在開發過程中“隨機應變”。
說了辣麼多,該亮程式碼了。。。
程式碼實現
技術準備
根據以上部分的分析,已經把小程式的所有功能點羅列出來了,現在做技術分析:
-
整體而言,需要第三方UI庫。經過搜尋,發現兩款不錯的:一個是有讚的zanui,一個是美麗說的minui。因為我對該小程式的預期樣式和zanui更接近,且zanui可以只引入部分模組,我選擇了zanui。
-
針對各功能點
- RSS源關注:帶引數頁面跳轉、彈框(微信彈框展示資訊太少,需用zanui)
- RSS源已關注展示:宮格佈局、資料結構設計
- RSS源內容列表展示:RSS資料結構分析、佈局
- RSS源文章詳細內容展示:跨頁面傳參、富文字展示(微信沒有
標籤,需第三方庫來實現)
- RSS源取消關注:長按取消、資料快取重新整理
- RSS源推薦列表:宮格佈局、資料結構設計
- RSS源簡介:文字展示(注意微信中
標籤中的才能被選中複製) - RSS源反饋渠道、宣告展示:簡單文字展示
具體實現
做好準備之後,就可以在微信開發者工具內開發了。
首先,初始化專案後,修改建立出如下目錄:
├── app.js
├── app.json
├── app.wxss
├── data 本地資料
| └── rss.js
├── pages 頁面
| ├── detail 源文章詳細展示
| | ├── detail.js
| | ├── detail.json
| | ├── detail.wxml
| | └── detail.wxss
| ├── index 源內容展示
| | ├── index.js
| | ├── index.json
| | ├── index.wxml
| | └── index.wxss
| ├── more 更多
| | ├── more.js
| | ├── more.json
| | ├── more.wxml
| | └── more.wxss
| ├── rsscenter 源中心
| | ├── rsscenter.js
| | ├── rsscenter.json
| | ├── rsscenter.wxml
| | └── rsscenter.wxss
| └── rssed 已關注源展示
| ├── rssed.js
| ├── rssed.json
| ├── rssed.wxml
| └── rssed.wxss
├── project.config.json
├── utils 通用資源
| └── util.js
└── wxParse 富文字轉義庫
複製程式碼
頁面一:rssed 已關注源展示
考慮到使用者實際操作流,進入小程式後首先進入的就應該是已關注的源展示,新使用者訪問到的是空頁面。使用者可在頁面操作觸發新增關注、刪除已關注。
- 宮格佈局與第三方UI庫的使用
對於已關注的源,關鍵資訊是源名稱、源logo。因此,基於清爽設計,採用宮格佈局,這裡使用的是zanui
的柵格系統。從zanui的原始碼(本文使用的是v1.9.91
版本)中找到柵格系統元件dist/col/index.wxss
,將內容複製到專案的app.wxss中,當作通用樣式,wxml參照zanui原始碼中的/pages/layout/index.wxml
。
柵格系統中對高度沒有做控制,需要自行實現正方形方塊,新增如下wxss程式碼:
.zan-col {
background-color: #39a9ed;
height: 25vw;
text-align: center;
padding-top: 60rpx;
color: #fff;
position: relative;
}
.zan-col:nth-child(odd) {
background-color: #66c6f2;
}
複製程式碼
值得一提的是,第三方UI庫的引入方式除了這種部分引入外,還可以整體引入,方法為:已zanui為例,將其資原始檔通過@import直接引入到app.wxss中。
@import "dist/index.wxss";
複製程式碼
- 資料結構設計
對於這個已關注源的集合,我們將需要的後設資料放入陣列,用於宮格渲染。
const rssedData = [
{
title: `知乎每日精選`, // 源名稱
favicon: `https://www.zhihu.com/favicon.ico`, // 源logo
rssUrl: `https://www.zhihu.com/rss`, // 源連結
},
{
title: `the weak`,
favicon: `https://theweek.com/favicon.ico`,
rssUrl: `https://theweek.com/rss.xml`,
},
];
複製程式碼
此資料,載入該頁面後從Storage中的取值rssedData,rssedData 在已關注是寫入快取。
3. 渲染與取消關注
根據資料結構和UI設計,使用wx:for
迴圈渲染出宮格。
由於需要檢視、取消關注某個源,因此就需要在元素上新增data-rss-id
等值,用於事件繫結與跨頁面傳參
。
刪除採用常見的長按出現刪除按鈕,點選按鈕就刪除的方案。
4. 其他頁的關聯設計
作為主頁面,需要有訪問其他功能也的入口,這裡將工業入口放入宮格最後,作為關聯。
頁面二:rsscenter 源中心
對於新使用者而言,訪問過已關注頁面後,緊接著需要訪問的就是源中心了。需要完成下面的功能:
- RSS源推薦列表展示與資料結構設計
採用和已關注頁相同的佈局方式–宮格,樣式複用,資料格式類似但需擴充。
{
title: `知乎每日精選`, // 源名稱
link: `https://www.zhihu.com`, // 源官網連結
description: `中文網際網路最大的知識平臺,幫助人們便捷地分享彼此的知識、經驗和見解。`, // 源簡介
favicon: `https://www.zhihu.com/favicon.ico`, // 源logo
rssUrl: `https://www.zhihu.com/rss`, // 源連結
}
複製程式碼
另外,對於關注的源應該有特殊標識,所以需要對資料做處理,通過對比Storage中rssedData和rss.js檔案中的資料,給頁面資料新增rssed(type:boolean)欄位。
這裡的資料來源於網路收集,暫時固定寫死在小程式中,因此我提出來放到了專案的/data/rss.js
檔案中。後續版本,這個放到服務端管理,可以做到動態增刪改。
2. RSS源簡介
採用彈出框的形式,展示基本資訊,提供關注按鈕。這裡使用了zanui的popup
元件,引入方式同柵格系統。
3. RSS源關注
更新Storage,使用wx.reLaunch跳轉至已關注頁。
wx.reLaunch({
url: `../rssed/rssed`,
});
複製程式碼
頁面三:源內容展示
採用經典設計,如下圖。
- 源資料處理與node服務
rss是基於XML標準的資料,在小程式中無法直接解析,且小程式的合法requests域名有限,這裡可以採用伺服器代理的形式來處理。
我這裡使用的是基於nodejs的thinkjs框架,在框架內引入專門將rss資料轉為json資料的外掛。這個服務後續可以專門寫一篇文章,這裡就不展開了,思路就是這樣的。另外rss資料格式有多種,需要做相容處理。
響應格式為:
{
"errno": 0,
"errmsg": "",
"data": {
"rss": {
"$": {
"version": "2.0",
"xmlns:atom": "http://www.w3.org/2005/Atom"
},
"channel": {
"title": "知乎每日精選",
"link": "http://www.zhihu.com",
"description": "中文網際網路最大的知識平臺,幫助人們便捷地分享彼此的知識、經驗和見解。",
"atom:link": {
"$": {
"href": "http://www.zhihu.com/rss",
"rel": "self"
}
},
"language": "zh-cn",
"copyright": "© 2018 知乎(http://www.zhihu.com)",
"lastBuildDate": "Fri, 03 Aug 2018 16:30:25 +0800",
"ttl": "180",
"item": [{
"title": "如何評價 2018 年菲爾茲獎(fields medal 2018)結果與四位得主的工作?",
"link": "http://www.zhihu.com/question/287977241/answer/458776271?utm_campaign=rss&utm_medium=rss&utm_source=rss&utm_content=title",
"description": "<p></p><br>
",
"dc:creator": {
"_": "知識分子",
"$": {
"xmlns:dc": "http://purl.org/dc/elements/1.1/"
}
},
"pubDate": "Fri, 03 Aug 2018 16:30:25 +0800",
"guid": "http://www.zhihu.com/question/287977241/answer/458776271"
},]
}
}
}
}
複製程式碼
其中的description
欄位為該文章簡介內容的hmtl文件,部分源將全部內容放到其中,所以載入的時候可能比較慢。
2. 列表渲染與帶引數跳轉
拿到上述資料之後,對資料進行快取放入Storage中。然後使用wx:for
渲染列表。
頁面跳轉至詳情頁時帶上文章的陣列index值:
wx.navigateTo({
url: `../detail/detail?id=${rssItemData}&favicon=${favicon}`,
});
複製程式碼
在detail.js
中取值
onLoad: function (options) {
this.showDetail(options.id, options.favicon);
},
複製程式碼
- 為什麼一次性快取?
- rss源資料返回的就是全部返回
- 利於使用者體驗,不至於載入列表頁等待之後,切換詳情頁還需要等待。
頁面四:源文章詳細展示
核心就是讀取Storage中的資料,將html富文字轉為wxml。
這裡採用的是wxParse庫。將wxParse原始碼下載後,拷貝至專案根目錄,然後在/pages/detail/detail.js
中引入、呼叫。
const WxParse = require(`../../wxParse/wxParse.js`);
...
WxParse.wxParse(`article`, `html`, rssDataItem.description, that, 5);
...
複製程式碼
ps:單獨引入三方庫的好處在於,可以自定義部分標籤的展示,這個根據實際需求而定。
頁面五:更多
從已關注頁面跳轉而來,展示一些額外資訊。簡單的文字排版,不贅述。
最後
小程式開發本身並不複雜,但是要做好做優還需要多學習和練習。這款小程式目前也只是停留在能用的階段,還有很多需要完善和優化的地方,希望對大家學習有用。另外,有更好的建議請私我,謝謝大家。