prerender-SPA程序的SEO优化策略

随着前端MDV框架的兴起,SinglePageApplication(SPA)成为趋势,但搜索引擎优化(SEO)成为难题。本文介绍如何通过angular及prerender工具解决SPA项目的SEO问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

随着web2.0的兴起,ajax的时代已经成为了事实,更如今Knockout,backbone, angular,ember前端MDV(model driver view)框架强势而来,Single Page Application已经为大家所熟悉了。如今常见的SPA程序,restfull和前端MDV之类的框架能够实实在在的减少我们的代码开发量,让我更多的注意力关注在真正的业务逻辑上。在众多前端MDV框架从博客中可以看出来笔者还是钟爱于angular,然而服务端平台的选择的话:在.net平台笔者会首选webapi+oData,jvm平台spring restfull。

但是相应带来的是搜索引擎优化(SEO)是个难题,因为爬虫不会去执行JavaScript。现在很幸运的是在Google推出angular之后,也给出了一些解决方案:Google's ajax crawling protocol.此协议现在已被Google和bing所实现。

在协议中规定,搜索引擎会把带有#!someurl的链接转换为escaped_fragment=someurl访问解析,例如:

www.example.com/ajax.html#!key=value

  

将会变为

www.example.com/ajax.html?_escaped_fragment_=key=value

  

所以如果我们需要更好的SEO的支持的话,我们可以从现在开始把我们程序中的#变为#!,特别angular程序,因为框架原声支持对#!的解析。

基于这个协议和phantomjs(headless的浏览器内核)我们的SPA SEO工具 prerender(http://prerender.io/)应运而生,在官方和社区的支持下,现在已经有node.js express,ruby on rails,java,asp.net,php,python主流框架和nginx之类的支持。

prerender架构流程图如下:

prerender分为两个部分一部分为后端云服务和应用程序客户端,客户端主要拦截来自爬虫的请求在转发到后端云服务处理返回处理后并且去掉多余script/css的html在返回给爬虫。

后端云服务(nodejs项目),利用phantomjs这个无ui headless的浏览器内核加载页面地址,并等到页面解析后获取document html,并处理去掉无用的部分返回到前段客户端程序。

而前段程序则为不同语言框架而实现的不同拦截器,如java的filter,asp.net mvc的HttpModule,主要任务为拦截请求并转发给后端云服务处理。其拦截规则为:

  1. 检查url中是否带有escaped_fragment或者请求user-agent是已知或者配置的爬虫user-agent
  2. 确认拦截的不是js,css之类的资源文件
  3. 在确认url是在白名单中(可选如果配置的白名单的话)
  4. 确认不应该在黑名单中(可选如果配置了黑名单的话)

注:最好值配置黑名单或者白名单中的一种方式。

有了prerender,因为SEO而放弃SPA不再是理由了,关于prerender的任何issue大家可以及时提出,让它更加完善。具体关于如何使用和测试请转向主页和各个client程序页面,http://prerender.io/

### Vue 使用 `prerender-spa-plugin` 实现 SEO 优化教程 #### 安装依赖 要使用 `prerender-spa-plugin` 插件,首先需要安装该插件及其依赖项。可以通过 npm 或 yarn 来完成这一步骤。 ```bash npm install prerender-spa-plugin --save-dev ``` 或者 ```bash yarn add prerender-spa-plugin --dev ``` #### 配置 Webpack 构建工具 接下来,在项目的 webpack 配置文件中引入并配置此插件。对于大多数基于 Vue CLI 创建的应用程序来说,可以在 `vue.config.js` 文件里添加如下代码: ```javascript const PrerenderSPAPlugin = require('prerender-spa-plugin'); // Renderer should be imported from the plugin as well. const Renderer = PrerenderSPAPlugin.PuppeteerRenderer; module.exports = { configureWebpack: config => { if (process.env.NODE_ENV !== 'production') return; return new PrerenderSPAPlugin({ staticDir: path.join(__dirname, 'dist'), routes: ['/', '/about', '/contact'], // 添加想要提前渲染的页面路径列表 renderer: new Renderer({ renderAfterTime: 5000, headless: true, injectProperty: '__PRERENDER_INJECTED', // Optional arguments passed directly to puppeteer's `.launch()`. launchArgs: [ '--no-sandbox', '--disable-setuid-sandbox' ] }) }); } }; ``` 这段设置指定了哪些 URL 将被预先渲染成 HTML 文件,并保存至构建后的目录下[^1]。 #### 设置 Meta Information 为了让搜索引擎更好地理解网页内容,还需要为各个视图组件定义合适的元数据信息。可以利用 `metaInfo` 属性来指定每一页特有的 `<title>` 和其他头部标签。 ```html <template> <!-- 组件模板 --> </template> <script> export default { name: "Home", metaInfo () { return { title: this.titleText || '默认标题', meta: [{ vmid: 'description', name:'description', content:this.description }] }; }, data(){ return{ titleText : '', description: '' } }, mounted(){ // 动态获取或设定页面描述等信息 } } </script> ``` 上述例子展示了如何在一个名为 Home.vue 的单文件组件内部声明自定义的文档头信息[^5]。 #### 解决常见错误 有时可能会遇到无法成功预渲染所有路由的问题(如 ERROR in [prerender-spa-plugin] Unable to prerender all routes!)。这类情况通常是因为某些异步操作未能及时完成而导致超时失败。此时建议调整 `renderAfterDocumentEvent` 参数值以等待特定事件触发后再执行渲染逻辑;也可以适当增加 `maxAttempts` 数量给予更多重试机会[^2]。 另外需要注意的是当采用 history 模式的路由时,如果服务器端未作相应处理,则可能导致刷新页面时报错找不到资源。因此应当确保后端能够正确响应这些请求并将它们转发给前端应用入口文件处理[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值