给卡帕多奇亚青旅做预订页,我把土耳其语日期格式化踩了个遍
上个月接了个小外包:卡帕多奇亚格雷梅一家青旅的预订页,原本只有英语,老板想加土耳其语。技术栈很朴素,Vue 3 + Vite + dayjs,数据是从他那套老 PHP 后台导出的 JSON,大约 400 条房型和档期记录。上线前我在本地跑得好好的,切到 `tr` 之后日历上冒出一串 `31 Aralık 2025 Salı` 混着 `12/31/2025`,同一屏里两种写法,老板截图过来问是不是坏
自学前端一年多,作品集卡住了,想找人说说话。
上个月接了个小外包:卡帕多奇亚格雷梅一家青旅的预订页,原本只有英语,老板想加土耳其语。技术栈很朴素,Vue 3 + Vite + dayjs,数据是从他那套老 PHP 后台导出的 JSON,大约 400 条房型和档期记录。上线前我在本地跑得好好的,切到 `tr` 之后日历上冒出一串 `31 Aralık 2025 Salı` 混着 `12/31/2025`,同一屏里两种写法,老板截图过来问是不是坏
手上的活是给一个做本地生活的小客户写查询接口,Node 20 + Express,跑在 Cloud Run 上,最小实例数 0(客户不愿意为闲置付费),内存 512Mi。压测时发现一个很尴尬的现象:服务热着的时候 P95 是 90ms,但只要闲五分钟,第一个请求稳定卡 8~9 秒。前端那边 loading 转圈转到用户以为挂了,我的外包口碑也跟着转圈。
卡帕多奇亚那家洞穴民宿的老板要一个预订页,能选日期、看空房、提交订单。我拿到需求的时候心想这不就是个日期选择器嘛,三天能搞定。结果上线第一天,老板发消息:有个客人订了 14 号的房,但系统显示 13 号入住。
客户是个做本地家政的小程序,搜索框要能输入小区名自动补全。我第一反应是 Places Autocomplete,文档看着挺顺,加上 session token 就能按会话计费。我拉了个测试环境,Places API 版本是当时控制台默认给的那版,量级也不大,一天几百次请求,感觉闭着眼都能过。
第一次配 Cloud Scheduler 定时触发一个 Cloud Function,我图省事,控制台里时区下拉框直接用了默认的 UTC。任务跑了两天,客户早上八点看数据,全是前一天下午的。啊这,我以为是 Function 里时区没写对,改代码、重新部署,来回折腾一轮,才发现调度器本身就在 UTC 里发车。
卡帕多奇亚那家民宿的老板是去年在格雷梅镇上认识的,今年春天他让我帮他做个小预订页,说 Booking 抽成太狠。我接了这个外包小单,前端用 Vite + React,后端直接挂在他已经有的 WordPress 上,用 REST API 拉房态。环境很土:Node 18,Vite 4.5,部署在一个每月三美元的共享主机上,没有 CI,靠 FTP 传 dist。
上周接了个小单:客户是个卖本地特产的小店,想在自家静态页面上加一个搜索框,输入「红」就联想出「红糖糍粑」「红薯干」。页面是纯静态托管在 Cloudflare Pages 上的,后端只有我给他写的一个 Cloud Run 小接口,数据量说出来有点丢人——商品总共 400 多条,存在一张 BigQuery 小表里。
上周四晚上十一点,外包群里甩来一个小单:卡帕多奇亚一家民宿的官网要加英、土双语切换。我接的时候心想,不就是多一套 JSON 文案吗,两小时收工。结果救命,卡在土耳其语长地名上整整一晚上。
卡帕多奇亚的青旅老板让我帮忙改一个本地体验清单页,跑在 Chrome 120 和 Safari 16 上,数据是 120 条体验项,每条有土耳其语标题、时长、集合点。现象很具体:在 iPhone SE 宽度下,一条集合点叫「Göreme Belediyesi Karşısı, Aydınlı Mah. No:7」的长地名把整个卡片撑到横向滚动,标题挤成两行,按钮直接滑出视口。
上周接了个外包小单,客户是个卖手工皮具的独立站,之前外包团队跑路,丢给我一句「SEO 后台一堆报错,你看看」。我打开 Search Console,索引覆盖里 404 那栏挂了 1800 多条,点进去一条条看,全是 `/product/xxx?from=old` 这种带旧参数的老链接。
外包接了个小活:给一家做门店巡检的公司整理 300 台 Windows 小主机的 Chrome 版本,判断哪些还卡在 108 之前。对方没域控,没 WSUS,只有一份 Excel 主机名清单和一台能连外网的跳板机。第一反应是挨个远程桌面看 chrome://version,300 台,光排队就能把我这个月的网费吃干净。
接了个小外包:给卡帕多奇亚一家民宿做预订落地页,甲方要求首页放一张能看热气球起飞点的地图,最好还能点。听起来简单,结果第一版上线当晚就被说「打开像PPT翻页,一卡一卡的」。
卡帕多奇亚的民宿老板想要个预订页,能拖动地图看位置,这个需求很合理。我接了这个外包单,用 Leaflet + OpenStreetMap 瓦片,本地开发时地图加载很快,拖动也流畅。但部署到线上后,用手机 4G 打开,瓦片加载慢得像挤牙膏,整张地图空白了三四秒,用户早滑走了。
外包接了个小活,客户要一个给自家后台调用的地址查询接口,数据量不大,全国区县约 2900 条,压成 JSON 不到 400KB。我图省事,直接扔到 Cloud Run 上,用的是 Node 20 运行时,最小实例数一开始是 0,内存 256MB,并发用默认的 80。上线第二天客户说早上第一次打开要等三四秒,后面就快了。啊这,典型冷启动。
上周接了个小单:客户要在他那台 2019 款 MacBook(macOS 13.6)的 Chrome 118 里,把一份 1.2 万行的订单表格导出成 CSV。现象挺明确:点导出后白屏三秒,然后弹「导出失败」,控制台里飘一条 `net::ERR_CONNECTION_RESET`。客户说「换浏览器就好了」,可我偏偏只能在他这台老机上复现。
去年底接了个小外包,伊斯坦布尔一个做卡帕多奇亚洞穴民宿的老板,要一个能看房型、能看热气球日出照片的预订落地页。条件很朴素:客户在格雷梅,网是村里的 ADSL,游客一半用手机在机场里刷。我本地是 M1 加千兆,跑起来顺得像假的一样,上线第二天老板发来语音,说图片「一片一片地爬出来」。