同一條連結裡明明有 utm_source,產生出來會變兩個嗎
開測前最好奇的是:原鏈寫 UTM_SOURCE=a 全大寫,表單 source 填 b,產物裡是兩組 utm_source 並存還是一組。第二個疑問來自面板:五個格子都填滿了,「參數條數」那一欄卻給了 6。跑完一輪純 Node 才確認,這是兩套帳:前者是認領環節摺了大小寫,後者是那五個數各用一把尺。
被測的是UTM 連結產生器這一頁,模板實測 30156 位元組、正文 620 行。UB 狀態物件直接構造,DOM 只走到 ubEl 返回 null 為止,渲染後的表格行數、按鈕態、複製回饋一律標未實測;下面的數字全是字串層實測,長度口徑是 UTF-16 碼元。
摺疊發生在認領那一步
ubAssemble(L277-320)拿原鏈拆出的每一對鍵值去撞表單要寫入的條目,撞的條件是兩邊都先轉小寫再比。實測原鏈 UTM_SOURCE=a 配 source 填 b,產物 query 只剩 utm_source=b,res 裡等號 1 個——鍵名按 UB_FIELDS 的規範小寫輸出,大寫那枚沒被留下,也不存在並存的兩組。更擠的樣本是同一條鏈放兩枚只差大小寫的同鍵:UTM_source=old 與 utm_source=older,第一條被認領判覆蓋原值,第二條走已清除,表格三行依次是覆蓋原值、已清除、覆蓋原值。
六個狀態,兩套計數
每個參數最後只落六種 st 之一。第六種是表單值撞上一枚已用過的小寫鍵:source 填 b 再掛一條自定義 utm_source=x,第二次判「重複已忽略」,產物只有一份 utm_source。
| 狀態 | 觸發條件 |
|---|---|
| 覆蓋原值 | 原鏈鍵摺小寫命中表單值,且它還沒被用過 |
| 已清除 | 原鏈是 utm、保留沒勾、又沒被認領 |
| 沿用原值 | 非 utm 鍵,或勾了保留卻沒被認領的 utm |
| 新增/新增自定義 | 表單值沒被置位,小寫鍵也沒被用過 |
| 重複已忽略 | 表單值沒置位,但那枚小寫鍵已用過 |
檢查區的兩個計數與狀態並不相通:dropped 只數「已清除」的行,kept 只數「沿用原值」且命中 /^utm_/i 的行,沿用的非 utm 行兩邊都不進。
keep 開關只改舊值的去向
取一條自帶三枚 utm 的原鏈,表單只填 source:不勾保留時 query 14 碼元、cnt 1、dropped 2,另兩行判已清除;勾上保留時 query 48 碼元、cnt 3、kept 2,同樣那兩行改判沿用原值。兩邊表格行數恆 3,差的只是最終串。
圖 1:keep 兩檔下三枚參數的落點與差分。
五欄各用一把尺
面板五欄依次是整條 url、base、query 的碼元數,query 按 & 切開的段數(空 query 給 0),以及表格行裡命中 /^utm_/i 的行數,含被清除的行。
分歧樣本:原鏈帶 3 枚舊 utm 外加一枚非 utm 的 id=7,表單填滿 5 格,不勾保留。實測 total 97、base 25、query 71、cnt 6、utm 5。按「拼了五個 utm」的直覺期望 5,cnt 卻給 6,多出的一段正是被沿用的 id;把 id 摘掉的另一組裡 base 25 加問號加 query 67 得 93,與 total 逐條相等。
圖 2:五欄各自的尺,與 cnt 和 utm 的分歧點。
值留空走的是兩條路
自定義值留空時,產物是 ?gdt_vid 這種帶鍵不帶等號的標記位;標準五格裡填空格卻被整格跳過——source 填三個空格時 query 只剩 utm_medium=email,連結 42 字元。
解碼先換加號
ubDecode(L238-241)先把加號整體換成空格,再交給 decodeURIComponent,拋 URIError 就原樣回顯。實測 %2B 解成一枚加號、單獨的 + 解成空格、%ZZ 原樣回顯成 3 碼元、%E4%B8AD 因第三段是裸 AD 回顯成 8 碼元,而寫法正確的 %E4%B8%AD 解回一枚中文。同一段 %xx 串的正反兩向,URL 編解碼那一頁單獨處理。
兩道硬上限不在同一個函數裡
UB_MAX_CUSTOM 實測 8,落點兩處:新增自定義在長度已到 8 時先給提示再退回,custom 維持 8 條;拆解鏈上參數超過 8 時走截斷——10 枚非 utm 加一枚 utm_term 的樣本得 other 10、dropped 2、custom 留到 8。UB_MAX_VARIANTS 實測 30,在 ubVarLines(L434-445)裡先去重再判長:31 行唯一值得 lines 30、over 1,40 行時 over 10,產物恆取前 30 條。去重大小寫敏感,Banner 與 banner 算兩條;真·空行既不記重複也不記空值,只有空格或製表符組成的行才計 blank。
預設的 label 與值是兩回事
UB_PRESETS 實測 18 條,label 與 source、medium 兩列互不相等:「微信公眾號」配 weixin 加 social,「百度自然」與「百度競價」同為 baidu,只差 organic 與 cpc。高亮判定依據要求 source 與 medium 同時相等,只改 baidu 不點亮。UB_MEDIUMS 實測 13 檔,只動 medium。這些名字在本頁只是字串事實。
文案與代碼差在三處
頁面配置裡本工具的 18 條說法逐條對實測行為判,結果 [一致] 15、[部分一致] 3、[衝突] 0:狀態標註只列了五種,代碼裡 st 有六種;campaign 留空給的是提示檔,medium 留空才是注意檔;付費渠道白名單文案列 5 檔,代碼正則實含 6 檔。那五個鍵各自的含義與大小寫為什麼把報表拆成兩行,站內舊文講過,不複述。
常見問題
Q:原鏈上的大寫鍵名會被保留嗎?
被認領的那條不會,它按表單側的規範小寫重拼,也不與新值並存;只有走沿用原值的行保留原樣。
Q:參數條數為什麼比 utm 條數多一?
參數條數按 & 切段,沿用的非 utm 參數也算一段;utm 條數只數表裡命中 utm_ 前綴的行,連被清除的行都算。
Q:變體超過 30 行是硬截斷還是只給提示?
先去重再截,產物只有前 30 條,尾註寫出被截掉的行數,40 行唯一值時 over 記 10。