作者简可11
https://juejin.im/post/5c4c738ce51d4525211c129b
0.前言
好吧,也许大部分人进来都会想,为什么人会反复做轮子,GitHub的第三方客户端早就把街给毁了。确实一开始我也是这么觉得的,问自己这样的项目再做一次真的有意义吗?反复思考,以下原因也决定了我愿意做一个让自己满意的第三方GitHub客户端。
对于一直关注GitHub Trending列表的作者来说,迫切需要一种更容易的方式,随时随地跟踪GitHub的最新技术动向;
现有的一些GitHub小程序客户端值和功能不能满足作者的要求;
听说没人要iOS开发,那为什么不掌握一门新的开发技能呢?
其实没有那么多原因。如果你想做,就去做。幸福是最重要的。
1.Gitter
GitHub:
https://github.com/huangjianke/Gitter
可能是目前价值最高的GitHub小程序客户端,欢迎之星
数据源:
GitHub API v3
https://developer.github.com/v3/
目前的功能是:
查看实时趋势
显示用户列表
搜索仓库和用户
仓库:详细信息显示、README.md显示、星形/非星形、分叉、贡献者显示,以及查看仓库文件的内容
开发者:关注/不关注,展示用户关注/关注
问题:查看问题列表,添加问题,并添加问题注释
共享仓库,开发者
...
Gitter的初衷并不是把网页上的所有功能都复制到小程序上,因为那样的体验不会很友好。比如作者本人不想看手机上的代码,那会是一件很痛苦的事情。
让用户在保证用户体验的前提下,以更简单的方式得到自己想要的东西,这很有意思。
2.探索文章
技术选择
第一次觉得自己在广阔的前端世界里是那么渺小。
当我决定做这个项目的时候,我开始了不间断的技术选择,但是我面前的选择太多了,我不得不觉得前端世界真的很棒。
原生开发:刚开始基本放弃,开发体验很不友好;
WePY:
https://tencent.github.io/wepy/
以前已经用这个框架开发了一个小程序,
诗人和诗人,
https://github.com/huangjianke/weapp-poem
不得不说坑这么多,用过的人都知道;
mpvue:
http://mpvue.com/
用Vue开发小程序,个人感觉文档不是很全,最近维护比较少,可能比较稳定?
芋头:
https://taro.aotu.io/
利用React开发小程序,芋头团队的小伙伴们真的是勤于维护,耐心解答大家的疑问。文档比较齐全,开发经验也很棒。您也可以一键生成多端运行代码。
逛了一圈,经过一段时间的尝试和踩坑,结合我目前的能力,最终确定了吉特的技术选型:
Taro+Taro UI+Redux+云开发节点. js
https://taro-ui.aotu.io/#/docs/introduction
页面设计
其实作为一个编码器,我一直想找一个姐姐UI设计师做老婆。多般配啊。现在想想,代码不是生活的全部,我现在也一样开心。
让我们回到正题。没有设计师的老婆怎么办?毕竟我要的是一个价值很高的GitHub小程序。
嗯,不急不忙,默默的拿出我沉默了很久的Photoshop和Sketch。我不敢说我的设计能力如何。Gitter的设计至少能让我感到开心。如果有设计爱好者想改进Gitter的设计,欢迎,欢迎!
3.开篇文章
说话便宜。给我看看代码。
作为一篇技术文章,怎么能少拿代码?
这里主要写几个踏点。作为一个前端小白,相信所有的读者都是作者的前辈,希望大家多多指教!
趋势
进入开发阶段没多久,就遇到了第一个坑。GitHub不提供趋势列表的API!!!
我没有过多考虑GitHub为什么不提供这个API,只是考虑如何尽快填补这个漏洞。首先尝试使用scratch
写一个爬虫定期抓取并存储网页上的趋势列表信息供小程序使用,但最后还是放弃了这个做法,因为作者没有服务器和注册域名,小程序的云开发只支持Node.js的部署
开源依旧强大,终于找到了github-trending-api。
https://github.com/huchenme/github-trending-api
稍加修改,成功部署到小程序云开发后台。在此,我要感谢原作者的努力。
攀登趋势知识库
async functionfetchrepositories {
const URL = ` $ { GITHUB _ URL }/trending/$ { language }?自= $ {自} `;
const data = await fetch;
const $ = cheerio . load);
返回
。get
//ESL int-disable-下一行复杂性
。map;
consttitle = $回购
。查找
。文本
。trim;
constrelativeUrl = $ repo
。查找
。查找
。attr;
constcurrentPeriodStarsString =
$回购
。find
。文本
。trim || /*伊斯坦布尔忽略下一个*/' ';
constbuiltBy = $回购
。查找')
。父项
。查找
。map= > 1 . 0 . 0。{
constaltString = $
.children 。儿童
。attr;
constavatarUrl = $
.children 。儿童
。attr;
返回{
用户名:altString
?altString.slice
:/*伊斯坦布尔忽略下一个*/null,
href:` $ { GITHUB _ URL } $ { user . attribs . href } `,
头像:removeDefaultAvatarSize,
};
})
。get;
constcolorNode = $ repo.find;
常量颜色=颜色节点。长度
?colorNode.css
:null
constlAnNode = $ repo . find;
constlang = langNode.length
?langNode.text。修剪
:/*伊斯坦布尔忽略下一个*/null;
returnomitNil,
名称:title.split,
URL:` $ { GITHUB _ URL } $ { Relatitudeurl } `,
deion:
$回购
。find
。文本
。trim || /*伊斯坦布尔忽略下一个*/' ',
语言:朗,
语言颜色:语言颜色,
star:ParSeint
。文本
。替换|| /*伊斯坦布尔忽略下一个*/0,
10
),
forks: parseInt
。文本
。替换|| /*伊斯坦布尔忽略下一个*/0,
10
),
currentPeriodStars: parseInt。替换||
/*伊斯坦布尔忽略下一个*/0,
10
),
建筑,
});
})
);
}
抓取趋势开发者
asynccfunctionfetchdeveloper {
constdata = awaitfetch;
const $ = cheerio . load);
返回$
。get
。地图;
constrarelativeURl = $ dev . find。attr;
constname = getMatchString
。文本
。trim,
/^)$/i
);
$dev.find。移除;
constusername = $dev
。find
。文本
。trim;
const$repo = $dev.find;
returnomitNil.attr), avatar:removeDefaultAvatarSize。attr,
回购:{
名称:$回购
。find
。文本
。trim,
deion:
$回购
。find
。文本
。trim || /*伊斯坦布尔忽略下一个*/' ',
URL:` $ { GITHUB _ URL } $ { $ repo . attr} `,
},
});
});
}
趋势列表云功能
//云函数入口函数
exports.main = async =>。{
const{ type,language,after } =事件
letres = null
letdate = newDate
if{
constcacheKey = ` repositories::$ { language || ' nolang ' }::$ {自| |
daily ' } `;
constcacheData = await db . collection。其中.orderBy。get
if-cache data . data)。cacheDate)& lt;1800* 1000)) {
RES = JSON . parse
} else{
RES = awaitfetchRepositories;
await db . collection。添加,
缓存键:缓存键,
内容:JSON.stringify
}
})
}
} else if{
constcacheKey = ` developer::$ { language | | ' nolang ' }::$ {自| | ' daily ' } `;
constcacheData = await db . collection。其中.orderBy。get
if-cache data . data)。cacheDate)& lt;1800* 1000)) {
RES = JSON . parse
} else{
RES = awaitfetchdeveloper;
await db . collection。添加,
缓存键:缓存键,
内容:JSON.stringify
}
})
}
}
返回{
数据:res
}
}
降价分析
嗯,这是个大坑。
在做技术研究的时候发现,对于小程序端的Markdown解析,主要有以下几种解决方案:
wxParse:
https://github.com/icindy/wxParse
作者最后一次提交是在两年前。经过自己的尝试,他确实发现不适合解析README.md之类的
wemark:
https://github.com/TooBug/wemark
一个非常不错的微信小程序Markdown渲染库,但是作者尝试后发现README.md的解析并不完善
towxml:
https://github.com/sbfkcel/towxml
目前发现是微信小程序最完善的Markdown渲染库,几乎可以完美分析显示README.md
在Markdown解析中,最终采用towxml,但是发现目前解析性能不是很好,解析一些比较大的数据超出了小程序能够承受的范围。还好有思想的作者提供了服务器的支持,感谢作者的努力!
降价分析云函数
constTowxml = require;
consttowxml = NewTowXMl;
//云函数入口函数
exports.main = async =>。{
const{ func,type,content } =事件
letres
if {
if {
RES = awaittowxml . Tojson;
} else{
RES = awaittowxml . Tojson;
}
}
返回{
数据:res
}
}
Markdown.js组件
导入Taro,{ Component }来自' @tarojs/taro '
从“道具类型”导入道具类型
从“@tarojs/components”导入{视图,文本}
从“taro-ui”导入{ AtActivityIndicator }
“进口”。/markdown.less '
'从导入到xml '../towxml/main
const render = new Towxml
导出DefaultClassMarkDownExtendsComponent {
static propTypes = {
MD:ProTypeS . string,
base:ProTypeS . string
}
静态defaultProps = {
md: null,
base: null
}
构造函数{
超级
this.state = {
数据:null,
失败:false
}
}
componentDidMount {
this.parseReadme
}
parseReadme {
const { md,base } = this.props
让那个=这个
wx.cloud.callFunction.然后 {
data= render.initData
}
that.setState
}).catch
that.setState
})
}
render {
const { data,fail } = this.state
if {
返回} & gt;
& ltText className= 'text'>。加载失败,再试一次?& lt/Text >
& lt/View >
)
}
返回 :
}
& lt/View >
)
}
}
Redux
事实上,作者在这个项目中并没有太多使用Redux。一开始,作者认为所有的接口请求都应该由Redux操作,但后来发现并不是所有的操作都必须使用Redux。最后,在这个项目中,只有在获得个人信息的情况下,才使用Redux。
//获取个人信息
export ConstGetUserInfo = CreateApiAction= & gt;api。get)
exportfunctioncreateApiAction= & gt;{}) {
返回=>。{},失败:=>。{} },
customActionType = actionType,
)= >;async= gt。{
尝试{
dispatch;
const data = await func;
dispatch;
回调。成功和。& ampcallback . success
returndata
} catch {
调度
回调. & amp& ampcallback.failed
}
}
}
getUserInfo {
if) {
userAction.getUserInfo。然后= >;{
Taro.hideLoading
Taro.stopPullDownRefresh
})
} else{
Taro.hideLoading
Taro.stopPullDownRefresh
}
}
const mapstatetorops == & gt;{
返回{
userInfo: state.user.userInfo
}
}
exportdefaultconnect
exportdefaultfunctionuser {
switch {
caseUSERINFO:
返回{
...州,
userInfo: action.payload.data
}
默认:
返回状态
}
}
目前作者还处于对Redux知之甚少的状态。嗯,还有很长的路要走。
4.结论
当第一版Gitter通过审核的时候,我很激动。就像我自己的孩子一样,看着他一点一点长大。我也很享受这样一个项目从无到有的过程。在这里,我要向帮助过我的人表示感谢。
当然,目前在功能和体验上可能存在一些不完善的地方,希望大家能提供一些有价值的意见。希望你在为吉特走向完美的路上!
最后,希望Gitter小程序能帮到你!
长的
根据
接近
填充
1.《github客户端 Gitter - 高颜值GitHub小程序客户端诞生记》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《github客户端 Gitter - 高颜值GitHub小程序客户端诞生记》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/tiyu/1670405.html