使用HeadlessChrome做单页应用SEO

news/2024/4/29 12:46:08/文章来源:https://blog.csdn.net/weixin_34071713/article/details/89044790

随着react、vue、angular等前端框架的流行越来越多的web应用变成了单页应用,它们的特点是异步拉取数据在浏览器中渲染出HTML。使用这些框架极大的提升web用户体验和开发效率的同时缺带来一个新问题,那就是这样的网页无法被搜索引擎收录。虽然这些web框架支持服务端渲染,但这可能又会增加开发成本。

有没有一个可用于任何单页应用的SEO解决方案,让我们不用对代码做改变保持原有的开发效率?chrome-render可以帮我们做到这点,它通过控制HeadlessChrome渲染出最终的HTML返回给爬虫来实现。

HeadlessChrome介绍

前不久chrome团队宣布chrome支持headless模式,HeadlessChrome支持chrome所具有的所有功能只不过因为不显示界面而更快资源占用更小。相比于之前的phantomjs(作者因为HeadlessChrome的推出而宣布停止维护)chrome的优势在于它又一个很强的爹(google)会一直维护它优化它,并且chrome在用户量、体验、速度、稳定性都是第一的,所以我认为HeadlessChrome会渐渐替代之前所有的HeadlessBrowser方案。

如何操控HeadlessChrome

既然HeadlessChrome是以无界面模式运行的,那要怎么控制它和它交互?
chrome提供了远程控制接口,目前可以通过chrome-remote-interface来用js代码向chrome发送命令进行交互。在启动chrome的时候要开启远程控制接口,然后通过 chrome-remote-interface 连接到chrome后再通过协议控制chrome。具体操作见文档:

  • 以headless模式和远程控制模式启动chrome

  • 连接到远程chrome控制它

  • 控制chrome时支持哪些操作具体怎么用

chrome-render原理与实践

原理

chrome-render先会通过chrome-runner以headless模式启动和守护你操作上的chrome,再通过chrome-remote-interface操控chrome去访问需要被SEO的网页让chrome运行这个网页,等到包含数据的HTML被渲染出来时读取当前网页DOM转换成字符串后返回。

怎么知道你的网页什么时候已经渲染出包含数据的HTML了可以返回了呢?为了提升chrome-render效率,默认会在domContentEventFired时返回。对于复杂的场景还可以通过开启chrome-render的useReady选项,等到网页里调用了window.chromeRenderReady()时返回。

只渲染出了HTML还不够我们还需要检测出来着搜索引擎爬虫的访问,如果请求来着爬虫就返回chrome-render渲染后的HTML否则返回正常的单页应用所需HTML。

综上,整体架构如下:
koa-seo arch

实践

只需以下几行简单代码就可让chrome渲染出HTML:

const ChromeRender = require('chrome-render');
ChromeRender.new().then(async(chromeRender)=>{const htmlString = await chromeRender.render({url: 'http://qq.com',});
});    

chrome-render只是做了渲染出HTML的工作,要实现SEO还需要和web服务器集成。为了方便大家使用我做了一个koa中间件koa-seo,要集成到你现有的项目很简单,如下:

const seoMiddleware = require('koa-seo');
const app = new Koa();
app.use(seoMiddleware());

只需像这样接入一个中间件你的单页应用就被SEO了。

应用场景扩展

chrome-render除了用于通用SEO解决方案其实可以用于通用服务端渲染,因为目的都是渲染出最终的HTML再返回。针对通用服务端渲染我也做了一个koa中间件koa-chrome-render。使用chrome-render做服务端渲染的

优势在于:

  • 通用,适用于所有单页应用

  • 对原有代码几乎无改动,最多再合适的地方加个window.chromeRenderReady(),保持原有开发效率

缺点在于:

  • 和react、vue等只带的服务端渲染相比性能低(经我测试大约 200ms vs 60ms)

  • chrome-render渲染时占用资源高,一次渲染大约占用25Mb内存,当请求量大时服务器可能扛不住。但是可以通过缓存渲染结果优化。

总结

大家可能会说这个很像prerender.io,没错思路是一样的,chrome-render的优势在于:

  • chrome-render开源可自己部署,prerender要收费是商业产品

  • prerender基于已经停止维护的phantomjs

本文中所提到的相关项目都是开源的并且有详细的使用文档,它们的文档链接如下:

  • chrome-render

  • chrome-runner

  • koa-seo

  • koa-chrome-render

喜欢的给个star,希望大家和我一起来改进它们让它们更强大。

阅读原文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_798163.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Burpsuite破解网站密码

burpsuite专业版 一个网站 方法/步骤 1切换至proxy选项卡的Option选项下,设置代理地址和端口:127.0.0.1:8080。 2启动刚刚设置的代理 3打开Internet Properties,依次选择:Connections ->LAN Settings ->Proxy Server.分别输…

《社交网站界面设计(原书第2版)》——第2章 2.0社交的核心

第2章 2.0社交的核心 与其说网络是一种技术创新,不如说它是一种社交创新。我设计的是一种社会效应(帮助人们一起工作)而不是一种高科技玩具。——蒂姆博纳斯-李 ,《编织万维网》(1999年)在《建筑的永恒之道…

推荐一个激动人心的Silverlight网站应用

先给出围观地址:http://www.vsallaccess.com/index.html 该网站不仅外表华丽,而且使用了很多silverlight3的新特性(如3d变换,导航等),绝对会让踌躇不前的silverlighter们振奋起来 左侧菜单中鼠标滑过时的绚…

php如何过滤中国菜刀站软,禁用 php 函数,增强网站安全(防中国菜刀)

许多主机商都会禁用许多的 php自带函数,以保证主机安全等。就在前一段时间 。。一位用户将中国菜刀这个工具作为问题提交到 Wooyun 了,所以我们不得不做点什么了 。。。 今天就发这个文章,主要说说推荐禁用的函数和禁用方法,顺便放…

java页面从数据库读取图片到网站上_用JSP从数据库中读取图片并显示在网页上...

<1>先在mysql下建立如下的table. 并insert图像.mysql.sql文件如下:CREATE TABLE photo (photo_no int(6) unsigned NOT NULL auto_increment,image blob,PRIMARY KEY (photo_no))<2>把show.jsp放在tomcat的任意目录下. show.jsp作用:从数据库中读出blob,并产生imag…

【Flask】 网站的用户管理

网站用户管理 不知道为什么很多学习Flask的人都是从搭博客开始的&#xff08;大概是因为那本书的案例是博客&#xff0c;同时对bootstrap支持良好&#xff0c;bootstrap又是twitter开发的吧。。&#xff09;既然是搭建博客&#xff0c;就免不了要对博客的用户进行管理。我今天照…

ubuntu下零基础建站之python基础环境搭建

这篇说的是 ubuntu下 python 基础环境 python2.7&#xff08;为什么是2.7而不是3&#xff1f; tornado 对2.7支持比较好&#xff0c;还有很多包也是支持2.7&#xff09; 1. 输入python 发现不存在 有python3 python3可以。装下python2 2. apt install python (默认python就是2.…

网站部署——文件系统

文件系统方式部署C#网站 一、右键web项目点击发布 发布方法选择文件系统&#xff0c;目标位置自定义。需要注意的是发布到该文件夹的只有包含在项目中的文件夹&#xff0c;如果有未包含在项目中的文件&#xff0c;需要手动复制到目标位置处&#xff08;bin和obj文件夹除外&…

Web网站服务

具体步骤&#xff1a;1&#xff0e;准备工作为了避免发生端口冲突、程序冲突等现象&#xff0c;建议将使用rpm方式安装的httpd及相关依赖包&#xff08;如果有的话&#xff09;卸载。如图所示&#xff1a;2&#xff0e;源码编译及安装插入安装光盘并挂载&#xff0c;进入到光盘…

js 导出pdf上传至oss_Hexo+Github Pages快速实现个人网站(拓展:域名绑定+Netlify自动部署+阿里云OSS)...

关键字&#xff1a;blog, hero, github, netlify, oss, 域名名人写博客是为了火&#xff0c;我们写博客是因为火。—— 那然1 前言为什么要搭博客呢&#xff1f;就像上面那句话&#xff0c;我搭博客就是因为它火&#xff0c;我身边的人都有自己的博客&#xff0c;并用博客记录分…

前端面试中经常问到的问题:如何提高网站性能 总结

1. 使用dns预解析 DNS 请求需要的带宽非常小&#xff0c;但是延迟却有点高&#xff0c;这点在手机网络上特别明显。预读取 DNS 能让延迟明显减少一些&#xff0c;例如用户点击链接时。在某些情况下&#xff0c;延迟能减少一秒钟。 在某些浏览器中这个预读取的行为将会与页面实际…

关于大型网站技术演进的思考(十八)--网站静态化处理—反向代理(10) 【架构师的想法:正向代理和反向代理的区别】

文章来源&#xff1a;http://www.cnblogs.com/sharpxiajun 架构师&#xff1a;夏天的森林 反向代理也是一种可以帮助实现网站静态化的重要技术&#xff0c;今天我就来讲讲反向代理这个主题。那么首先我们要了解下什么是反向代理。和反向代理相对应的是正向代理&#xff0c;正向…

js对cookie的操作,包括清除网站所有cookie

2019独角兽企业重金招聘Python工程师标准>>> function foreach() {var strCookiedocument.cookie;var arrCookiestrCookie.split("; ");for(var i0;i<arrCookie.length;i){var arrarrCookie[i].split("");if(arr.length>0)DelCookie(arr[…

如何拒绝搜索引擎收录自己的网站?

参考1&#xff1a;https://zhidao.baidu.com/question/543972314.html 参考2&#xff1a;https://jingyan.baidu.com/article/e8cdb32b45b3e837042bad7f.html 请复制以下两行代码&#xff1a; User-agent: * Disallow: / 把上面的两行代码保存为Robots.txt文件&#xff0c;放…

网站安全狗V3.2版 增加URL地址全检测功能 保护网站安全

文章来源&#xff1a;http://my.oschina.net/safedog/blog/260885 原 网站安全狗V3.2版 增加URL地址全检测功能 保护网站安全 发表于2年前(2014-05-05 18:15) 阅读&#xff08;134&#xff09; | 评论&#xff08;0&#xff09; 0人收藏此文章, 我要收藏赞012月12日北京OSC源…

python之web开发二:用Python+Django在Eclipse环境下开发web网站【第一个开发的小案例,按照文章可以成功开发web】

http://www.cnblogs.com/linjiqin/p/3595891.html 用PythonDjango在Eclipse环境下开发web网站 一、创建一个项目 如果这是你第一次使用Django&#xff0c;那么你必须进行一些初始设置。也就是通过自动生成代码来建立一个Django项目--一个Django项目的设置集&#xff0c;包含了…

服务器做jsp网站教程视频,linux jsp服务器 视频教程

linux jsp服务器 视频教程 内容精选换一换本节介绍如何构造REST API的请求&#xff0c;并以调用IAM服务的获取用户Token说明如何调用API&#xff0c;该API获取用户的Token&#xff0c;Token可以用于调用其他API时鉴权。您还可以通过这个视频教程了解如何构造请求调用API&#x…

用户评论与问答:对熊掌号SEO的影响!

在传统SEO中&#xff0c;我们经常强调用户体验度&#xff0c;包括&#xff1a;页面的活性与内容质量&#xff0c;它往往是高排名的一个典型代表&#xff0c;简单举例&#xff1a;①博客评论&#xff1a;提高页面更新频率&#xff0c;增强搜索引擎信任度。②问答页面&#xff1a…

Lambda架构与推荐在电商网站实践

Lambda架构与推荐在电商网站实践 2015-11-24 16:36| 发布者: 炼数成金_小数| 查看: 14636| 评论: 0|原作者: 王富平|来自: 高可用架构 摘要: 高可用架构分享及传播在架构领域具有典型意义的文章&#xff0c;本文根据王富平分享记录。转载请注明高可用架构公众号ArchNotes。王富…

网站常见问题1分钟定位 - 如何使用阿里云ARMS轻松重现用户浏览器问题...

客户投诉不断&#xff0c;本地却无法重现&#xff1f; 页面加载较慢是用户经常会反馈的问题&#xff0c;也是前端非常关注的问题之一。但定位、排查解决这类问题就通常会花费非常多的时间&#xff0c;主要原因如下&#xff1a; 页面是在用户端的浏览器上加载执行&#xff0c;复…