服务热线
四月那场户外用品展的第二天下午,一位德国采购站在展位的样品沙发旁边,用他自己的手机扫了台卡上的二维码。同行的业务员后来复述当时的场面:屏幕白着,那位客户没说话,抬头看了看展板上的产品图,又低头看屏幕,大概过了十几秒才出现第一张图。业务员当场解释说是展馆的网络问题,回公司拿办公室的宽带一测,首页两秒多就出来了,这件事差点就这么过去了。
这家企业做户外休闲家具出口,藤编桌椅、遮阳伞、户外沙发三条线,官网是中英双语,全站三百四十多个页面,日均访问四百出头,其中境外访问占到六成八。展会回来第三周,业务部报了一个数:那次展会现场扫码留下的询盘只有两条,而上一年同一场展会是十一条。这才有人开始认真怀疑,客户看到的页面和自己电脑上看到的不是同一个页面。
最开始的提议是把可疑的脚本先注释掉几个试试。这个提议被否了,理由很实在:注释掉之后如果变快了,也说不清是哪一个的功劳;如果没变快,还得一个个装回去,来回折腾两周。
实际做法是先量。页面加载完成八秒之后,用浏览器自带的资源计时接口,把当前页面所有非本站域名的请求逐条取出来,记下域名、耗时、传输体积三项,打包成一个请求发回自己服务器上新写的一个接口。这个接口是自建的,没有再引第三方——如果用现成的监控服务,等于为了量第三方脚本又加了一个第三方脚本。服务端记录的时候顺带存下访客的国家代码和浏览器语言,这两项是后面所有结论的分组依据。
采集了十一天,三千八百多次有效访问,其中境外两千五百多次。数据一按地区拆开,两边呈现出几乎对称的两种病:国内访客总加载时间的中位数是 2.9 秒,境外访客的中位数是 12.4 秒,四分之一的境外访问超过 19 秒。而卡住它们的根本不是同一个东西。
境外那 12.4 秒里,在线客服脚本一家就占了中位 4.1 秒——那个脚本本身 210KB 不算致命,致命的是它加载完还要和国内的服务器建一条长连接,握手在跨境链路上经常要重试。反过来,国内访客的 2.9 秒里有 3.3 秒花在境外的分析脚本和广告像素上(并行,所以总时长没有简单相加),其中 2.6 秒是连接根本建不起来、等到超时才放弃。两边各自都在等一个对方那边的东西。
还有一项两边都在白等:一个 2019 年改版时加进去的社交分享组件,它的域名早已停止解析,浏览器每次都要等 DNS 查询失败,稳定消耗五秒上下。这段代码没有任何人在用,也没有任何人记得它的存在,它就写在网页制作阶段留下的那份公共页尾模板里,跟着每一个页面一起发出去。
量完之后没有直接动手删,而是拉了一张三列的表:这个脚本是谁装的、它现在支撑着哪份报表或者哪个流程、如果今天停掉谁会在一周之内发现。第三列是关键,前两列可以靠翻记录和问人补全,第三列必须有一个具体的人名,写不出人名的就归到无主那一类。
九个脚本最后的归属是这样的:两套国内统计代码,其中一套的账号还在市场部手里,每月出访问量报表;另一套是上一任服务商装的,后台账号早就联系不上,报表也没人看。在线客服脚本归属销售部,客服主管的月度考核里有一项就是会话量。境外分析脚本和广告像素归属市场部的投放同事,投放的转化归因全靠它。地图脚本是给联系我们那一页用的。微信的分享接口是给国内客户扫码转发用的。图标字体的第三方地址没有业务归属,技术这边自己认下了。剩下那个停服的分享组件,问了一圈,从当年参与网页制作的人到现在的市场部,没有一个人认领。
这张表填完,事情的性质就变了。九个脚本里技术上能删的有九个,组织上能直接删的只有两个。剩下七个每一个背后都站着一个部门和一项考核指标,谈的不再是加载时间,而是谁的数据要断、谁的报表要重做。
停服的分享组件和那套没人看报表的统计代码,先在测试环境撤掉跑了一轮回归,确认留言表单、产品筛选、语言切换三处没受影响,然后线上撤。撤掉的当天,境外访客的加载中位数从 12.4 秒降到 7.5 秒,国内从 2.9 秒降到 2.4 秒。整整十四天,没有任何人来问某个功能不见了。
这一步只花了两小时,收益却占了整轮改造的一半。它值得记下来的地方不在技术,在于它揭示了一个规律:老站上耗时最高的第三方请求,往往正是那个已经没人在用的——正因为没人用,它坏了、停服了、变慢了,都不会有人反馈,于是它可以在页尾安安静静地躺三年。
剩下七个有主的脚本,处理方式不是删,是按访客分开输出。服务端在渲染页尾模板的时候读两个条件:访客 IP 归属地和浏览器首选语言,然后决定这一次要吐出哪几段脚本。
境外访客拿到的页面里,不再有在线客服脚本、微信分享接口和国内统计代码,客服入口换成一个纯静态的按钮组:一个邮件链接,一个 WhatsApp 链接,两个都是普通的超链接,零请求零脚本。国内访客拿到的页面里,不再有境外分析脚本和广告像素。地图脚本从公共页尾挪进联系我们那一页的模板,只有那一页会加载它。图标字体从第三方地址改成本地托管,顺手把用到的十几个图标做了子集。
改动本身在网页制作里属于小工程:一个判断分支、两套页尾片段、一个采集接口,加起来三个人天。真正麻烦的是这套判断要在缓存层前面生效——如果整页缓存不把地区和语言算进缓存键,国内访客有可能拿到给境外访客准备的那份页面,客服窗口就凭空消失了。这一处漏了会以最难排查的方式出现:只有部分人遇到,且刷新一下可能就好了。
做完之后,境外访客的加载中位数落到 3.6 秒,国内落到 2.1 秒。第三方请求数从九个变成境外三个、国内五个。
上线第十三天,市场部的投放同事发来截图问是不是数据出错了:境外分析后台的周会话数从三百多跳到九百多,转化事件也同步涨了。
不是涨了,是以前记漏了。原先境外分析脚本对境外访客其实是能正常加载的,但页面整体太慢,大量访客在脚本上报之前就已经离开,于是过去两年的境外数据一直是残缺的,且残缺的比例还随着页面变慢在扩大。改完之后上报正常了,历史同比彻底不能比。
处理办法只能是打补丁:在报表里标注变更日期,把改动前的境外数据标为不可比,重新以改动后的四周为新基线。这件事本身没有技术难度,但它花掉的解释成本比写代码高得多,因为投放同事的季度汇报里已经用过那些旧数字。
另一处返工在第九天。地区判断一开始只看 IP,结果把中国香港和新加坡的几位华语老客户判成了境外访客,他们打开页面找不到熟悉的在线客服窗口,两位直接写邮件来问。改法是把浏览器语言提到 IP 前面:只要首选语言是中文,一律输出在线客服,不管 IP 落在哪里。这条规则后来又救了一次——有位常驻国外的国内业务员用自己手机查产品页,同样需要那个窗口。
中途有过一个更省事的方案:不做地区分流,所有访客一视同仁,把在线客服改成点击才加载——页面上先放一个纯图片的假窗口,访客点了才去请求真正的脚本。这个做法在前端圈子里很常见,能把 210KB 和那条长连接全部推迟到点击之后。
灰度范围定在国内流量的一半,跑了两周。结果是会话发起率从 3.1% 掉到 1.9%,接近少了四成。原因不复杂:原先脚本自动加载时会在八秒后弹出一句招呼语,相当一部分国内访客是被那句话勾出来的;换成静态假窗口之后,招呼语没了,愿意主动点开的人少了一大截。折算下来国内每周少六到七通有效咨询,而它换回来的是国内访客 0.4 秒——国内本来就不卡在这里。
所以这个方案只在境外那一侧被采纳(境外索性连假窗口都不放,直接换成邮件和 WhatsApp 链接),国内保持原样自动加载。同一段代码在两种流量上的性价比可以完全相反,这一点不灰度是算不出来的。
第一组,境外访客三秒内可交互的访问占比从 14% 升到 61%,境外页面的平均浏览深度从 1.6 页升到 2.9 页。
第二组,在线客服的周会话数从 26 降到 17。这是实打实变差的一项,客服主管的考核表上正好有这一栏,为此专门开了一次会。降的原因很清楚:境外访客再也看不到那个窗口了。
第三组,邮件和 WhatsApp 渠道进来的询盘从周均 9 条升到 21 条,且其中境外来源占了大半。把第二组和第三组放在一起看才成立——原先那 26 通会话里有相当一部分是境外客户点开窗口、发现要等接线、然后关掉,既没转化也占着客服的在线时长。
成本分两笔。能写进报价单的那笔是三个人天的开发,外加半天回归测试。写不进报价单的那笔更贵:市场部重对报表口径、和客服主管谈考核项、给投放同事的历史数据做标注,前后开了四次会,跨度三周。做网页制作这行久了会发现,凡是动到第三方脚本的活儿,报价单上的工时几乎从来不是成本的大头。
改造范围最后画了一条线:后台管理页和内部资料下载页保持原样,九个脚本里该有的照旧留着。理由是这两个页面只有二十多名员工访问,全部在国内,网络条件稳定;而资料下载量的统计恰恰依赖那套留下来的统计代码,改了要重新对接。收益接近零,风险不是零,那就不动。
如果只留两条可以带走的判断:第一条,第三方脚本的耗时账必须按访客分组算,全站一个平均值会把两种相反的病症互相抵消掉,看上去哪一项都不算太糟;第二条,动手之前先做那张三列的确权表,写不出人名的先撤,写得出人名的谈条件——绝大多数删不掉的脚本卡在部门和考核上,不在代码上。这两件事都可以在下一次网页制作的需求评审上提前做,成本比上线三年后再回头翻页尾模板低得多。
顺带一提那位德国采购。改完之后销售在视频通话里请他重试了一次,从按下回车开始数数,前后数了三遍,最长的一遍数到四。改造之前同样的做法他数到过十四。这个数字没法写进任何一份报告,但比后台里所有折线图都更接近客户真正经历的那几秒。
地址:江苏天圣达科技创新中心B栋901
电话:133 0619 4366 / 189-2129-2689
邮箱:sales@jizankeji.com

