在签到的时候,我发现了一段掘金前端糟糕的代码

7,527 阅读2分钟

签到了兄弟萌

今天在掘金签到的时候,偶然发现签到区域内 闪了几下,然后职业病就犯了……

Jietu20241212-010440-HD.gif

咦,这都凌晨一点了,怎么还跟我说下午好~?

难道是服务端计算的时间?没这个必要吧。。。

职业病犯了

好,于是打开了 NetWork,网速调慢一点,

QQ_1733936823118.png

嗯,这下就明显复现了:

222.gif

于是打开 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 看到的是 早上好