签到了兄弟萌
今天在掘金签到的时候,偶然发现签到区域内 闪了几下,然后职业病就犯了……
咦,这都凌晨一点了,怎么还跟我说下午好~?
难道是服务端计算的时间?没这个必要吧。。。
职业病犯了
好,于是打开了 NetWork,网速调慢一点,
嗯,这下就明显复现了:
于是打开 Source 面板,搜了搜关键词 晚上好,找到了这段代码:
y = Object(Z.computed)((function() {
return r.value.lt_task_exist && r.value.extra.lt_task_title_web ?
r.value.extra.lt_task_title_web :
h < 9 && h >= 6 || 9 === h && 0 === m ? "早上好!" :
h >= 9 && h <= 11 ? "上午好!" :
12 === h || 13 === h && m <= 30 ? "中午好!" :
h >= 13 && h <= 17 || 18 === h && 0 === m ? "下午好!" :
"晚上好!"
}
好家伙,大概意思是,如果能显示 lt_task_title_web,就先显示(大概是签到成功的文本),否则:
- [06:00-09:00] 早上好
- (09:00-12:00) 上午好
- [12:00-13:30] 中午好
- (13:30-18:00] 下午好
- 其他时间 晚上好
乍一看,没啥毛病啊,但为什么现在是凌晨的 01:00 会先显示 下午好,再秒切晚上好,再因为请求到了签到信息,切换为了签到信息?
于是开始怀疑,是不是在 HTML 中有默认值是下午好,然后 JavaScript 完成计算后才得到了晚上好,那就继续搜索,果然在 HTML 中发现了这段:
<span class="title" data-v-dd4bc01e>下午好!</span>
你说气不气
好家伙,原来是这样。那么问题来了:
疑问1:掘金的前端同学是不是也上午摸鱼,下午才开始写代码,于是才在HTML中留了 下午好?(狗头)
疑问2:掘金的午休时间是不是中午只有一个半小时~
优化代码
不过吧,刚才扒出来那段 JavaScript 代码的三目运算属实有点***
- 魔法值常量出现太多,可维护性糟糕
- 三目运算嵌套N次,可读性糟糕
如果这么改,你觉得如何?
const date = new Date()
const hour = date.getHours()
const minute = date.getMinutes()
const labels = [
// [小时, 分钟, "文案", "小时:分钟 是否属于这个区间的布尔"]
[6, 0, "晚上好", false],
[9, 0, "早上好", true],
[12, 0, "上午好", false],
[13, 30, "中午好", true],
[18, 0, "下午好", true],
[23, 59, "晚上好", true],
];
console.log(labels.find(item => hour < item[0] || item[3] && hour <= item[0] && minute <= item[1])[2])
你说气不气
代码没问题,有问题的HTML内的默认值。
更新
发现了,HTML应该是缓存上了,比如这会 2024-12-12 16:08:44 看到的是 早上好。