国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 課堂 > 小程序 > 正文

微信小程序開(kāi)發(fā)實(shí)戰(zhàn)分享:騰訊體育模仿實(shí)現(xiàn)

2020-03-21 16:30:37
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

寫(xiě)在前面:

小程序的定義:

很多人問(wèn)我,說(shuō)的這么熱鬧,小程序到底是個(gè)什么東西?下面我先簡(jiǎn)單介紹一下。

官方這么定義小程序:

“小程序是一種不需要下載安裝即可使用的應(yīng)用,它實(shí)現(xiàn)了應(yīng)用“觸手可及”的夢(mèng)想,用戶掃一掃活著搜一下即可打開(kāi)應(yīng)用。也體現(xiàn)了“用完即走”的理念,用戶不用關(guān)心是否安裝太多應(yīng)用的問(wèn)題。應(yīng)用將無(wú)處不在,隨時(shí)可用,但又無(wú)需安裝卸載”。

小程序是一個(gè)由微信提供開(kāi)發(fā)組件與開(kāi)發(fā)規(guī)則,以js為主要開(kāi)發(fā)語(yǔ)言,最終運(yùn)行在微信App內(nèi)的輕量型應(yīng)用,有著即掃即用的特點(diǎn)。它不是H5,但與H5一樣,小程序有著開(kāi)發(fā)上手快、開(kāi)發(fā)成本低的特性;它不是App,卻有著同樣的流暢度。小程序的出現(xiàn)使前端工程師可觸及的領(lǐng)域進(jìn)一步增大,可謂是迎來(lái)了前端工程師的春天~~

我們的小程序:

小程序的點(diǎn)在一個(gè)“小”字,對(duì)程序大小要求有限制,對(duì)頁(yè)面嵌套的層級(jí)有限制,不適合過(guò)于重的交互。小程序不能跳出,不能調(diào)起外部應(yīng)用,消息推送折疊在微信內(nèi)部,相比于原生App有著很大的局限性。

但是,相比于H5,小程序又有著不可忽視的優(yōu)勢(shì),固定化的入口,豐富的組件,系統(tǒng)控件的接口權(quán)限,接近App的使用流暢度,微信強(qiáng)大的生態(tài)圈...

結(jié)合上面兩點(diǎn),我們認(rèn)為:小程序=固定入口+有體系的H5

根據(jù)這一點(diǎn),我們仔細(xì)斟酌,提煉出體育用戶的核心訴求,將體育小程序的第一階段功能定位為賽程查詢、數(shù)據(jù)、資訊推送,第二階段的功能定位為視頻點(diǎn)播、個(gè)性化提醒(關(guān)注、預(yù)約、定制)。

關(guān)于小程序的適配:

眾所周知,微信App運(yùn)行在Android、iphone、iPad等多種屏幕尺寸和分辨率的設(shè)備上,不同終端的微信小程序用的是同一套代碼,需要照顧到一個(gè)“小程序”在多種不同大小屏幕的使用體驗(yàn),所以在設(shè)計(jì)排版時(shí)推薦柵格式排版。而在代碼實(shí)現(xiàn)方面,微信官方比較推薦用Flex、rpx來(lái)實(shí)現(xiàn)小程序的適配。

微信小程序,小程序開(kāi)發(fā),騰訊體育

Flex布局是2009年,W3C提出的一種新的方案,可以簡(jiǎn)便、完整、響應(yīng)式地實(shí)現(xiàn)各種頁(yè)面布局。目前,它已經(jīng)得到了所有瀏覽器的支持。

rpx單位是小程序中css的尺寸單位,可以根據(jù)屏幕寬度進(jìn)行自適應(yīng),規(guī)定屏幕寬為750rpx。如iPhone6的屏幕像素為375px,則750rpx=375px,1rpx=0.5px。同時(shí)小程序也支持rem: 規(guī)定屏幕寬度為20rem;1rem = (750/20)rpx 。

微信小程序,小程序開(kāi)發(fā),騰訊體育

Flex與rpx搭配可以解決大部分的適配,但遇到極端寬高比的情況,就需要變動(dòng)元素的排放位置。而小程序不支持Media Query,那就要通過(guò)js來(lái)進(jìn)行不同樣式的切換。小程序里獲得屏幕寬高的接口是異步的,實(shí)現(xiàn)響應(yīng)式布局盡量在app.js里盡早執(zhí)行防止頁(yè)面抖動(dòng)。

關(guān)于小程序的生命周期:

微信小程序,小程序開(kāi)發(fā),騰訊體育

小程序的框架程序包含一個(gè)描述整體程序的app 和多個(gè)描述頁(yè)面的page。其中,app由三個(gè)文件構(gòu)成,公共設(shè)置的app.json 、公共樣式的app.wxss、主體邏輯的app.js 。每個(gè)page由四部分組成,頁(yè)面設(shè)置page.json、頁(yè)面文件page.wxml、頁(yè)面樣式page.wxss、頁(yè)面主體邏輯page.js。

與H5開(kāi)發(fā)一樣,我們可以根據(jù)需求在app.js和page.js里添加程序在生命周期每個(gè)階段相應(yīng)的事件。比如在頁(yè)面onLoad的時(shí)候進(jìn)行數(shù)據(jù)的加載,onShow的時(shí)候進(jìn)行數(shù)據(jù)的更新。

一個(gè)page的生命周期從onLoad開(kāi)始,整個(gè)生命周期內(nèi)onLoad、onReady、onUnload這三個(gè)事件僅執(zhí)行一次,而onHide和onShow在每次頁(yè)面隱藏和顯示時(shí)都會(huì)觸發(fā)。當(dāng)用戶手動(dòng)觸發(fā)左上角的退出箭頭時(shí),小程序僅觸發(fā)app.onHide,下次進(jìn)入小程序時(shí)會(huì)觸發(fā)app.onShow以及當(dāng)前page.onShow。僅當(dāng)小程序在后臺(tái)運(yùn)行超過(guò)一定時(shí)間未被喚起、或者用戶手動(dòng)在小程序的控制欄里點(diǎn)擊退出程序、或者小程序內(nèi)存占用過(guò)大被關(guān)閉時(shí),小程序被銷毀,會(huì)觸發(fā)app.onUnload事件。

一個(gè)完整的小程序執(zhí)行的生命周期如下:

微信小程序,小程序開(kāi)發(fā),騰訊體育

關(guān)于小程序的架構(gòu):

微信小程序,小程序開(kāi)發(fā),騰訊體育

如圖,每個(gè)小程序分為兩個(gè)線程,view和appServer。其中view線程負(fù)責(zé)解析渲染頁(yè)面(wxml和wxss),而appServer線程負(fù)責(zé)運(yùn)行js。appServer線程運(yùn)行在jsCore中(安卓下運(yùn)行在X5中,開(kāi)發(fā)工具中運(yùn)行在nwjs中),所以js不跑在webview里,不能直接操縱DOM和BOM,這就是為什么小程序沒(méi)有window全局變量。

那js如何操縱頁(yè)面?js與頁(yè)面的交互靠setData和事件觸發(fā),js通過(guò)setData來(lái)改變頁(yè)面數(shù)據(jù),頁(yè)面通過(guò)下發(fā)事件來(lái)觸發(fā)js中對(duì)應(yīng)的響應(yīng)事件。setData同時(shí)會(huì)改變當(dāng)前頁(yè)面的Page函數(shù)里的data對(duì)象,注意異步數(shù)據(jù)setData以后一定要update,不然頁(yè)面上的數(shù)據(jù)不會(huì)及時(shí)更新。

最初版本里,小程序的所有js跑在同一個(gè)作用域下,開(kāi)發(fā)過(guò)程中一不小心定義了相同的變量名就會(huì)導(dǎo)致其他頁(yè)面的數(shù)據(jù)錯(cuò)誤。在我們的推動(dòng)下,現(xiàn)在每個(gè)小程序頁(yè)面都是一個(gè)獨(dú)立的作用域,命名空間互不沖突。有人問(wèn),那我們想要全局變量怎么辦?又沒(méi)有window。微信提供的解決方案是在app.js中注冊(cè)全局變量,在每個(gè)頁(yè)面中通過(guò)getApp()函數(shù)獲取。

關(guān)于小程序的開(kāi)發(fā):

小程序開(kāi)發(fā)入門簡(jiǎn)單,按照官方文檔上給的簡(jiǎn)易教程,可以快速建立一個(gè)小程序。但是實(shí)際上手開(kāi)發(fā)會(huì)發(fā)現(xiàn)這樣幾個(gè)問(wèn)題:

小程序的開(kāi)發(fā)工具支持簡(jiǎn)單的模塊化,page路徑可單獨(dú)設(shè)置,但是提交代碼包的大小有限制1M,而小程序沒(méi)有提供相應(yīng)的文件壓縮與合并。

以前小程序框架的CSS不支持 import(現(xiàn)在支持了!),所有樣式只能寫(xiě)在一個(gè)文件里,不方便拆分,也不支持模塊化

CSS中圖片不支持相對(duì)路徑,需使用線上地址或base64的,在開(kāi)發(fā)階段不方便

暫不支持es6(新版本也支持了!超哥棒棒噠)

不支持LESS SASS POSTCSS

頁(yè)面與頁(yè)面之間代碼復(fù)用性差

為此,我們引進(jìn)了webpack將開(kāi)發(fā)目錄與發(fā)布目錄區(qū)分開(kāi)來(lái)。webpack是一個(gè)前端資源加載/打包工具,它能把各種資源,例如JS(含JSX)、coffee、樣式(含less/sass)、圖片等都作為模塊來(lái)使用和處理。通過(guò)引入webpack,我們實(shí)現(xiàn)了對(duì)es6+sass+postcss的支持,更加靈活的模塊化體系,成功隔離了開(kāi)發(fā)目錄和發(fā)布目錄。

微信小程序,小程序開(kāi)發(fā),騰訊體育

如上圖所示,我們指定發(fā)布目錄到/pub,圖片和css抽取合并后生成wxss文件,例如allmatch頁(yè)面的資源文件全在component/allmatch文件夾內(nèi),打包后生成的allmatch.wxss文件直接放在pub目錄下。

這里我要講一下,由于document、window對(duì)象的限制,Babel runtime相關(guān)、Commonchunk、code spliting、imports-loader等插件都不可用,想接入webpack的童鞋們要引起注意。在業(yè)務(wù)開(kāi)始初期,這可花了我們好幾天在和新框架磨合(淚奔臉)~

webpack還有一個(gè)小問(wèn)題,就是在調(diào)試的過(guò)程中會(huì)生成許多不必要的文件,為了解決這個(gè)問(wèn)題,我們寫(xiě)了一個(gè)清理發(fā)布文件夾的腳本,每次打包完成后會(huì)自動(dòng)運(yùn)行,清理非最終所需文件。

一些坑和經(jīng)驗(yàn):

page需在app.json里注冊(cè)才能被當(dāng)做頁(yè)面使用,利用這個(gè)現(xiàn)象可以創(chuàng)建一些公用template。不要試圖去給view等標(biāo)簽設(shè)置樣式,會(huì)被過(guò)濾。document window等都不存在于jscore 中,所以大部分涉及dom操作的框架都不能直接拿來(lái)使用。介于安全性考慮,new Function,eval 會(huì)被過(guò)濾掉。CSS 請(qǐng)用BEM的形式,因?yàn)閍pp里沒(méi)有自選擇器,為了防止微信提供的組件樣式被破壞,小程序也禁止使用層級(jí)選測(cè)器,最好提前養(yǎng)成好習(xí)慣。CSS里不要用圖片相對(duì)路徑,建議直接base64,wxml 里可以用圖片路徑。關(guān)于接口,一年后服務(wù)器會(huì)只支持https協(xié)議的接口,所以,現(xiàn)在盡量統(tǒng)一為https。關(guān)于登錄,目前小程序不支持cookie,而是采用前端利用微信提供的接口獲取登錄憑證code,server端再用code獲取密鑰session_key的方式對(duì)用戶數(shù)據(jù)完成加密解密,整個(gè)過(guò)程需要server端對(duì)已有的登錄體系進(jìn)行再次的封裝,而本地的登錄態(tài)可以利用微信提供的本地存儲(chǔ)進(jìn)行保存。

微信小程序,小程序開(kāi)發(fā),騰訊體育

關(guān)于開(kāi)發(fā)工具的提交預(yù)覽功能,預(yù)覽功能需要在能訪問(wèn)外網(wǎng)時(shí)才能使用,開(kāi)發(fā)網(wǎng)不支持使用,自己生成的二維碼只有自己可以體驗(yàn)。這對(duì)測(cè)試造成了一定的困擾。

image組件會(huì)有默認(rèn)圖片尺寸(320*240),無(wú)法完美適配寬高都不固定的多尺寸圖片。

關(guān)于我們:

短短一個(gè)多月,在小程序的開(kāi)發(fā)過(guò)程中我們經(jīng)歷了許多,也成長(zhǎng)很多,在此非常感謝有這個(gè)機(jī)會(huì)發(fā)表自己的一點(diǎn)小見(jiàn)解,若有理解錯(cuò)誤的地方盡請(qǐng)更正。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 积石山| 邢台市| 泗水县| 横峰县| 青州市| 阳信县| 阿图什市| 钟山县| 岳普湖县| 浦城县| 墨脱县| 江门市| 云龙县| 大庆市| 怀宁县| 鄂托克旗| 甘泉县| 从江县| 淮阳县| 保定市| 砚山县| 平遥县| 南投市| 普陀区| 枣庄市| 五指山市| 澄江县| 石景山区| 贺州市| 舞钢市| 郓城县| 鄂托克前旗| 崇义县| 东乌珠穆沁旗| 泽普县| 丽水市| 清流县| 广昌县| 浙江省| 藁城市| 渑池县|