小程序開發漸進紅利期,更多開發者慕名而來,網上的學習資料也層出不窮,有點眼花繚亂的意思了。在通過一個多月的摸索式學習後,我也終於寫了不算精美的一個小程序。html
那爲何寫這篇文章:前端
UI庫
的使用、富文本
轉義、數據結構設計、後端數據請求、nodejs服務代理轉發取了一個很low的名字「全民精進閱讀」,意爲沉浸式閱讀體驗,是一款rss源閱讀小程序,主要功能包括:已關注源、源列表、源文章詳情、源中心。可直接閱讀知乎每日精選、the week等優質中英文源。node
使用起來效果是這樣的: git
也能夠直接微信掃碼體驗: github
信息大爆炸時代,天天可看的實在太多,頭條、公衆號、知乎、各垂直平臺、大佬博客......只想找一個「安靜」的地方,便捷地閱讀一些精選的東西。因而乎就想起了RSS,想着將其與小程序結合,抱着試一試的心態寫了一下,順便當作練習。json
有了目標,接下來就是具體構思了。小程序
最終需求爲實現對RSS源的關注、展現。拆解爲以下原子功能:後端
同時,爲了可以選擇到想關注的RSS源以及能有一個有效的反饋渠道和聲明,還需兩個個功能:微信小程序
針對上述功能,進行模塊設計,這裏推薦使用UE在線編輯應用墨刀來嘗試完成。 根據《Do not make me think》的原則,能夠設計爲以下5模塊(頁面):數組
各模塊間的交互以下圖(省略返回):
關於UI設計,做爲前端開發首先能想到的就是宮格--簡明扼要,很符合預期。因此就沒有作專門的UI設計,在開發過程當中「隨機應變」。
說了辣麼多,該亮代碼了。。。
根據以上部分的分析,已經把小程序的全部功能點羅列出來了,如今作技術分析:
總體而言,須要第三方UI庫。通過搜索,發現兩款不錯的:一個是有讚的zanui,一個是美麗說的minui。由於我對該小程序的預期樣式和zanui更接近,且zanui能夠只引入部分模塊,我選擇了zanui。
針對各功能點
標籤,需第三方庫來實現)
作好準備以後,就能夠在微信開發者工具內開發了。 首先,初始化項目後,修改建立出以下目錄:
├── 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 富文本轉義庫
複製代碼
考慮到用戶實際操做流,進入小程序後首先進入的就應該是已關注的源展現,新用戶訪問到的是空頁面。用戶可在頁面操做觸發添加關注、刪除已關注。
對於已關注的源,關鍵信息是源名稱、源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. 其餘頁的關聯設計 做爲主頁面,須要有訪問其餘功能也的入口,這裏將工業入口放入宮格最後,做爲關聯。
對於新用戶而言,訪問過已關注頁面後,緊接着須要訪問的就是源中心了。須要完成下面的功能:
{
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
組件,引入方式同柵格系統。
wx.reLaunch({
url: `../rssed/rssed`,
});
複製代碼
採用經典設計,以下圖。
{
"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>\n ",
"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);
},
複製代碼
核心就是讀取Storage中的數據,將html富文本轉爲wxml。 這裏採用的是wxParse庫。將wxParse源碼下載後,拷貝至項目根目錄,而後在/pages/detail/detail.js
中引入、調用。
const WxParse = require('../../wxParse/wxParse.js');
...
WxParse.wxParse('article', 'html', rssDataItem.description, that, 5);
...
複製代碼
ps:單獨引入三方庫的好處在於,能夠自定義部分標籤的展現,這個根據實際需求而定。
從已關注頁面跳轉而來,展現一些額外信息。簡單的文字排版,不贅述。
小程序開發自己並不複雜,可是要作好作優還須要多學習和練習。這款小程序目前也只是停留在能用的階段,還有不少須要完善和優化的地方,但願對你們學習有用。另外,有更好的建議請私我,謝謝你們。