整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

我是 H 罩杯,我想做缩胸手术

我是 H 罩杯,我想做缩胸手术

部是女性的第二特征,在某种意义上,它代表着女性的美。很多女性都希望自己的胸部饱满坚挺,曲线曼妙。

但有一群女孩却因为「胸大」而烦恼,买不到合适内衣在她们的烦恼清单中根本不值一提。

从青春期起,她们中很多人就要忍受同龄人异样的眼光,遭受过不同程度的性骚扰,社会偏见一直伴随着她们成长。

一度她们希望通过做缩胸手术来改变这些偏见。

我们和两位 G 罩杯以上的女孩聊了聊,面对自己的「大胸」,她们做了不同的选择。

燕子, H 罩杯, 29 岁

24 岁的燕子进入电梯,在电梯按钮上摁数字「2」,电梯缓缓上行。

这是她第一次进美容院,心里有些忐忑。电梯门开,燕子看到整洁干净的大厅,休息区里面放置黑色皮沙发,暖黄色的灯光让燕子紧张的心稍稍放松了一些。

跟着服务人员指引,燕子见到医生:「我想缩胸,不想胸部那么大。」她对医生说。

燕子向我回忆起她第一次进入整容院的经历。过多的细节燕子不记得了,只是医生的一句话:「缩胸手术费用五六万,比隆胸还贵。」

她暂时退缩了。

燕子刚刚大专毕业时

图片来源:受访者供图

「90 H」,「胸罩脱下来,乳房快下垂到肚脐的位置」,燕子这样描述自己的胸部。

她带着超重的乳房生活了 20 多年。从青春期开始,胸大的「烦恼」一直没停过。

12 岁的年纪,其他女孩的胸部只是微微隆起,燕子已经有 B 罩杯。

女孩们偷偷地给燕子起外号:「大奶牛」、「童颜巨乳」。

这些看似的玩笑话,让青春期的燕子变得敏感。为了看上去和别的女孩一样,她把胸罩穿在里面,再裹上一个小背心,「这样看上去胸部会小一些」。

随着成长,燕子甚至偏激地认为胸大就是一种错。

小学毕业的时候,燕子坐火车没有座位,她在过道里站着。一个三十多岁的男性趁下车拥挤,抓了她的胸。燕子的脑袋当场就懵了,觉得一阵恶心。

随着身体发育,燕子的胸部越来越大,骚扰也越来越多。初中毕业去亲戚家开的店里帮忙,一群成年男性围着她,对她开玩笑:「胸那么大,真的假的?」、「不会是被别人摸大的吧。」

燕子想反抗,但她的反驳在这些男人的眼里,显得更加轻佻与放荡。

读大学后,因胸部带来的噩梦也没有结束。

在读书的时候,燕子有两段印象深刻的恋爱。

在第一段恋爱中,燕子真心喜欢那个男孩。怀着对恋爱的憧憬,燕子全身心投入到感情里。这段感情维持的很短,一个月后,分手了。

回忆起与前男友相处的点滴,燕子隐约觉得男孩和她谈恋爱只是喜欢她的身体,尤其是胸。

「是不是除了胸大,我一无是处。」燕子那一刻既愤怒又无力。

第二段感情是在毕业的时候,燕子认识了一个学校里的男孩。因为一些事情,燕子惹他不开心。为了报复,男孩把她的不雅照发在社交网络上。

她的胸部在那张照片上显得格外突兀。那段时间,燕子成了学校里的「名人」。

提起燕子没人知道,但要说那个大胸女孩,人人都知道。

临近毕业的那两个月,燕子时不时冒出轻生的念头。

走在校园里,总觉得有人在对她指指点点,她不敢抬头走路。这件事让她的心境跌落谷底。

直到现在,燕子仍然认为这件事情成了她自卑的源头。「若不是胸,我的人生肯定不会是现在这样。」燕子说。

毕业那年,燕子没有做成缩胸手术。但这个念头从来没有消失,「每周都有好几天想要去做手术,尤其是走在路上被别人议论的时候。」

即便是现在,她去便利店买水,店里老板都会说些轻浮的话:「你奶子真大。」

2019 年 4 月,燕子又一次来到整形医院咨询缩胸的事情,医生对她说:「最好生育结束,给孩子哺乳完再考虑。」

燕子现在的样子

图片来源:受访者供图

还未生育的燕子有点犹豫,但她对我说:「别人说我自私也罢,但我真的很想做缩胸手术。」

「为什么没做?」我问。

「一方面可能是因为钱,缩胸手术真的很贵。」燕子还说了另一个原因:「害怕,担心出意外。」

魏坤 ,J 罩杯 ,31岁

魏坤的青春期,伴随着胸部疯狂生长。

16 岁年纪,她的胸部已经长到 E 罩杯。

别的女孩可以穿漂亮的吊带衫,可以在游泳池穿着泳衣肆意展现好看的身材,也可以在 400 米的塑胶跑道上尽情奔跑。这些简单的小事,魏坤从来没做过。

22 岁的时候,魏坤的胸部长到了 J 罩杯。

「大胸」这件事给魏坤带来无尽的苦恼。因为胸部过大,她被同学称做「大咪咪」。

魏坤在《超级演说家》上的自述

图片来源:视频截图

中学的时候,她曾被一个男孩围堵。男孩用蛮力把她拖到一个小黑屋,试图猥亵她。魏坤心里充满了恐惧,使劲挣脱,踹了男生一脚,才侥幸逃脱。

这件事情让魏坤意识到,她的胸已经成为某些不怀好意男性眼里的猎物。

18 岁的时候,她就开始在网络上搜索「缩胸」相关的信息。「这是一个冷门手术。」魏坤说:「当时网络上可靠的信息几乎没有。」

尽管如此,想变成一个正常女孩的欲望并没有消失。她打算做缩胸手术,但不敢问家里开口要钱。

为了攒钱,魏坤做了很多兼职。2010 年,魏坤拿着好不容易赚来的钱走进了山西太原某民营医院。

「这只是一个小手术,绝对安全,没有后遗症。」穿着白大褂的医生对魏坤说。

护士热情的询问和解答,让魏坤开始憧憬未来的正常生活。在医院呆了 3 天,魏坤做了缩胸手术,她从 J 罩杯变成了 G 罩杯。

正当魏坤以为自己能像一个普通女孩那样生活的时候,却发现噩梦开始了。

当绷带拆除的那一刻,魏坤看到了右乳房下发有部分发黑发硬。医生用一根很长的针直插进去,魏坤没有任何感觉。

她问医生:「这是怎么回事?」医生说:「术后正常反应。」

魏坤心里有些隐隐不安,又过了几天,黑色的位置开始扩大,乳头开始溃烂,甚至出血。

魏坤再次询问医生,医生打着马虎眼回应:「正常反应。」

魏坤意识到手术可能失败了,她开始疯狂求医。

之后,魏坤做了 3 次清创手术,去除坏死组织。右乳因为延误治疗太久了,几乎挖空乳房下半部分的所有组织。

为了保住乳房,魏坤找了很多医生,最终在上海龙华医院,医生尽全力保住了她的乳房,尽管她的乳房已经不再完整——失去了乳头乳晕,还留下了一个大大的伤疤。

面对丑陋的乳房,23 岁的魏坤有些绝望:「我还那么年轻,那么丑的乳房谁会喜欢?」

就在这时,她看到一档电视节目——《许愿清单》,这是一档可以提供免费整形的综艺节目。

「里面有一个案例和我特别相似,但修复得特别特别好,那一刻我觉得我有救了。」魏坤说。她毫不犹豫地报名,被节目组选中。

2013 年 12 月 9 日,魏坤一直记得这个日子。整容节目的专家握着她的手说:「我可以帮你修复胸部,并且还要给你一张完美的脸。」

那一刻魏坤激动万分,就像黑暗中抓住了救命稻草一样,尽管脸部整形是院方为了宣传做的附加项目,但魏坤还是答应了。

「感觉自己像中了超级大乐透。」三个月后,魏坤摘掉纱布,以为缩胸带来的噩梦终于可以结束。

但现实给了她狠狠一击。

她看着镜子里完全扭曲的自己,有些不敢相信:鼻子和下巴向两个不同的地方歪着,下嘴唇不受控制地向右牵扯,整个下巴都是麻木的。

魏坤讲述整容失败后的感受

图片来源:视频截图

从那之后,为了修复,魏坤不得不进行了多次手术。现在,魏坤脸上的骨头全部截开过,现在靠钉子固定着,有 12 颗。她的脸上做过 17 项手术,切了 20 多刀。

「一开始只想缩胸,但现在就像换了张脸。」她说。

「人多的时候,我会躲开,因为我特别担心鼻子被撞塌了,脸被撞歪了。」魏坤坦言:「今年还会打算去修复鼻子。」

女人最美好的几年青春,魏坤都耗费在维权和修复上。身上的皮肤组织无数次的被抽取、切开,按照魏坤的话来说,她经历了从人到鬼,又从鬼到人的过程。

除了忍受身体的伤痛,还要忍受心理的伤痛和折磨。魏坤记不清自己有多少次想要自杀,爬上医院的窗台,又被妈妈拽了回来。

胸部让魏坤的人生变得越来越糟糕。

2016 年,她在北京卫视的一档节目《我是演说家》,讲述自己的整形故事。

凭着演讲,一些整形医疗机构注意到她,希望能够让魏坤代言,甚至开出高薪。

魏坤近照

图片来源:采访者供图

魏坤一一拒绝:「我不想昧着良心挣钱。」现在的魏坤从事演艺工作,自称「十八线」小演员,忙起来连轴转。

「只有当演员,我才能忘记自己糟糕的人生。」魏坤说。

我问:「你后悔做过那次缩胸手术吗?」

魏坤说:「这件事情肯定会做,但后悔自己的无知。如果当年能够多一点时间了解缩胸手术的知识,考虑到所有的可能性,理性地选择医院和医生,也许结局会好一些。

(燕子系化名)

燕子和魏坤的苦恼都源自她们的胸。实际上,她们的胸并不会危害健康,只是相比于普通女孩尺寸大了一些。

「乳房」作为女性的象征,它的大小似乎是评价女性的重要标准。

大胸,在一些人的眼里成为了放荡和轻佻的代名词,这些世俗偏见无时无刻不在影响着她们的生活。

明明不会威胁到身体健康,但为了撕掉标签,这些女孩们,她们或是选择冒着高风险做手术,或者无奈地接受现实,承受着精神折磨。

胸大有错吗?她们和其他女孩一样,努力地生活,善良地对待身边的人。

我们评价女性的标准只有外貌吗?为什么不能丢掉偏见的眼光,带着善意来看待这些女性。

胸大胸小都是美,请不要一边说她们大胸妹,一边盯着她们胸口看。

乳房缩小术

乳房下垂是一种生理现象,由于胸部腺体和结缔组织增生肥大和萎缩后胸部的皮肤弹性降低,支撑韧带拉长,使胸部皮肤弹性降低,给女性的工作和生活带来不便。

缩胸是指从乳房上移除部分脂肪、乳腺组织或者皮肤。在大多数情况下,它可同时提升乳房和缩小乳晕(乳头周围深色的皮肤)。

手术会切除多余的组织、脂肪和皮肤。大多数女性的乳头以及乳晕都被移到了一个新的位置,这可能导致完全和永久性的感觉丧失,并且可能会失去哺乳能力。

※ 如果因乳房过大造成生活或工作困扰,请去正规医院就诊。

本文经由 南京鼓楼医院整形美容科住院医师 莫然 审核

策划Ant

责编罗布君

封面图来源站酷海洛

— 参考文献 —

[1] 安东尼.L.科马罗夫(哈佛医学院博士、内科教授). 哈佛家庭医学全书[M]. 2017.

[2] 李尚善, 栾杰. 巨乳缩小整形术的研究进展[J]. 中国美容整形外科杂志, 2017(11):24-25+33.

[3] https://www.haodf.com/zhuanjiaguandian/zhongqiandoctor_4583607795.htm

[4]https://v.qq.com/x/page/g0521xc3bjo.html

春贺岁,金猴送礼。伴随着农历春节的临近,《航海王》游戏正版手游《航海王 启航》也为广大玩家准备了缤纷豪礼。在开启节日十大福利活动的同时,游戏还于今日为广大玩家开展新年“梦想许愿季”,只要你说出自己的心愿,即可免费获得价值不菲的游戏礼包,更能有机会赢取限量典藏手办。

活动参加地址:http://op.mobage.cn/html/opnewyear

说出热血梦想 100%获得专属礼包

路飞说过:“我是要成为海贼王的男人!”是的,人若没有梦想,和咸鱼有什么区别。春节辞旧迎新之际,《航海王 启航》将为所有玩家开展“梦想许愿季”。从2月5日到19日,玩家只要登录活动页面,即可输入自己的新年愿望。这之后点击提交按钮,即可轻松参与进来。同时游戏还会给所有提交愿望的玩家送出价值不菲的游戏礼包码,用来兑各类超人气道具。值得注意的是活动会在5号的晚上正式上线,无须着急。

竞猜好友心愿 抢获正版典藏手办

玩家提交完心愿后,还可将自己的内容朋友圈等处,邀请他人前来竞猜。当好友进入活动页面后,系统会出现三个备选问题,其中有一个是正确答案,好友点击勾选即可完成竞猜。当然,邀请进来的好友自己也可以进行许愿,同样能够得到价值不菲的游戏礼包码。那么最终游戏会在所有使用过礼包码的玩家中,随机抽选3名幸运儿,送出万代游戏超限量手办,让梦想照进现实。

冥王雷利登场 新春活动缤纷贺岁

“冥王”西尔巴兹-雷利是原著中的超人气角色,原罗杰海贼团副船长。不过在罗杰死后,雷利一直留在香波地诸岛当膜工匠,后来成为路飞导师,教会其使用“霸气”。同样在《航海王 启航》中,雷利也将霸气登场。从2月4日到7日,玩家累计充值即可获得不同数量的雷利碎片,将冥王招入麾下。同样游戏还会陆续开启10大新春贺岁活动,给玩家送出新春福袋、饺子、爆竹、海量钻石、晶石包等豪华奖励。

系列角色收集 群雄汇聚春节酒馆

当然除了“冥王”雷利外,也会有其他各种人气角色登场。活动期间,每天的活动酒馆都有几率获得角色碎片和专属碎片,包含了马尔高、罗、大熊等强力角色。并且有一定概率过的30个碎片的暴击,心爱人物瞬间抱回家。不仅如此,春节假期连续充值和消费的话,更可以获得罗宾、路飞、乔兹等,还有双倍风暴和免费活动等待着玩家。

猴年狂欢,加入《航海王 启航》梦想许愿季,参与十大新春活动。实现心中的梦想,赢取全民百万福利。

背景


随着互动游戏业务 DAU 量级增加,性能和体验重要性也越发重要,好的性能和体验不仅可以增加用户使用体感,也可以增加用户对于互动游戏的使用粘性。

对现状分析,主要存在首屏渲染速度慢、打开页面存在白屏、页面加载过多资源等问题,核心手段是增加骨架、接口优先级调整、预渲染、减小包体积等。

优化后,互动游戏签到功能做到同类业务性能体验 Top 级别,下面是优化后数据:

首屏渲染速度:优化后提升首屏渲染速度 39%

首屏骨架:骨架体积大小减少 44%(压缩后减少 50%)。

首次加载总资源:资源总体积优化后,大小减少 69%


骨架

骨架屏是指在页面加载时,临时显示出页面的主要结构,可以让用户在等待页面加载完成时,得到视觉上的反馈,提升页面的用户体验。

骨架示意图vs数据渲染

可以看出在接口返回数据之前,可以先使用骨架得到一些界面反馈。

缓存

虽然骨架屏可以让用户在视觉上得到反馈,毕竟不是真实的数据,总体还是有一些简陋,用户也可能并不知道这块区域实际渲染的是什么样的内容,若是网络环境不好,很可能会长时间的停留在骨架屏阶段,为了增强一些体感,使用缓存进一步对页面进行优化。

使用缓存渲染具备以下优势:

  • 与骨架屏相比,缓存渲染十分接近用户最终所见,因为每次接口返回数据都会更新缓存,用户再次进入时看到的都是自己上次进入时的数据。
  • 当用户处在弱网或者断网等不可抗力的环境中时,可以得到较为完整的页面数据展示,可以很好减弱用户环境带来的网络营销。

使用缓存注意事项:

  • 一些缓存渲染应屏蔽事件响应,避免造成不必要的报错和客诉。比如商品的缓存渲染,由于商品存在下架、优惠券调整等情况,缓存的数据和实际数据会存在一定的偏差。
  • 缓存渲染逻辑需要更加前置,不应该将缓存渲染的逻辑放在原本的位置,这样会拖慢渲染的时机。

接口后置

浏览器对同一时间内的请求数量是有限制的,既并发请求限制。当一个页面首次渲染时需要浏览器发起很多接口请求,用于填充页面渲染需要的数据,若是对于页面渲染时的请求数量不加以控制,便可能导致一些问题出现。

现在有 home 和 info 两个接口,home 接口返回的数据是首屏渲染需要依赖的,info 接口返回的数据则不是首屏必须依赖的。假设现在还有一些其他请求占据了并发请求限制的数量,导致 home 接口请求变慢。

若是 info 接口响应慢,长时间占据这浏览器的请求进程,会导致页面首屏渲染速度更慢,那么就需要有个一套方案可以根据接口的优先级进行加载顺序控制,可以将顺序变为如下。

方案:当页面加载完成后一定时间后,进行低优先级接口的请求,或者触发页面的滚动、点击等时立即进行接口请求。

此方案适用于:确定接口延迟加载并不会阻塞用户的交互和操作。

将其封装为一个 hooks,便于复用,直接先看代码再解释:

import { useRM, createRM } from 'xxx'


const listen=(type: string, listener: ()=> void)=> {
  const l=()=> {
    listener()
    document.removeEventListener(type, l)
  }
  document.addEventListener(type, l)
}


const pageFlowModule=createRM(
  {
    assemble(state) {
      const reactionObserver=()=> {
        state.isUserReactioned=true
      }


      ;['scroll', 'mousedown', 'touchstart'].forEach((type)=> {
        listen(type, reactionObserver)
      })
      setTimeout(reactionObserver, 4000)
    },
  },
  { isUserReactioned: false },
)


pageFlowModule.actions.assemble()


export const usePageFlow=()=> {
  const [state]=useRM(pageFlowModule)
  return state
}
使用:
import { usePageFlow } from 'xxx'




const Demo=()=> {

    const { isUserReactioned }=usePageFlow()




    const fetchHanlder=useCallback(()=> {

        // 接口请求数据

    }, [])




    useEffect(()=> {

        if(isUserReactioned) {

            fetchHanlder()

        }

    }, [isUserReactioned, fetchHanlder])




    return <div>{/* 渲染接口返回的数据 */}</div>

}

从上面代码可以看到,会将一些非首屏需要的请求后置,后置的接口可以在页面加载完成 4s 后自动触发调用,也会在用户有触屏、滚动页面等行为的时触发接口的调用。

骨架优化

签到和许愿树目前主文档中除了骨架部分还包含了一些公共的 JS 和 CSS,对不同资源类型进行拆分、汇总后发现,不管是签到还是许愿树,实际包含 HTML + JS 部分仅占极小比例,大量的流量消耗在了 CSS 上。

对 HTML 中 CSS 部分再进行梳理发现,文件中包含的除了骨架的 CSS 部分和公共组件库的 CSS 部分之外,还包含了大量弹框的 CSS。这三类中,骨架的 CSS 要保留,公共组件库的 CSS 可以拆分但是难度较大,剩下的就是弹框或者非骨架部分的 CSS。

  • 需要把弹框部分组件做异步加载,保证预渲染的时候这部分 CSS 文件不会被加载到。
  • 拆分骨架组件,把骨架组件从业务组件中剥离,预渲染的时候只渲染和加载骨架部分,不加载其余主文件部分 CSS,进一步缩小骨架。

localStorage性能问题

在做优化之前,并未意识到 localStorage 所隐藏的性能问题,业务中使用了大量的本地存储,使用 Performance 记录一下存储消耗的时间。

记录核心代码:

export const setMallFlowStoreData=(data: any)=> {

  performance.mark('start_localstorage_operation')

  // localStorage 操作.....

  performance.mark('end_localstorage_operation')




  performance.measure('localstorage_operation_duration', 'start_localstorage_operation', 'end_localstorage_operation')

}

输出记录的时间:

const entries=performance.getEntriesByName('localstorage_operation_duration')

const TOTAL_TIME=entries.reduce((current, next)=> {

return current + next?.duration

}, 0)




console.log('全部记录:', entries, '共耗时:', TOTAL_TIME)

输出结果:

可以看到通过 localStorage 进行一次存储操作,大致需要耗时 0.2-0.5ms 之间,若是当页面存在大量的前端的存储操作时,低端机型在存储操作上消耗甚至达到 10-20ms,若是代码写的不合理,导致页面 reload、反复触发获取操作等情况,这个时间又将会成倍的增加。

接下来先一起看看为何会存在性能方面的问题和解决方案。

存储数据

问题:

localStorage 的存储是同步的操作,因此在存储大量数据时,可能会导致阻塞 UI 线程,影响用户体验。

方案:

核心思路便是将同步操作转换为异步操作,这样就不会阻塞 UI 线程。

  • 使用 Web Worker ,会增加一些项目维护的复杂度,且其是 HTML5 标准中新增的技术,存在一定的兼容性(ChatGPT 给的,应该是错误答案,并未在 MDN 中看到)。

  • 使用 setTimeout、setInterval,兼容性绝对的好,但是并未从根本解决问题。
  • 不用 localStorage,直接上 IndexDB,但是由于代码项目原因,不能改动原有的太多逻辑。

综合解决方案和历史原因,只能退而求其次选择 setTimeout 的方式解决这个问题。

读取数据

问题:

每次读取 localStorage 数据时,都需要从磁盘中读取数据,因此在处理大量数据时,可能会出现性能问题。

方案:

可以将数据进行放到内存中缓存处理,在用户的整个操作周期内只从 localStorage 获取一次数据,需要注意的是每次对数据进行操作时,需要将 localStorage 和内存缓存的数据同步更新。

数据类型转换

问题:

在存储和读取数据时,需要将数据进行序列化和反序列化操作。这些操作可能会导致性能问题。

方案:

使用 JSON.stringify() 和 JSON.parse() 函数来处理数据的序列化和反序列化。

经过对 localStorage 存储优化以后,在红米 note 11 上面进行了简单测试,首屏打开速度提升,对于整体提升首屏提升约 2%。

动效执行时机

页面存在渐入渐现的动效,在页面首次加载时,由于渐现动效的存在,会延迟用户感知该模块,从而导致感觉页面存在更多时间的白屏,动效如下:

核心问题是首次渲染直出 DOM 结构,不走渐现动效便可,这个比较偏向于逻辑处理,属于体验优化的范畴,主打的就是在后续有相关首屏动效时,有意识对其做一下处理,保证首屏首次渲染的完整度。

渲染模块的取舍

首先看一下两种状态各自的样式:未签到 VS 已签到。

签到业务的日历会根据用户当天签到状态进行渲染,存在已签到和未签到两种渲染逻辑,由于当前的架构限制,并不能在预渲染时感用户的签到状态,导致日历部分的渲染会滞后,严重影响页面的首屏渲染速度。

第一版本优化

将签到状态进行缓存,当用户进入签到时的大致流程如下:

当用户进入页面时,会优先获取缓存中的数据进行渲染,确保用户可以第一时间看到日历部分的渲染,这里需要注意:1. 缓存需要结合用户 token 一起判断,避免造成切换账号时造成数据污染。2. 若是用户第一次进入或者当天未签到,会使用系统时间作为小日历上的数字展示,当用户修改了系统时间设置时,日期判断会存在误差。

缓存数据必然会先于接口响应数据,因此页面第一时间看到的肯定是缓存数据(没有缓存数据,会默认使用未签到数据)所渲染的页面,那么当接口响应完成时,需要使用真实的数据触发页面的 rerender,需要注意处理,避免造成页面闪烁。

虽然这样做可以提高页面的渲染体感,当进入页面时,顶部区域还是会存在一定时间的空白,毕竟还是需要执行 JS 后才能执行骨架渲染逻辑,本质提升速度为:接口响应时间 - JS 执行时间,在低端机表现会较为好一些,高端机体感并非太明显。

第二版优化

日历部分由于已签到和未签到的样式存在着较大的出入,不能像某些竞品一样:已签、未签的整体页面布局并未有区分,使用一套公用的渲染逻辑,这样也导致签到业务需要将渲染日历部分的动作滞后,那么核心就是怎么解决这个问题。

综合考虑后,决定将未签到样式作为预渲染时直接生成 DOM,这样可以保证用户未签到的状态下进入到页面可以第一时间对的状态,也可以更快的完成首屏的渲染。

若是用户已签到,便在此基础之上复用今日签到的逻辑,就是会在签到完成后展示一个小的动效,将小日历变成大日历的样式。这样做的好处可以是获取到用户真实状态后,自动切换到大日历状态,效果如下。

结合用户行为分析:多数用户一天不会多次访问,也就是在即不怎么牺牲高频率访问用户的体验之下,提高了绝大多数用户的体验。

首屏数据优先请求

前置小知识:最大并发请求数

为了避免浏览器过度占用系统资源,浏览器对于同一域名下的请求数量是有一定限制的,也就是常见的浏览器最大请求数量。

以 Chrome 浏览器举例:同一域名下,HTTP 协议最多允许同时存在 6 个 TCP 连接进行,HTTPS 协议最多为 4 个。

业务现状

签到进入页面共计加载许多接口。

其中首屏渲染需要的几个核心接口如图红色标记所示,核心的接口滞后会导致页面数据渲染的更慢,严重影响体验,那么到底影响多少呢?可以在浏览器 Network 中查看 Waterfall。

核心接口是在其他完成后开始,是因为其没有赶上浏览器第一批次接口请求队列中,需要等待前面某些接口结束后,才会将其放到请求队列中。

动作

有了问题,接下来便是如何做:

  • 首先是制定方案,如何确保接口的请求可以搭上浏览器请求队列的第一班车,本质是将之前散落在各个组件内的 useEffect 中的初始化逻辑进行提取,统一触发。
  • 梳理接口和首屏渲染的关联度,确定哪些接口的优先级权重更高。

核心代码如下:

export const StartModule=createRM(

  {

    init() {

      SigninTopModule?.actions?.getHomeData()

      AdModule?.actions?.reqAdInfoList()

      HomeModule?.actions?.getBubbleList()

    },

  }

)

在页面初始化时执行 StartModule?.actions?.init(),将核心接口优化执行,通过控制接口请求顺序,签到业务在此提升了大致 6-8% 的首屏渲染速度。

字体使用和优化

字体加载和优化是前端开发中的一个重要问题,特别是在移动端和低网络状况下。下面是一些字体加载和优化的技巧。

FOUT问题

通过设置 Font-Display 属性可以控制字体加载时的显示效果,包括 Auto、Swap、Block、FallBack 和 Optional 几种模式,可以减少字体加载时间和防止文本闪烁。

设置属性为FallBack时效果:

可以看到日期存在明显的 FOUT(无样式文本闪现)问题,设置 Swap 也是类似效果,并不符合预期。

设置属性为 Block 时效果:

可以看到第一时间并没有渲染日期,而是有点的短暂空白,因为其可以避免 FOUT,字体文件必须在后台下载完全后,文本才能显示。

最终选择了 font-display: block;效果会更好一些。

注意,并不是整个页面都使用 Block 属性,对于一些非首屏关键渲染的样式,使用 fallback 更为合适一些,因为其会使用浏览器默认字体,所以还是需要结合业务、场景合理使用。

字体库大小,你得懂

先看一个 GPT 对于签到业务常用字体库打下的统计:

DIN Condensed 字体库的大小在几百KB 到几MB之间

Helvetica Neue 字体库的大小在几MB到十几MB之间

也就是这两种字体的大小,如果不加以处理,全部加载的大小在几 MB 到十几 MB 之间,对于前端项目而言,这是挺夸张的一件事。

可以和设计人员沟通,将字体库中常用的字体导出,前端项目仅仅引入需要的字体就好,比如 DIN Condensed 字体都是使用在阿拉伯数字上,并不会在其他字上使用,那么只需要将阿拉伯数字导出即可。比如汉字,根据《现代汉语通用字表》(GB/T 13000-2018),常用汉字(包括简体字和繁体字)共计 3500 个,其中常用的一般是指前 1000 个左右的汉字,那么在使用字体库的时候,是不是可以默认只需要导出部分即可。

经过处理后的字体库大小如下图:

字体库数量,你得控制

上面说了一个字体库的大小是多大,就算是经过处理,最少也会有 30KB 大小,所以项目引入的字体种类是需要控制的,不能设计同学使用了多少种类字体设计,我们就要照单全收。

当设计同学新增字体库时,如果字体使用在 3 次以内,是不是可以使用图片来代替文字,或者使用现有的字体库来平替。

十一

慎用三方库

业务中存在一些简单的校验、转换和动效并不需要引入三方库,尤其是因为一个较为简单的功能引入了一个较为大且冷门的库时,不仅会增加项目的打包体积,还会增加项目后续维护的沟通、学习成本。

例如下面一个简单切换动效:

是一个比较常规的切换动效,却在项目中引入了一个第三方库来实现,该库的使用也是有一些学习成本,因为其具备实现比较复杂的动效能力,在业务动效具备一定复杂度且非首屏的场景下,是可以考虑引入使用的,否则类似这种首屏便需要加载的动效,还是慎重。

上述的切换动效 CSS 实现代码如下:

@keyframes bigScale {

  0% {

    opacity: 0;

    transform: scale(0.95);

  }




  to {

    transform: scale(1);

    opacity: 1;

  }

}




@keyframes smallScale {

  0% {

    transform: scale(1);

    opacity: 1;

  }




  to {

    transform: scale(0.95);

    opacity: 0;

  }

}




.squareInCenter {

  animation: 0.3s linear 0s 1 normal forwards running bigScale;

}




.squareOutCenter {

  animation: 0.3s linear 0s 1 normal forwards running smallScale;

}

在业务开发的过程中,尤其是 C 端的页面,在实现功能时对于引入额外的库是一件需要十分谨慎的事情,在内部就看到不少项目在引入关于日期处理方面的库时,DayJS、MomentJS 同时都会引用到项目中,B 端项目都不能忍,更何况 C 端项目。

十二

总结

本文仅仅介绍得物前端增长团队在互动游戏侧一些体验优化实践心得,后续还在不断迭代和优化,将实践经验应用扩大至多个业务中,将整个互动游戏性能体验优化至 TOP 级别。


作者:来骏

来源:微信公众号:得物技术

出处:https://mp.weixin.qq.com/s/18ejopngp7hmyz0VTncKgw