你刚上线一个酷炫的交互页面,动画丝滑、逻辑缜密,结果搜自己网站名字——首页都排不进前五。你翻遍 robots.txt,检查了 sitemap,甚至手动提交了 URL……可搜索结果里,还是空的。

不是搜索引擎不想收,是它根本没看见你塞在 JS 里的内容。

为什么搜索引擎看不懂你的JS内容?

Google 确实会执行 JavaScript,但这件事儿不像你想的那么“全自动”。

它分两步走:先抓原始 HTML,再排队渲染 JS。中间隔着网络延迟、资源加载、执行超时、队列拥堵……哪一环卡住,你的内容就直接被跳过。

我帮一个用 Vue 做产品列表页的电商站排查过。他们首页所有商品都是 JS 动态拉取的。我在 Google Search Console 里点开“查看已抓取页面”,看到的源码只有 <div id="app"></div>——连个商品名都没冒出来。爬虫第一次来,只拿到一个空壳,不会等你 JS 加载完再走。

更现实的是:爬虫不是浏览器,它不点按钮、不滚页面、不等 API 返回。如果你的页面要等 3 秒才出标题,或者靠点击“加载更多”才补全正文,那对搜索引擎来说,那些内容就等于不存在。

3个方法检测你的JS内容是否被识别

别等上线后靠猜。开发阶段就能验证,而且不用装新工具。

方法一:查看原始 HTML 响应

右键 → “查看网页源代码”(不是“检查元素”)。你看到的,就是搜索引擎第一眼看到的全部。

如果核心文字、标题、链接、产品名都不在这份源码里,那它们大概率不会出现在搜索结果中。

之前有个 React 博客站,所有文章列表都靠 JS 渲染。源码里只有 #root 容器和几行脚本。作者改成服务端渲染后,文章标题直接出现在 HTML 里,一周内收录量明显提升。

方法二:用 Google Search Console 的网址检查工具

打开 Search Console → 左侧菜单点“URL 检查” → 粘贴你要测的页面地址 → 点“测试已发布的网址”。

重点看两个标签:

  • “抓取”:显示爬虫拿到的原始 HTML
  • “呈现”:显示 Google 渲染后的最终效果

如果“呈现”里能看到完整内容,说明 OK;如果还是一片空白、只有骨架、或满屏“加载中…”,那就得动手改了。

我合作过一个在线计算器工具站,所有计算结果都靠 JS 实时生成。测试发现,“呈现”结果里数字全是空的。后来他们在 HTML 里预埋了一组默认示例数据,问题当场解决。

方法三:使用 curl 命令模拟爬虫

打开终端,输入:

curl -H "User-Agent: Googlebot" https://你的网址

返回的内容,就是 Googlebot 看到的“第一版”。如果关键信息不在里面,说明你的 JS 内容对搜索引擎是隐形的。

哪些JS写法最容易坑搜索引擎

有些写法,看着很现代,但对 SEO 来说,就是隐形地关上了大门。

写法一:完全依赖客户端渲染的SPA

所有路由、所有内容,全靠 JS 在浏览器里拼。比如用 Vue Router 或 React Router 切换页面,每个 URL 返回的都是同一份空 HTML。

我见过一个企业官网,从“关于我们”到“客户案例”,全用 SPA 实现。半年过去,除了首页,其他页面在 Google 里搜都找不到。

解决方向很明确:要么上 Nuxt.js / Next.js 做服务端渲染,要么至少让每个页面的 HTML 里带着标题和核心段落。

写法二:通过 API 异步加载关键内容

职位详情、文章正文、用户评论……这些内容如果全靠 fetch 或 axios 拉,搜索引擎基本不会等。

它不发请求,不等响应,不处理回调。API 返回前,页面就是静态的“加载中”。

之前优化一个招聘站时,职位描述全靠接口获取。Search Console 测试结果里,“呈现”页面只显示三个字:“加载中…”。后来把职位标题、公司名、岗位关键词直接写进 HTML,再用 JS 补充交互,收录立刻恢复正常。

写法三:用 JS 事件触发内容显示

“点击展开全文”、“悬停显示提示”、“滑动加载更多”……这类内容,搜索引擎不会点、不会悬停、不会滑动。

它只读初始 HTML。如果重要内容被藏在 onclickonmouseover 后面,那它永远看不到。

想被收录?那就让它一开始就在 HTML 里——哪怕只是静态文本,也比藏在事件里强。

实战:如何让搜索引擎顺利识别你的JS内容

不用推翻重做,这几个动作今天就能上手。

技巧一:使用动态渲染(Dynamic Rendering)

给真实用户发 JS 页面,给爬虫发预渲染好的 HTML。原理简单:服务器检测 User-Agent,如果是 Googlebot,就用 Puppeteer 或 Rendertron 提前跑一遍 JS,吐出完整 HTML 给它。

我帮一个 Angular 仪表盘站配了这套逻辑。原来一直空白的“数据报表”页,配置完当天就被 Google 收录了,自然流量也大幅增长。

技巧二:把核心内容提前到 HTML 中

最省事的办法:标题、副标题、产品名、价格、简介、导航文字……这些必须被索引的内容,直接写死在 HTML 里。

JS 不是用来“生成内容”的,而是用来“增强体验”的——比如加个切换按钮、做个平滑滚动、补个动态计数。

有个做菜谱的朋友,原来所有步骤都靠 JS 渲染。我让他把菜名、用料清单、烹饪时长这三项硬写进 HTML,其余交互保留。改完第三天,Google 就开始收录他的菜谱页了。

技巧三:合理使用 <noscript> 标签

如果你暂时没法改架构,又必须让 JS 内容被索引,可以在 <noscript> 里放一份纯 HTML 版本的核心内容。

搜索引擎会读它,用户看不到它(因为有 JS)。适合内容结构简单、更新不频繁的页面。

但别滥用:如果 <noscript> 里塞一堆动态组件或复杂表格,反而会让爬虫困惑。真要长期维护,还是建议回归服务端渲染。

不同JS框架的搜索引擎友好度对比

你选的框架,决定了搜索引擎第一眼看到的是“满汉全席”,还是“一碗白米饭”。

  • Vue / React(纯客户端):默认不友好。内容全靠 JS 注入,爬虫看到的就是空壳。
  • Nuxt.js / Next.js:服务端渲染开箱即用。HTML 在发给浏览器前就已生成,搜索引擎秒懂。我经手的一个博客项目,从 Vue 切到 Nuxt 后,收录率从不到三成升到接近九成。
  • Angular Universal:能做服务端渲染,但配置门槛高,容易踩坑。如果是内容型站点,建议咬牙配好,否则收录会持续掉线。
  • 纯静态 HTML + 少量 JS:最稳妥。标题、正文、链接全在源码里,JS 只负责加个轮播、切个 tab、验个表单。搜索引擎喜欢这种“直给”。

今天就能执行的一个具体操作步骤

打开你的网站,挑一个你最想被搜到的页面(比如产品页、文章页、服务介绍页),右键 → “查看网页源代码”。

从上往下快速扫一遍,找三样东西:
✅ 页面标题(<title> 里的文字)
✅ 主要标题(比如 <h1>
✅ 至少一段你能想到用户会搜的关键词(比如“智能插座”“红烧肉做法”“合同模板下载”)

如果这三样里有任何一样,是靠 JS 插入的、藏在 <script> 标签里的、或者压根没出现——
今天就打开这个页面的 HTML 模板文件,把它们直接写进去。
不用等接口、不用等组件、不用等状态管理。就一行 <h1>智能插座</h1>,就够搜索引擎迈出第一步。