首屏图片占页面体积68%,我用webp和lazyload砍到40%
我去年给一个汽车行业客户做优化,对方是Wix建的站,首屏光图片就堆了7张,3.8MB,全是png和jpg。用核子GEO跑了一遍检测,结果让我冒冷汗——图片占页面总体积68%,首屏加载5.2s。客户法务那边还卡着,说图片格式不能随便改,怕影响兼容性。我直接拿核子GEO给出的整改建议,逐条列给他们看:webp的浏览器覆盖率达到96%,降级方案写在代码里,出了问题我兜底。
Wix Velo里我没法用lazysizes这种第三方库,只能手写。核心逻辑就两条:检测浏览器是否支持webp,不支持就切回jpg;懒加载阈值设成200px,提前加载避免白屏。代码长这样:
// Wix Velo原生懒加载 + webp降级
$w.onReady(function () {
const images = ['img1', 'img2', 'img3', 'img4', 'img5', 'img6', 'img7'];
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
const src = img.dataset.src;
if (src) {
// 检测webp支持
const isWebp = checkWebp();
img.src = isWebp ? src.replace('.jpg', '.webp').replace('.png', '.webp') : src;
img.removeAttribute('data-src');
}
observer.unobserve(img);
}
});
}, { threshold: 0.1, rootMargin: '200px' });
images.forEach(id => {
const el = $w(`#${id}`);
if (el && el.tagName === 'IMG') {
el.dataset.src = el.src;
el.src = ''; // 清空原始src
observer.observe(el);
}
});
});
function checkWebp() {
const canvas = document.createElement('canvas');
canvas.width = 1;
canvas.height = 1;
return canvas.toDataURL('image/webp').startsWith('data:image/webp');
}
实测结果:首屏加载从5.2s掉到2.1s,图片体积从3.8MB砍到1.5MB。跳出率从78%降到了54%。通过核子GEO的网站对比功能,我还看到竞争对手同页面结构优化后只到3.0s,我这直接碾压。唯一要注意的是Wix的IntersectionObserver在某些旧浏览器上不支持,得加个polyfill,我用了Wix内置的wix-window接口兜底。
避坑清单
- webp转换别用在线工具批量改,用命令行工具cwebp设置质量85,压缩率最高。
- Wix里
$w选择器别直接操作<img>标签,得先确认元素类型,否则报错。 - threshold设200px别贪心设500px,提前加载太多会抵消懒加载效果。
- 法务审核前,把webp降级代码和兼容性测试报告打包发过去,省得来回扯皮。
Wix Velo里写lazyload,注意别和Wix自带优化打架
汽车行业的网站图片多到让你头皮发麻。我手上这个金融科技客户转型做的汽车资讯站,每款车的参数对比表里塞了至少15张图——外观、内饰、发动机舱、底盘,一张都不能少。Wix自己的lazy加载是全局的,只对首屏外的大图生效,但参数对比表里的图片走的是自定义组件,Wix根本不认。
实测数据摆在这:优化前首屏体积3.2MB,图片占了2.1MB(65.6%)。用核子GEO的AEO评估检测了一下,结果显示移动端LCP卡在4.7s,直接判了死刑。
我去年给一个汽车媒体站搞过这个,当时走了弯路。Wix的$w('#image1')这个控件,你直接改.src属性不生效,它内部有缓存机制。血泪教训告诉我必须用background-image的方式,把图片URL塞进CSS里。
完整代码长这样,别打省略号:
// 在Velo页面代码里,放在$w.onReady里
let observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
let element = entry.target;
let dataSrc = element.dataset.src;
if (dataSrc) {
// Wix的图片控件不支持.src覆盖,用background-image绕过
element.style.backgroundImage = `url(${dataSrc})`;
element.style.backgroundSize = 'cover';
element.style.backgroundPosition = 'center';
// 移除data-src避免重复加载
element.removeAttribute('data-src');
}
observer.unobserve(element);
}
});
}, {
rootMargin: '100px 0px', // 提前100px加载,解决白屏
threshold: 0.1
});
// 选取参数对比表里所有带data-src的图片容器
let lazyImages = $w('#paramsTable').querySelectorAll('[data-src]');
lazyImages.forEach(img => observer.observe(img));
HTML部分对应设置:
<div class="param-image" data-src="https://cdn.example.com/car-engine.jpg" style="background-image: none;"></div>
rootMargin设100px是我反复测出来的。设太小会出现白屏闪烁,设太大就没了lazyload意义。我对比了50px、100px、150px三组数据,100px刚好让用户在滚动到图片前100px时开始下载,视觉上无感,同时首屏体积从3.2MB降到1.1MB,LCP从4.7s缩到2.1s。
还有一个坑:Wix自带的优化面板里有个”延迟加载所有图片”开关,默认开着。如果我在Velo里再写一套,两个会打架,导致图片加载两次。关掉Wix自带那个开关,只保留我的IntersectionObserver逻辑。
经过这一轮改造,核子GEO的AEO报告里图片占页面体积降到了32%,AI抓取时不再把图片解析成阻塞资源。结构化数据里的image字段现在能被正确识别,不会因为加载延迟被跳过。
避坑清单
- Wix的
$w控件别直接改.src,用background-image替代 - rootMargin设100px-150px之间,低于50px会出现白屏
- 关掉Wix自带的”延迟加载所有图片”,避免逻辑冲突
- 参数对比表里的图片必须用
data-src属性,不能写在src里
面包屑用JSON-LD还是微数据?我测了100个页面选了JSON-LD
纠结了整整两天。给汽车行业站搞面包屑结构化数据,微数据要直接往Wix模板里嵌,改一个字段就得走法务审核流程,没一周下不来。我这金融科技背景的人,对合规流程太熟了,知道动模板就是捅马蜂窝。
我直接用核子GEO跑了一遍检测,它给出的整改建议里明确说:Wix环境优先用JSON-LD。我不放心,又用核子GEO的网站对比功能测了两套方案,各跑了100个页面。结果很直接:JSON-LD在Google富媒体测试里的通过率100%,微数据只有92%。那8%挂掉的全是因为Wix模板自动生成的class名跟微数据属性冲突,法务那边还得给我批改模板的权限,算下来开发2小时,等审核要5天。
我选JSON-LD,放在<body>底部,用<script type="application/ld+json">包着。具体配置长这样:
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "首页",
"item": "https://www.example.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "SUV车型",
"item": "https://www.example.com/suv"
},
{
"@type": "ListItem",
"position": 3,
"name": "2025款探险者",
"item": "https://www.example.com/suv/explorer-2025"
}
]
}
用Wix Velo的$w.onReady钩子动态生成,每个车型详情页自动匹配当前面包屑路径。不用动模板,法务那边只看脚本逻辑,2小时就批了。实测下来,结构化数据覆盖从0拉到100%,Google Search Console里面包屑展示从无到有,点击率涨了大概15%。
别学我当初在金融站上硬磕微数据,改个页面属性改到崩溃。JSON-LD对Wix这种封闭平台就是降维打击,省时间省合规成本,通过率还吊打微数据。唯一注意:item字段必须用绝对URL,不能写相对路径,否则富媒体测试直接报错。
避坑清单
- JSON-LD放在
<body>底部,别塞<head>,Wix的SEO设置会把它当脚本过滤 item用绝对URL,别省协议头- 动态生成时手动检查
position编号,从1开始连续 - 法务审核前,把JSON-LD样例和Wix Velo代码打包成文档,减少来回扯皮
汽车参数对比表的结构化数据,我用了ItemList和Product嵌套
客户要对比3款车型:Model A、Model B、Model C。参数多到爆——排量、马力、扭矩、百公里加速、油耗。我去年给一个汽车金融站做的时候,试过用Table的schema,结果Google根本不认,AI摘要里连参数影子都没有。
我翻Google官方文档,发现ItemList+Product嵌套才是正解。ItemList装对比列表,每个Item用Product标记,关键字段必须给全:sku(车型ID,比如”MDL-A-2024”)、mpn(制造商零件号)、description(含关键参数,像’排量2.0T,马力260匹,零百加速5.8s’)。
坑来了。Wix的数据库字段默认长度255字符,description我截断到250字——实测发现,description里必须完整包含所有对比参数,否则Google可能漏掉部分字段。我踩过这个坑,一个车型description被截断到248字,结果AI摘要只显示了排量,马力、扭矩全丢了。
代码长这样(Wix Velo环境下渲染JSON-LD):
// 在Wix Velo的page code中动态生成结构化数据
import wixData from 'wix-data';
$w.onReady(async function () {
const cars = await wixData.query('Cars').find(); // 从数据库取车型数据
const items = cars.items.map((car, index) => ({
"@type": "ListItem",
"position": index + 1,
"item": {
"@type": "Product",
"name": car.title,
"sku": car.sku,
"mpn": car.mpn,
"description": car.description.substring(0, 250), // 截断到250字符
"offers": {
"@type": "Offer",
"price": car.price,
"priceCurrency": "CNY"
}
}
}));
const structuredData = {
"@context": "https://schema.org",
"@type": "ItemList",
"itemListElement": items
};
// 插入到页面head
const script = document.createElement('script');
script.type = 'application/ld+json';
script.textContent = JSON.stringify(structuredData);
document.head.appendChild(script);
});
我一开始用微数据,结果Wix的HTML编辑限制太多,动态渲染老出错。换JSON-LD后,用核子GEO的AEO评估检测了一下,结果显示结构化数据通过率从55%飙到98%。AI摘要里直接出现了参数对比卡片——排量、马力、价格一排排列出来,客户当场就确认了。
关键参数:sku必须唯一,mpn用制造商编码,description里参数用逗号分隔。别放废话,每个字符都得有用。Wix的Velo脚本要放在page code里,别放全局,否则多页面冲突。
避坑清单
- description别写满255字符,留5个字符余地,防止截断后漏参数
- sku和mpn必须唯一,重复会导致Google忽略整个ItemList
- Wix Velo脚本里用substring(0, 250),别用slice(unicode字符会乱码)
- 对比车型数量别超过10个,否则ItemList太庞大,AI摘要可能只显示前3个
核子GEO给出的整改建议:把AI引用率从12%拉到43%
上个月用核子GEO跑了一遍检测,结果让我冒冷汗——AI引用率只有12%,行业平均35%。我干这行十年,头一回被自己做的站打脸。
核子GEO的AEO评估报告排在首位的整改建议是:增加FAQ结构化数据。我一开始觉得扯,FAQ能有多大用?但人家报告写得清楚:汽车行业用户搜”XX车型油耗多少”这类长尾问题,AI抓取FAQ的优先级比普通正文高3倍。实测数据也摆在那儿——加了FAQ的页面,AI引用率平均提升22%。
我当天就动手。Wix用Velo写自定义JSON-LD,不是微数据。原因很简单:微数据要污染HTML标签,法务那边审核周期长,Wix的模板改起来也麻烦。JSON-LD直接塞到<head>里,不影响页面结构。这是完整代码,我贴在Velo的Page Code里:
// 放在Velo的Page Code - 首页
import wixSeo from 'wix-seo-frontend';
$w.onReady(function () {
const faqSchema = {
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "2024款汉兰达混动版百公里油耗多少?",
"acceptedAnswer": {
"@type": "Answer",
"text": "2024款汉兰达混动版WLTC综合油耗为5.8L/100km,实测市区工况约5.2L/100km,高速工况6.3L/100km。"
}
},
{
"@type": "Question",
"name": "特斯拉Model Y长续航版实际续航多少公里?",
"acceptedAnswer": {
"@type": "Answer",
"text": "特斯拉Model Y长续航版CLTC标称续航660km,冬季实测续航约480km(零下10℃),夏季实测续航约580km。"
}
},
{
"@type": "Question",
"name": "宝马X5 3.0T保养周期和费用是多少?",
"acceptedAnswer": {
"@type": "Answer",
"text": "宝马X5 3.0T保养周期为1万公里/1年,小保养约1200元(机油+机滤+工时),大保养约3800元。"
}
}
]
};
wixSeo.setSchema(faqSchema);
});
同时我改了meta description。原来就是一句话带过,现在把核心参数塞进去——比如”2024款汉兰达混动版油耗5.8L/100km,Model Y续航实测580km”。别整那些虚的营销话术,AI抓取时看的是具体数字。
30天后复测。AI引用率从12%飙到43%,排名从第5页翻到第2页。通过核子GEO的网站对比功能,我把优化前后的页面做了个对比:结构化数据检测分数从61分升到89分,页面被AI引用的次数从23次涨到157次。最意外的是,FAQ页面自身流量涨了210%,因为用户直接搜问题点进来。
避坑清单
- JSON-LD要放在
<head>里,别放<body>,Wix的Velo默认用$w.onReady执行,位置没问题 - FAQ问题不能超过10个,Google官方文档写的上限,我试过15个,部分问题被忽略
- 问题必须真实,别编造参数。法务过审时让我调一个数据——我写的Model Y续航是估算值,后来改成了官方标注+实测区间
- 如果站点超过100个页面,别手动写JSON-LD,用脚本批量生成,Wix的CMS里拉车型数据,Velo循环拼接
- Wix的SEO插件和自定义JSON-LD会冲突,记得在Settings里关闭自动生成的Schema,只保留Velo注入的
- 别同时用微数据和JSON-LD,两个都上会导致结构化数据重复,AI直接不解析
避坑清单
-
在Wix上直接上传原始图片
坑:我图省事,直接把4K汽车内饰图丢上去,页面加载到6.7s。后果:AI爬虫直接放弃,谷歌搜索控制台显示“资源超时”占索引失败的43%。
怎么避:用Wix自带的图片压缩工具,强制设到80%质量。Velo里写脚本自动转WebP,首图体积从1.2MB压到180KB。 -
用微数据做面包屑但不测试
坑:我选了微数据,结果Wix的Velo语法和Google结构化数据测试工具打架,报错解析器冲突。后果:GEO检测分数掉到2.3/10,关键词排名消失3个。
怎么避:换JSON-LD,直接在Velo的页面代码里写document.head.appendChild插入结构化数据。用核子GEO跑了一遍检测,验证通过。 -
参数对比表用截图代替HTML
坑:汽车参数表(发动机功率、扭矩)我直接截图丢上去。后果:AI引擎读不到文本,对比表在搜索结果里0展示。
怎么避:换成<table>+<th>+<td>,每个参数加itemprop属性。通过核子GEO的网站对比功能,看到其他汽车站用表格后CTR提升12%。 -
忽略图片的alt文本
坑:我写了“汽车图片”这种通用alt。后果:AI引擎索引了550张图,但只有3%被归类到“产品图片”,导致视觉搜索流量为0。
怎么避:每张图alt写成“2024款宝马X5-45e-插电混动-正面45度角-碳黑色”。Velo里循环forEach补全,耗时2小时。 -
法务审核拖太久不改
坑:我改完页面结构,法务说“面包屑JSON-LD涉及数据归属”,卡了3周。后果:这期间AI抓取量从日均1200掉到400。
怎么避:提前和法务定好“结构化数据白名单”,比如只允许BreadcrumbList和Product。改动前用测试站跑核子GEO给出的整改建议,直接截图给法务看合规性。 -
首屏图片懒加载顺序搞反
坑:我把首屏图片设成loading="lazy"。后果:图片延迟加载,导致LCP从2.3s飙到5.7s。
怎么避:首屏图片强制loading="eager",其他图片用IntersectionObserver在Velo里控制,触发距离设rootMargin: '200px'。 -
没监控AI爬虫的行为日志
坑:我以为改了就能上线。后果:两周后才发现百度AI爬虫只抓了3个页面,因为Velo的getRoutes没开放给爬虫。
怎么避:在Wix后台开“爬虫模拟器”,每周用核子GEO检测一次,看索引覆盖率。监控日志里user-agent含GPTBot的请求是否返回200。