站建設(shè)全流程:從需求拆解到性能驗(yàn)收的工程化方法)
做高端網(wǎng)站這件事我前后跟過(guò)十幾個(gè)項(xiàng)目從最初被客戶一句“要大氣”折騰三個(gè)月到后來(lái)能把“高端”拆成可驗(yàn)收的指標(biāo)中間踩的坑基本都踩過(guò)一遍。高端網(wǎng)站的創(chuàng)建流程說(shuō)到底不是審美問(wèn)題而是工程問(wèn)題它要求你在視覺(jué)秩序、內(nèi)容密度、性能指標(biāo)、可維護(hù)性四條線上同時(shí)達(dá)標(biāo)任何一條掉鏈子用戶嘴上說(shuō)不出哪里不對(duì)身體會(huì)很誠(chéng)實(shí)地關(guān)掉頁(yè)面。這篇內(nèi)容我按真實(shí)項(xiàng)目的推進(jìn)順序從立項(xiàng)到上線后三個(gè)月把每一步的目的、參數(shù)、坑點(diǎn)攤開(kāi)講適合正在接企業(yè)官網(wǎng)、品牌站、產(chǎn)品展示站的前端和設(shè)計(jì)同學(xué)參考也適合甲方市場(chǎng)負(fù)責(zé)人用來(lái)對(duì)齊驗(yàn)收標(biāo)準(zhǔn)——你不需要懂代碼但你需要知道錢花在哪。1. 先把“高端”翻譯成可驗(yàn)收的語(yǔ)言1.1 三個(gè)最常見(jiàn)的誤解先拆掉第一個(gè)誤解是“高端等于炫”。滾動(dòng)視差、粒子背景、鼠標(biāo)跟隨光斑、進(jìn)場(chǎng)動(dòng)畫全套拉滿做完之后首屏加載五秒手機(jī)上直接卡成幻燈片。我在一個(gè)品牌站項(xiàng)目里見(jiàn)過(guò)最極端的版本首屏塞了二十七張高清圖做輪播每張 3MB未壓縮。這種站點(diǎn)的第一印象確實(shí)“震撼”但用戶是來(lái)查產(chǎn)品參數(shù)和聯(lián)系方式的兩秒鐘找不到入口就走。高端的反面不是樸素是廉價(jià)感而廉價(jià)感往往來(lái)自“用力過(guò)猛”。第二個(gè)誤解是“高端等于貴”。預(yù)算充足當(dāng)然好但決定觀感的常常是那些不花錢的細(xì)節(jié)行高是不是 1.6 到 1.75 之間、段落寬度是不是控制在 60 到 75 個(gè)字符、圖標(biāo)線條粗細(xì)是否統(tǒng)一、按鈕圓角是否全站一致。這些屬于設(shè)計(jì)規(guī)范層面的東西靠的是紀(jì)律不是預(yù)算。第三個(gè)誤解是“高端等于復(fù)雜技術(shù)”。我見(jiàn)過(guò)用最樸素的靜態(tài)生成方案做出來(lái)的站點(diǎn)LCP 穩(wěn)定在 1.2 秒全站無(wú)阻塞腳本客戶續(xù)約三年也見(jiàn)過(guò)堆了一整套重型方案結(jié)果每次改文案都要發(fā)版、構(gòu)建排隊(duì)二十分鐘的站。技術(shù)選擇的判斷標(biāo)準(zhǔn)只有一條它是否讓“改內(nèi)容”和“改樣式”這兩件事變得更便宜。提示如果甲方只會(huì)說(shuō)“要大氣”你就把這句話翻譯成三個(gè)問(wèn)題——你希望訪客第一眼記住什么你希望他第二件事做什么你希望他離開(kāi)時(shí)帶走什么信息答案往往就是首屏主視覺(jué)、主行動(dòng)按鈕、核心賣點(diǎn)文案剩下的都是配角。1.2 高端網(wǎng)站的四個(gè)可量化維度我把“高端感”拆成四組可以打分的東西項(xiàng)目啟動(dòng)會(huì)上就拿這張表跟客戶對(duì)齊避免后期扯皮維度具體指標(biāo)參考閾值誰(shuí)來(lái)負(fù)責(zé)視覺(jué)秩序柵格列數(shù)統(tǒng)一、字號(hào)層級(jí)不超過(guò) 6 級(jí)、間距取自固定刻度間距刻度 4/8px 基準(zhǔn)設(shè)計(jì)內(nèi)容密度首屏信息層級(jí) ≤ 3 層、單段字?jǐn)?shù) ≤ 120 字移動(dòng)端段落 ≤ 5 行內(nèi)容策劃性能表現(xiàn)LCP、CLS、INP 三項(xiàng)核心指標(biāo)LCP2.5s、CLS0.1、INP200ms前端可維護(hù)性新增一個(gè)頁(yè)面所需工時(shí)、改一處文案所需步驟新頁(yè)面 ≤ 4 小時(shí)、改文案 ≤ 5 分鐘前端 運(yùn)營(yíng)這張表的用處在于它讓“高端”從形容詞變成了驗(yàn)收條款。項(xiàng)目驗(yàn)收時(shí)逐項(xiàng)對(duì)照誰(shuí)也別拍腦袋說(shuō)“我覺(jué)得不夠高端”。特別是最后一行“可維護(hù)性”很多人忽略它但一個(gè)站點(diǎn)上線后 80% 的成本發(fā)生在上線之后——改個(gè)電話號(hào)碼要?jiǎng)哟a、加個(gè)新聞頁(yè)要新建三個(gè)文件這種站點(diǎn)再好看也撐不過(guò)兩年。2. 立項(xiàng)階段需求梳理決定后面 70% 的返工量2.1 用三張表把模糊需求釘死很多項(xiàng)目爛尾不是因?yàn)樽龅貌钍且驗(yàn)橐婚_(kāi)始就沒(méi)說(shuō)清楚做什么。我現(xiàn)在的習(xí)慣是開(kāi)工前必須產(chǎn)出三張表缺一張就不進(jìn)入設(shè)計(jì)。第一張是目標(biāo)表只填三行站點(diǎn)存在的商業(yè)目的獲客、招商、招聘、品牌背書、核心轉(zhuǎn)化動(dòng)作提交表單、撥打電話、下載資料、加聯(lián)系方式、成功判定標(biāo)準(zhǔn)表單月提交量、平均停留時(shí)長(zhǎng)、跳出率。這張表的價(jià)值是砍需求——后續(xù)所有“要不要加這個(gè)模塊”的爭(zhēng)論都回到這張表上問(wèn)一句它對(duì)核心轉(zhuǎn)化動(dòng)作有幫助嗎沒(méi)有就砍。第二張是角色表列出三類訪客首次到訪的陌生訪客、帶著明確目的的比價(jià)訪客、老客戶回來(lái)找資料。同一套導(dǎo)航要同時(shí)服務(wù)三類人是不現(xiàn)實(shí)的所以要做取舍首屏給陌生訪客講清“你是誰(shuí)、你解決什么問(wèn)題”二級(jí)頁(yè)面給比價(jià)訪客放參數(shù)對(duì)比和案例頁(yè)腳和頂部工具區(qū)給老客戶留快速入口。第三張是內(nèi)容清單表逐頁(yè)列出頁(yè)面標(biāo)題、需要哪些圖文素材、素材由誰(shuí)提供、截止日期、當(dāng)前狀態(tài)。這張表是項(xiàng)目延期的頭號(hào)殺手——設(shè)計(jì)稿做完了素材還沒(méi)到位前端只能拿占位圖排版等真素材來(lái)了全部重排。經(jīng)驗(yàn)值是素材交付節(jié)點(diǎn)必須比開(kāi)發(fā)開(kāi)始早兩周且明確寫進(jìn)合同。注意內(nèi)容清單表里一定要設(shè)一欄“是否必須由甲方提供”。凡是標(biāo)了“必須”但遲遲不給的寧可先砍掉這個(gè)模塊也不要用占位圖硬撐最后交付時(shí)那堆占位圖會(huì)變成你最尷尬的交付物。2.2 預(yù)算和工期的現(xiàn)實(shí)分配比例一個(gè)中等規(guī)模品牌站8 到 15 個(gè)頁(yè)面含一套簡(jiǎn)單內(nèi)容管理后臺(tái)我通常按這個(gè)比例分配工作量和預(yù)算策略與內(nèi)容梳理10% 到 15%。包括目標(biāo)表、信息架構(gòu)、文案框架。很多團(tuán)隊(duì)直接跳過(guò)結(jié)果后面反復(fù)改結(jié)構(gòu)。視覺(jué)設(shè)計(jì)20% 到 25%。含首頁(yè)、列表頁(yè)、詳情頁(yè)、通用組件庫(kù)、移動(dòng)端適配。前端開(kāi)發(fā)35% 到 40%。這是最大頭因?yàn)轫憫?yīng)式、動(dòng)效、無(wú)障礙、性能優(yōu)化都?jí)涸谶@兒。后端與第三方集成15% 到 20%。內(nèi)容管理、表單、郵件通知、地圖、統(tǒng)計(jì)埋點(diǎn)。測(cè)試與上線運(yùn)維5% 到 10%??鐬g覽器、真機(jī)、可訪問(wèn)性、性能復(fù)測(cè)。工期倒排時(shí)有個(gè)經(jīng)驗(yàn)設(shè)計(jì)階段和前端開(kāi)發(fā)階段必須重疊三分之一。設(shè)計(jì)做完首頁(yè)和通用組件后前端就可以開(kāi)工不必等全部設(shè)計(jì)稿交付。否則前端會(huì)在最后兩周被壓縮成“照著圖堆代碼”性能優(yōu)化和無(wú)障礙全被犧牲上線后返工成本更高。3. 視覺(jué)體系高端感是被“約束”出來(lái)的3.1 網(wǎng)格、間距、字級(jí)的三件套高端站點(diǎn)的視覺(jué)舒服八成來(lái)自三件事做對(duì)了網(wǎng)格、間距刻度、字號(hào)層級(jí)。這三樣都不需要天賦需要的是紀(jì)律。網(wǎng)格我一般用 12 列容器最大寬度 1200 到 1280 像素兩側(cè)留白隨視口變化斷點(diǎn)定在 480、768、1024、1280 四檔。為什么是 12 列因?yàn)?12 能被 2、3、4、6 整除做兩欄、三欄、四欄、六欄卡片都能整除對(duì)齊不會(huì)出現(xiàn)半像素縫隙。8 列或者 10 列在遇到三欄布局時(shí)就會(huì)很別扭。間距全部取自一個(gè)刻度表我常用 4 的倍數(shù)4、8、12、16、24、32、48、64、96、128。組件內(nèi)部用小刻度區(qū)塊之間用大刻度。禁止出現(xiàn) 13px、27px 這種隨手寫的數(shù)值一旦出現(xiàn)說(shuō)明設(shè)計(jì)已經(jīng)開(kāi)始失控了。字號(hào)層級(jí)控制在 5 到 6 級(jí)用固定比例生成。移動(dòng)端正文 16px 起步桌面端 16 到 18px比例系數(shù)取 1.25 或 1.333。以 16px 為基準(zhǔn)、1.25 比例算下來(lái)就是 16、20、25、31、39、49。這套數(shù)字直接寫進(jìn) CSS 變量全站只引用變量不寫死數(shù)字:root { /* 字號(hào)刻度基于 16px 與 1.25 比例 */ --fs-body: 1rem; /* 16px */ --fs-sm: 0.875rem; /* 14px */ --fs-lg: 1.25rem; /* 20px */ --fs-h3: 1.5625rem; /* 25px */ --fs-h2: 1.9375rem; /* 31px */ --fs-h1: 2.4375rem; /* 39px */ /* 間距刻度4 的倍數(shù) */ --sp-1: 0.25rem; --sp-2: 0.5rem; --sp-3: 0.75rem; --sp-4: 1rem; --sp-6: 1.5rem; --sp-8: 2rem; --sp-12: 3rem; --sp-16: 4rem; /* 行高與段落寬度 */ --lh-tight: 1.25; --lh-body: 1.7; --measure: 68ch; }--measure: 68ch這一行值得單獨(dú)說(shuō)。段落最大寬度控制在 60 到 75 個(gè)字符之間超過(guò)之后人眼換行時(shí)容易串行閱讀疲勞感直線上升。這是排版學(xué)里的老結(jié)論但我在大量站點(diǎn)上看到正文鋪滿 1400 像素寬一行的字能繞地球半圈。3.2 色彩與動(dòng)效克制比豐富更貴色彩的常見(jiàn)做法是主色 1 個(gè)、輔助色 2 個(gè)、中性灰階 8 到 10 級(jí)?;译A必須自己定不要直接用純黑#000和純白#fff純黑在屏幕上對(duì)比過(guò)硬長(zhǎng)時(shí)間閱讀刺眼純白背景配純黑文字會(huì)有輕微的光暈感。我的習(xí)慣是正文色用#1a1a1a到#232323背景用#ffffff或#fafafa邊框用#e5e5e5這一檔。對(duì)比度必須過(guò) WCAG AA 標(biāo)準(zhǔn)正文文字與背景對(duì)比度不低于 4.5:1大號(hào)文字18px 加粗或 24px 常規(guī)不低于 3:1。這個(gè)不是形式主義而是實(shí)打?qū)嵱绊懣勺x性。有個(gè)免費(fèi)的辦法把設(shè)計(jì)稿截圖丟進(jìn)任意對(duì)比度檢測(cè)工具輸入前景色和背景色幾秒鐘出結(jié)果。我見(jiàn)過(guò)太多“淺灰字配淺灰底”的高級(jí)感設(shè)計(jì)年輕人看著還行四十歲以上的用戶基本讀不動(dòng)而這個(gè)年齡段恰恰是很多 B 端站點(diǎn)的決策者。動(dòng)效的鐵律是只做“解釋空間關(guān)系”和“反饋操作結(jié)果”兩類不做裝飾。時(shí)長(zhǎng)控制在 150 到 400 毫秒進(jìn)場(chǎng)用ease-out出場(chǎng)用ease-in頁(yè)面切換不超過(guò) 300 毫秒。位移距離不要超過(guò) 24 像素透明度從 0 到 1 配合輕微上移是最穩(wěn)妥的組合。同時(shí)必須加媒體查詢尊重系統(tǒng)的“減少動(dòng)態(tài)效果”偏好.card { opacity: 0; transform: translateY(16px); transition: opacity 320ms ease-out, transform 320ms ease-out; } .card.is-visible { opacity: 1; transform: translateY(0); } media (prefers-reduced-motion: reduce) { .card { opacity: 1; transform: none; transition: none; } }這段代碼里prefers-reduced-motion那一塊經(jīng)常被漏掉。它是無(wú)障礙的基本要求也直接關(guān)系到一部分用戶的生理舒適度——強(qiáng)烈的視差和縮放動(dòng)畫會(huì)讓部分人群產(chǎn)生眩暈。做高端站點(diǎn)這類細(xì)節(jié)比多加一個(gè)炫酷特效更能體現(xiàn)專業(yè)度。4. 技術(shù)選型選的是“改起來(lái)便宜”的方案4.1 三類站點(diǎn)對(duì)應(yīng)三種技術(shù)路線技術(shù)選型不是選最時(shí)髦的是選最匹配內(nèi)容更新頻率的。我按內(nèi)容更新強(qiáng)度分三類第一類內(nèi)容基本固定的品牌展示站一年改幾次文案和圖片。這類站點(diǎn)用靜態(tài)生成方案最合適構(gòu)建時(shí)把頁(yè)面編譯成純 HTML部署到帶全球節(jié)點(diǎn)的靜態(tài)托管服務(wù)改內(nèi)容靠改數(shù)據(jù)文件后重新構(gòu)建。優(yōu)勢(shì)是沒(méi)有服務(wù)端渲染開(kāi)銷、沒(méi)有數(shù)據(jù)庫(kù)、被攻擊面極小首屏 HTML 直出LCP 通常能壓在 1.5 秒以內(nèi)。缺點(diǎn)是運(yùn)營(yíng)不能自助改內(nèi)容每次改動(dòng)要走一次構(gòu)建。第二類內(nèi)容頻繁更新的站點(diǎn)比如每周發(fā)新聞、每月上新產(chǎn)品。這類要上內(nèi)容管理后臺(tái)前端用靜態(tài)生成加增量構(gòu)建或者服務(wù)端渲染。關(guān)鍵是給運(yùn)營(yíng)一套所見(jiàn)即所得的編輯界面讓他們不碰代碼就能發(fā)內(nèi)容。這里有個(gè)取舍后臺(tái)越靈活前端組件約束越難做最后容易出現(xiàn)“運(yùn)營(yíng)把標(biāo)題設(shè)成 60 號(hào)字紅色加粗”的災(zāi)難。解決辦法是把可編輯字段做窄——標(biāo)題只能選三種預(yù)設(shè)樣式圖片只能按固定比例裁切。第三類帶交互功能的站點(diǎn)比如在線報(bào)價(jià)、會(huì)員中心、資料下載權(quán)限。這類必須有服務(wù)端邏輯選什么框架反而次要重點(diǎn)是把認(rèn)證、表單校驗(yàn)、限流、日志這四件事做扎實(shí)。不管哪一類有幾條通用的基建要求全站 HTTPS啟用 HTTP/2 或 HTTP/3 以支持多路復(fù)用靜態(tài)資源走 CDN 并設(shè)置長(zhǎng)緩存加文件名哈希HTML 文檔本身設(shè)置短緩存或協(xié)商緩存。這些屬于基礎(chǔ)配置跟預(yù)算無(wú)關(guān)但直接影響首屏速度。4.2 性能預(yù)算要算出來(lái)不能拍出來(lái)“性能要好”是句空話得定數(shù)字。我的做法是先定首屏加載的硬預(yù)算再倒推各類資源的體積上限。假設(shè)目標(biāo)用戶在 4G 網(wǎng)絡(luò)下訪問(wèn)實(shí)測(cè)下行速率取 8Mbps 左右約 1MB/s服務(wù)器首字節(jié)時(shí)間按 300ms 算那么 2.5 秒的 LCP 目標(biāo)里留給資源下載的時(shí)間大約是 1.5 到 1.8 秒。換算成體積首屏關(guān)鍵資源總量控制在 1.5MB 以內(nèi)比較穩(wěn)妥其中資源類型體積上限說(shuō)明HTML 文檔60KB壓縮后首屏內(nèi)容直出避免額外請(qǐng)求關(guān)鍵 CSS50KB壓縮后內(nèi)聯(lián)首屏樣式其余異步加載首屏 JS170KB壓縮后超出這個(gè)量中低端手機(jī)解析明顯變慢字體文件100KB只保留實(shí)際用到的字符子集格式優(yōu)先新格式首屏圖片300KB用現(xiàn)代格式加響應(yīng)式尺寸不要一張圖打天下字體這一項(xiàng)特別容易超。一套中文字體動(dòng)輒 5MB 到 10MB直接拖垮首屏。解決辦法是子集化統(tǒng)計(jì)頁(yè)面上實(shí)際出現(xiàn)的字符把字體裁剪到幾 KB 到幾十 KB。如果頁(yè)面文案會(huì)動(dòng)態(tài)變化就做多套子集按需加載或者干脆中文用系統(tǒng)字體棧西文和數(shù)字用定制字體——中文系統(tǒng)字體在主流設(shè)備上的觀感已經(jīng)足夠好沒(méi)必要為了一點(diǎn)字形差異付出幾 MB 的代價(jià)。/* 中英文混排的字體棧優(yōu)先系統(tǒng)字體避免大體積中文文件 */ body { font-family: -apple-system, BlinkMacSystemFont, Segoe UI, PingFang SC, Hiragino Sans GB, Microsoft YaHei, sans-serif; } /* 只有西文和數(shù)字用定制字體并做子集化 */ font-face { font-family: BrandSans; src: url(/fonts/brand-latin-subset.woff2) format(woff2); font-display: swap; unicode-range: U0000-00FF; }unicode-range這一行是關(guān)鍵它告訴瀏覽器這份字體只負(fù)責(zé)基本拉丁字符中文自動(dòng)落到系統(tǒng)字體。font-display: swap保證字體加載期間先用后備字體渲染文字不會(huì)出現(xiàn)一片空白。5. 開(kāi)發(fā)落地把設(shè)計(jì)規(guī)范變成不可繞過(guò)的約束5.1 設(shè)計(jì)令牌先落地組件庫(kù)隨后設(shè)計(jì)稿轉(zhuǎn)代碼最容易失控的地方是每個(gè)人按自己的理解寫樣式。三個(gè)月后全站出現(xiàn)七種藍(lán)色、五種圓角、三套按鈕尺寸。根治辦法是先建令牌層顏色、字號(hào)、間距、圓角、陰影、動(dòng)效時(shí)長(zhǎng)全部變量化再建原子組件層按鈕、輸入框、卡片、標(biāo)簽、導(dǎo)航項(xiàng)頁(yè)面層只允許組合組件不允許寫新樣式。:root { --color-primary: #1f4bd8; --color-primary-hover: #1a3fb8; --color-text: #1a1a1a; --color-text-muted: #5c5c5c; --color-border: #e5e5e5; --color-bg: #ffffff; --radius-sm: 4px; --radius-md: 8px; --radius-lg: 16px; --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.06); --shadow-md: 0 4px 16px rgba(0, 0, 0, 0.08); --shadow-lg: 0 12px 32px rgba(0, 0, 0, 0.10); } .btn { display: inline-flex; align-items: center; justify-content: center; min-height: 44px; /* 觸控目標(biāo)不小于 44px */ padding: 0 var(--sp-6); border-radius: var(--radius-md); font-size: var(--fs-body); line-height: var(--lh-tight); transition: background-color 200ms ease-out, box-shadow 200ms ease-out; } .btn--primary { background: var(--color-primary); color: #fff; } .btn--primary:hover { background: var(--color-primary-hover); box-shadow: var(--shadow-md); } .btn--primary:focus-visible { outline: 2px solid var(--color-primary); outline-offset: 2px; }注意min-height: 44px和:focus-visible這兩處。前者是觸控可用性的事實(shí)標(biāo)準(zhǔn)小于這個(gè)尺寸的按鈕在手機(jī)上誤觸率明顯上升后者保證鍵盤用戶能看見(jiàn)焦點(diǎn)在哪。很多“高端”站點(diǎn)把默認(rèn)焦點(diǎn)框用outline: none干掉了鍵盤用戶直接失去方向感——這是可訪問(wèn)性事故不是簡(jiǎn)潔。5.2 首屏、導(dǎo)航、表單三處的實(shí)現(xiàn)要點(diǎn)首屏的結(jié)構(gòu)順序直接決定 LCP。正確做法是HTML 里先寫標(biāo)題、副標(biāo)題、主按鈕的文字圖片放后面并用loadingeager加fetchpriorityhigh聲明它是關(guān)鍵資源非首屏圖片一律loadinglazy加固定寬高比避免布局抖動(dòng)。section classhero div classhero__content h1 classhero__title一句話說(shuō)清你能解決什么問(wèn)題/h1 p classhero__desc兩行以內(nèi)的補(bǔ)充說(shuō)明交代服務(wù)對(duì)象和交付結(jié)果。/p a classbtn btn--primary href#contact獲取方案/a /div picture classhero__media source srcset/img/hero.avif typeimage/avif source srcset/img/hero.webp typeimage/webp img src/img/hero.jpg width1200 height750 alt產(chǎn)品使用場(chǎng)景示意 fetchpriorityhigh decodingasync /picture /sectionwidth和height屬性別省瀏覽器靠它提前算出占位比例圖片加載完成后不會(huì)把下面的內(nèi)容頂下去CLS 能壓到 0.05 以內(nèi)。導(dǎo)航的難點(diǎn)在移動(dòng)端。漢堡菜單不是萬(wàn)能解深層級(jí)的導(dǎo)航塞進(jìn)抽屜后基本沒(méi)人點(diǎn)。我的做法是一級(jí)導(dǎo)航控制在 5 到 7 項(xiàng)移動(dòng)端把最重要的兩個(gè)入口聯(lián)系方式、核心產(chǎn)品提到頂部常駐其余收進(jìn)抽屜抽屜打開(kāi)時(shí)鎖定頁(yè)面滾動(dòng)并把焦點(diǎn)移進(jìn)去關(guān)閉時(shí)焦點(diǎn)還給觸發(fā)按鈕這條做了才算合格。表單是轉(zhuǎn)化率的命門。字段數(shù)量每多一個(gè)放棄率就往上走一截。除了絕對(duì)必要的三到五個(gè)字段其余全部砍掉用后續(xù)溝通補(bǔ)。校驗(yàn)要實(shí)時(shí)且溫和失焦時(shí)校驗(yàn)不要一邊輸入一邊報(bào)錯(cuò)錯(cuò)誤提示寫在字段下方而不是彈窗提交按鈕點(diǎn)擊后立即禁用并顯示“提交中”防止重復(fù)提交。const form document.querySelector(#contact-form); const submitBtn form.querySelector(button[typesubmit]); form.addEventListener(submit, async (event) { event.preventDefault(); if (submitBtn.disabled) return; submitBtn.disabled true; const originalText submitBtn.textContent; submitBtn.textContent 提交中…; try { const response await fetch(form.action, { method: POST, body: new FormData(form), headers: { Accept: application/json } }); if (!response.ok) throw new Error(提交失敗); form.reset(); document.querySelector(#form-success).hidden false; } catch (error) { document.querySelector(#form-error).hidden false; } finally { submitBtn.disabled false; submitBtn.textContent originalText; } });這段代碼里if (submitBtn.disabled) return是防重復(fù)提交的雙保險(xiǎn)配合按鈕禁用狀態(tài)使用。我在線上環(huán)境見(jiàn)過(guò)用戶瘋狂點(diǎn)擊導(dǎo)致同一條線索提交七次的情況后臺(tái)數(shù)據(jù)臟得沒(méi)法看。6. 內(nèi)容與搜索高端站點(diǎn)的“里子”6.1 信息架構(gòu)按三層做別按公司組織架構(gòu)做最常見(jiàn)的錯(cuò)誤是把導(dǎo)航按公司部門結(jié)構(gòu)來(lái)排關(guān)于我們、企業(yè)文化、發(fā)展歷程、資質(zhì)榮譽(yù)、新聞中心、聯(lián)系我們。這是給老板看的不是給訪客看的。訪客腦子里只有三個(gè)問(wèn)題你能干什么、你干得怎么樣、我怎么找你。正確的三層結(jié)構(gòu)是第一層按業(yè)務(wù)場(chǎng)景分比如按行業(yè)、按需求類型第二層按具體服務(wù)或產(chǎn)品分第三層是詳情頁(yè)加行動(dòng)入口。公司介紹、發(fā)展歷程這類內(nèi)容放二級(jí)頁(yè)面的側(cè)欄或頁(yè)腳不要占一級(jí)導(dǎo)航的位置。URL 結(jié)構(gòu)也要跟著這個(gè)邏輯走做到可讀、可推斷、層級(jí)不超過(guò)三層/行業(yè)方案/制造業(yè) /行業(yè)方案/制造業(yè)/產(chǎn)線質(zhì)檢 /products/型號(hào)-a /cases/某類場(chǎng)景案例 /contact避免?id123這種參數(shù)式 URL也別把日期塞進(jìn)路徑。URL 里用英文短橫線分詞全小寫不帶中文和空格。這套規(guī)則看著瑣碎但它是后續(xù)做站點(diǎn)地圖、內(nèi)鏈優(yōu)化、遷移重定向的基礎(chǔ)一開(kāi)始沒(méi)定好后期改起來(lái)要全站重定向風(fēng)險(xiǎn)極高。6.2 技術(shù)層面的搜索可見(jiàn)性清單內(nèi)容是里子技術(shù)配置是門檻。下面這些屬于上線前必須逐項(xiàng)打勾的每個(gè)頁(yè)面有且只有一個(gè)主標(biāo)題標(biāo)題文案包含核心詞但不堆砌。每頁(yè)有獨(dú)立的頁(yè)面描述長(zhǎng)度控制在 60 到 80 個(gè)漢字寫清對(duì)象和結(jié)果。生成全站站點(diǎn)地圖并在根目錄的規(guī)則文件里聲明位置。配置規(guī)范化鏈接避免帶與不帶末尾斜杠、帶與不帶參數(shù)產(chǎn)生重復(fù)頁(yè)面。結(jié)構(gòu)化數(shù)據(jù)按頁(yè)面類型補(bǔ)齊公司信息、產(chǎn)品信息、常見(jiàn)問(wèn)答、面包屑導(dǎo)航。圖片全部有描述性替代文本裝飾性圖片用空替代文本。站內(nèi)鏈接錨文本寫清楚指向什么不要全站都是“點(diǎn)擊這里”。404 頁(yè)面給出返回路徑和搜索入口不要只寫一句“頁(yè)面不存在”。提示站點(diǎn)上線后別急著提交收錄先用抓取測(cè)試工具模擬抓取一遍看看有沒(méi)有被規(guī)則文件誤擋的資源。我遇到過(guò)一次樣式目錄被整段屏蔽導(dǎo)致抓取時(shí)頁(yè)面渲染異常收錄上去的是一堆沒(méi)有樣式的快照。7. 上線前后測(cè)試、部署與驗(yàn)收7.1 上線前的驗(yàn)收清單我?guī)У捻?xiàng)目上線前必須過(guò)一遍下面這張表任何一項(xiàng)不過(guò)就延期不商量檢查項(xiàng)檢查方式通過(guò)標(biāo)準(zhǔn)響應(yīng)式布局真機(jī)測(cè)試 4 檔寬度無(wú)橫向滾動(dòng)條、無(wú)元素重疊、文字不被截?cái)嘈阅苤笜?biāo)移動(dòng)端模擬 4G 測(cè)三次取中位數(shù)LCP2.5s、CLS0.1、INP200ms表單流程真實(shí)提交并確認(rèn)收到通知成功提示正常、郵件或消息到達(dá)、數(shù)據(jù)入庫(kù)鏈接完整性全站爬取無(wú) 404、無(wú)重定向鏈超過(guò)兩層可訪問(wèn)性鍵盤走一遍全站交互焦點(diǎn)可見(jiàn)、順序合理、彈窗可關(guān)閉瀏覽器兼容主流瀏覽器兩個(gè)大版本布局一致、交互可用備份與回滾演練一次回滾15 分鐘內(nèi)可恢復(fù)到上一版本表單那一項(xiàng)一定要用真實(shí)郵箱和真實(shí)收件人測(cè)不要只看前端有沒(méi)有彈成功提示。我踩過(guò)一次坑前端提示成功后端因?yàn)猷]件服務(wù)配額超限靜默失敗上線三天丟了十幾條線索第四天客戶打電話來(lái)問(wèn)為什么沒(méi)人回復(fù)才發(fā)現(xiàn)。7.2 部署策略與上線后的三個(gè)月部署別直接覆蓋生產(chǎn)環(huán)境。標(biāo)準(zhǔn)流程是本地構(gòu)建、推送到預(yù)發(fā)布環(huán)境、在預(yù)發(fā)布域名下完整走一遍驗(yàn)收表、確認(rèn)無(wú)誤后切生產(chǎn)。靜態(tài)站點(diǎn)可以把構(gòu)建產(chǎn)物整體上傳并保留上一版本目錄切換時(shí)只改指向帶服務(wù)端的站點(diǎn)用藍(lán)綠或灰度先放 10% 流量觀察錯(cuò)誤率和核心指標(biāo)穩(wěn)定后再全量。上線后三個(gè)月是問(wèn)題暴露期至少配三樣監(jiān)控真實(shí)用戶監(jiān)控采集真實(shí)訪客的 LCP、CLS、INP 分布重點(diǎn)看第 75 百分位而不是平均值。平均值好看但尾部很差的站點(diǎn)實(shí)際體驗(yàn)是破碎的。錯(cuò)誤上報(bào)腳本異常、接口失敗、資源加載失敗統(tǒng)一收集按頁(yè)面和瀏覽器聚合??捎眯蕴綔y(cè)每分鐘從外部探測(cè)一次首頁(yè)和關(guān)鍵頁(yè)面連續(xù)兩次失敗就告警。另外把統(tǒng)計(jì)埋點(diǎn)配好重點(diǎn)看三個(gè)數(shù)首屏跳出率、核心頁(yè)面之間的流轉(zhuǎn)路徑、轉(zhuǎn)化動(dòng)作完成率。前兩個(gè)用來(lái)發(fā)現(xiàn)導(dǎo)航和內(nèi)容的問(wèn)題第三個(gè)用來(lái)驗(yàn)證立項(xiàng)時(shí)定的目標(biāo)有沒(méi)有達(dá)成。數(shù)據(jù)不好看的時(shí)候別急著改設(shè)計(jì)先看錄屏或者做幾個(gè)用戶訪談往往問(wèn)題出在文案看不懂而不是界面不好看。8. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄8.1 高頻問(wèn)題速查表現(xiàn)象常見(jiàn)原因處理辦法首屏文字先消失再出現(xiàn)字體未設(shè)font-display阻塞渲染加font-display: swap并做子集化圖片加載時(shí)頁(yè)面跳動(dòng)圖片未設(shè)寬高或?qū)捀弑热萜鲗懰纖idth/height或用比例容器移動(dòng)端出現(xiàn)橫向滾動(dòng)某元素寬度超出視口或用了負(fù)邊距臨時(shí)給body加溢出隱藏定位元素再逐個(gè)修動(dòng)畫在低端機(jī)上卡頓動(dòng)畫屬性觸發(fā)重排或圖層過(guò)多只用transform和opacity減少同時(shí)動(dòng)畫元素表單提交后收不到通知郵件服務(wù)配額、垃圾郵件攔截、后端異常加服務(wù)端日志和失敗重試配置獨(dú)立發(fā)信通道搜索收錄慢或不收錄規(guī)則文件誤擋、缺站點(diǎn)地圖、內(nèi)容重復(fù)用抓取測(cè)試逐項(xiàng)排查補(bǔ)規(guī)范化鏈接頁(yè)面評(píng)分高但用戶說(shuō)卡只測(cè)了實(shí)驗(yàn)室數(shù)據(jù)沒(méi)看真實(shí)用戶分布接入真實(shí)用戶監(jiān)控看第 75 百分位改一處文案要發(fā)版內(nèi)容硬編碼在模板里抽數(shù)據(jù)文件或接內(nèi)容管理把文案與結(jié)構(gòu)分離8.2 幾條花錢買來(lái)的經(jīng)驗(yàn)第一條占位圖絕不能進(jìn)生產(chǎn)環(huán)境。我見(jiàn)過(guò)上線當(dāng)天首頁(yè)還掛著“圖片占位 800×600”的站點(diǎn)客戶氣得要扣尾款。解決辦法是在構(gòu)建流程里加一道檢查檢測(cè)到占位圖文件名就中斷構(gòu)建。這道檢查五分鐘能寫完能省掉一次事故。第二條移動(dòng)端要在真機(jī)上測(cè)不要只靠瀏覽器模擬。模擬器里的 4G 是假的觸摸手感是假的字體渲染也跟真機(jī)不一樣。尤其是中文字體在部分安卓設(shè)備上的行高表現(xiàn)模擬器完全看不出來(lái)。項(xiàng)目里至少準(zhǔn)備兩臺(tái)真機(jī)一臺(tái)中端安卓、一臺(tái)較老型號(hào)的手機(jī)在這兩臺(tái)機(jī)器上跑通基本就穩(wěn)了。第三條給運(yùn)營(yíng)寫一份改內(nèi)容手冊(cè)配截圖。別指望他們記住后臺(tái)每個(gè)字段的含義。手冊(cè)里寫清楚哪個(gè)字段對(duì)應(yīng)頁(yè)面上哪個(gè)位置、字?jǐn)?shù)上限是多少、圖片尺寸要求、改完怎么預(yù)覽、出問(wèn)題找誰(shuí)。這份手冊(cè)花半天寫能省掉后面幾十次重復(fù)答疑。第四條留一份“技術(shù)交接文檔”。內(nèi)容包括項(xiàng)目結(jié)構(gòu)說(shuō)明、構(gòu)建和部署命令、環(huán)境變量清單、第三方服務(wù)賬號(hào)歸屬、監(jiān)控入口、常見(jiàn)故障處理步驟。我見(jiàn)過(guò)太多站點(diǎn)做完之后原班人馬散了接手的人連怎么構(gòu)建都找不到最后只能推倒重來(lái)。高端不高端兩年后還能不能順利改版這份文檔說(shuō)了算。第五條也是我個(gè)人最看重的一條把“看起來(lái)高級(jí)”的預(yù)算挪一部分到“用起來(lái)順手”上。把首屏動(dòng)效砍掉一半換成更快的加載把首頁(yè)輪播從五張減到兩張換成更清楚的價(jià)值主張把花在特效上的兩天花在表單字段的精簡(jiǎn)和錯(cuò)誤提示的打磨上。訪客不會(huì)因?yàn)槟闵倭艘粋€(gè)粒子動(dòng)畫而覺(jué)得這個(gè)站廉價(jià)但一定會(huì)因?yàn)檎也坏铰?lián)系電話而離開(kāi)。這套流程跑順之后一個(gè) 10 頁(yè)左右的品牌站從立項(xiàng)到上線大概六到八周其中設(shè)計(jì)和開(kāi)發(fā)重疊兩周測(cè)試和修改留一周半。真正決定成敗的其實(shí)不是某一項(xiàng)技術(shù)而是每個(gè)環(huán)節(jié)有沒(méi)有留下可檢查的產(chǎn)物目標(biāo)表、內(nèi)容清單、設(shè)計(jì)令牌、性能預(yù)算、驗(yàn)收清單、交接文檔。這六樣?xùn)|西齊了項(xiàng)目基本不會(huì)翻車缺了任何一樣問(wèn)題都會(huì)在交付前一周集中爆發(fā)。