为什么用ref="/tag/137/" style="color:#479099;font-weight:bold;">JavaScript框架的网站容易被搜索引擎忽略
很多人用Vue、React或Angular搭建网站,页面效果炫酷,交互流畅。但上线后发现,百度和谷歌几乎搜不到自己的内容。问题出在哪儿?传统的搜索引擎爬虫对JavaScript渲染的内容支持有限,尤其是早期版本的爬虫,看到的只是空荡荡的<div id="app"></div>,真正的内容是通过JS动态加载进去的,它根本看不见。
比如你做了个美食推荐站,首页全是用React渲染的餐厅卡片,结果用户搜“北京最好吃的川菜”,你的站点压根不出现。不是内容不好,而是搜索引擎还没等到JS执行完就走了。
预渲染:给搜索引擎看的静态快照
最直接的办法是预渲染(Prerendering)。简单说,就是提前把JS渲染好的页面保存成静态HTML,爬虫来访问时,直接给它这个“快照”。普通用户还是走正常的JS应用,不影响体验。
比如用prerender.io这样的服务,配置好路由,当检测到是百度蜘蛛(Baiduspider)或Googlebot访问时,自动返回预渲染的HTML版本。配置Nginx时可以这样写:
if ($http_user_agent ~* (Baiduspider|Googlebot)) {
rewrite ^(.*)$ /prerender?url=$1 break;
}这种方式成本低,适合内容更新不频繁的页面,比如企业官网、博客文章页。
服务端渲染(SSR):从源头解决问题
如果网站内容经常变,比如电商、社区论坛,预渲染可能不够用。这时候就得上服务端渲染(SSR)。Vue有Nuxt.js,React有Next.js,它们能在服务器端就把页面生成好,用户和爬虫拿到的都是带内容的完整HTML。
以Next.js为例,写页面时用getServerSideProps,数据在服务端获取,然后注入到页面:
export async function getServerSideProps() {
const res = await fetch('https://api.example.com/products');
const products = await res.json();
return {
props: { products },
};
}这样无论谁访问,看到的都是填充好数据的页面,搜索引擎自然能抓到关键词和描述。
合理使用meta标签和结构化数据
即使页面内容能被抓取,也要帮搜索引擎理解它。动态设置<title>和<meta name="description">很重要。比如在Vue中,可以用vue-meta:
<script>
export default {
metaInfo() {
return {
title: this.article.title,
meta: [
{ name: 'description', content: this.article.excerpt }
]
}
}
}
</script>再加上JSON-LD格式的结构化数据,比如文章发布时间、作者、评分等,能让搜索结果展示得更丰富,点击率更高。
避免过度依赖客户端跳转
单页应用(SPA)常用前端路由,比如Vue Router的history模式。虽然URL好看,但如果没有服务端配合,刷新页面可能404。解决办法是在Nginx或Node服务中配置fallback,所有路由都指向index.html,再由JS接管。
同时,别用js做跳转,比如location.href = '/next',搜索引擎可能跟丢了。能用a标签的就别绑click事件。
提交站点地图和关注渲染时间
生成sitemap.xml,把所有重要页面列进去,提交到百度站长平台和Google Search Console。这些工具还能模拟爬虫视角,看看你的页面到底能不能被正确抓取。
另外,注意页面的首屏渲染速度。就算用了SSR,如果数据接口太慢,爬虫等几秒就走了。优化API响应,加缓存,别让渲染卡在某个请求上。