在单页应用(SPA)中,使用前端路由可以使用户体验更加流畅,避免页面刷新。而 pushState
是 HTML5 历史记录 API 中的一个方法,可以通过改变浏览器地址栏中的 URL,实现前端路由。
然而,如果不加以处理,使用前端路由会对网站的搜索引擎优化(SEO)造成影响。因为搜索引擎爬虫只能通过页面中的链接来抓取数据,无法解析 JavaScript 生成的路由,这就导致了搜索引擎无法正确地索引网站内容。
解决方案
为了解决这个问题,我们需要使用服务器端渲染(SSR)或者预渲染(Prerendering),以确保搜索引擎能够正确地获取到网站的内容。这里重点介绍后者的实现方式。
Prerendering
Prerendering 是指在构建过程中,将 SPA 的某些页面预先渲染为静态 HTML 页面,然后交给服务器进行返回。这样搜索引擎爬虫就可以像访问普通的 HTML 静态页面一样,正确地获取到页面内容。
具体实现上,可以使用一些工具,比如 Prerender.io 或者 Puppeteer 等来实现 Prerendering。这里以 Prerender.io 为例进行介绍。
使用 Prerender.io
Prerender.io 是一个基于 Node.js 的 Prerendering 服务,可以在前端路由的基础上,实现 SEO 功能。具体使用方式如下:
安装
prerender-node
包npm install prerender-node --save
在服务器端代码中添加 Prerender 中间件
const prerender = require('prerender-node'); app.use(prerender);
在页面中添加
<meta name="fragment" content="!">
标签这个标签是为了告诉 Prerender.io,需要对这个页面进行预渲染。当搜索引擎访问这个页面时,Prerender.io 会自动请求这个页面并返回已经渲染好的 HTML 页面。
-- -------------------- ---- ------- --------- ----- ------ ------ ----- ---------------- ----- --------------- ---------------------------- ------------------- ----------------------- ----- --------------- ------------ ------- ------ ---- --------------- ------- --------------------------------- ------- -------
配置 Prerender.io
在 Prerender.io 管理面板中,添加自己的网站,并配置相关信息。
至此,我们就完成了 SPA 前端路由和 SEO 的结合。当搜索引擎爬虫访问网站时,Prerender.io 会自动将页面预渲染为静态 HTML 页面,并返回给搜索引擎,从而实现 SEO。
示例代码
以下是一个使用 Vue.js 实现的前端路由示例,其中使用了 pushState
方法来实现前端路由,并使用 Prerender.io 来进行 SEO:
-- -------------------- ---- ------- ------ --- ---- ------ ------ --------- ---- ------------- ------ ---- ---- ------------------- ------ ----- ---- -------------------- ------------------- ----- ------ - - - ----- ---- ---------- ---- -- - ----- --------- ---------- ----- -- -- ----- ------ - --- ----------- ----- ---------- ------- --- ---------------------- ----- ----- -- - --------------------- - ------ ------- --- ------------------- -- - --------------------- - ----- --- --- - ----------------------------------------------------------- -------- ----------------------------------------------------------------------------------