公司那个后台项目里的 moment 一直没人动,打包出来三百多 k,我们组长九月初说换 dayjs,这活就丢给我了。
我第一反应是手工改。moment( 全文一搜,137 处,散在六十多个文件里。改到第三天我有点烦了,主要是无聊,改到第二十几个文件的时候我开始把有些没用的地方也顺手删了,越改越不像话。而且眼睛确实花了,有一处 format 里我多打了个空格,自己都没看出来。
然后我才想起来可以让 AI 写个脚本。
我给它的需求特别粗,就一段中文:把项目里所有 moment 的用法换成 dayjs,import 一起换,注意有些地方用了 utc 和 duration。它回了我一个 node 脚本,用 AST 改的。AST 我查了下,抽象语法树,大概是这个意思,之前只在别人博客里见过这个词。它不是用正则,这点我当时挺意外,我以为它会甩给我一堆 sed。
跑之前我先 git commit 了一遍,这个习惯是我被坑出来的,跟我们组长没关系。脚本跑完吐了一个 report.txt,改了 137 处,另外列了 6 个它不敢动的,说这些地方用了挂在 moment.fn 上的自定义方法,得人工确认。我一条条看完,确实都是我们自己挂的,它一处没瞎改。那个 report 我觉得很 make sense(这个搭配对吗,管他的),比我预想的好太多。
坑在后面。
它把 moment.locale('zh-cn') 那行给删了,说 dayjs 默认不带 locale,要用得引插件。这话没毛病,但它删完之后没给我补上 dayjs 的 locale import。结果是所有显示星期几的地方全变英文了。这个 bug 藏了两周多才被发现,因为那个日历组件在后台上,平时根本没人点。上周五早上运营过来说,这个 Fri 是啥意思。我打开一看,满屏的 Fri Sat。
还有一处是 momnet.duration(x, 'days'),它直接改成了 dayjs.duration,但我们没装 duration 那个插件,跑起来直接报错,是我自己 npm i 补上的。
除此之外它干的都对。我自己改的话估计要一星期,它一个下午就完事,还顺手把几个 import 合并了,这个我没要求,但它合的挺对。
所以到底谁比谁强我也说不清。它快,它还能挑出我自己不会去检查的地方,但它删东西的时候不打招呼,这个跟人一样讨厌。
今日单词:codemod,读音我自己标的是"扣的猫的",大概意思是"用代码去改代码"。我估计还得再查好几次才记得住。