前言 接 搭建自己的Hexo博客(2) 这篇文章,时隔一段时间,我对自己的博客陆陆续续又进行了部分优化,特地总结了下。
正文 图片存储问题 原来blog的图片也随静态页面托管在Github Pages 上的,后来页面访问加载速度很慢,而且图片本来较大,上传至Github上也是比较费劲的。
就考虑到将其存储到OSS服务上,由于我的域名没有经过网络备案,因此无法开启CDN服务,开启CDN服务后可以进一步提高图片加载速度。
我的域名在阿里云申请的,进而选择了阿里云的OSS服务。
PS:当然,对于阿里云,CDN服务和OSS服务都是要收取一定费用的。
我们登陆阿里云,选择对象存储OSS服务,如未开通请选择开通,而后新建一个我们blog的Bucket,找到文件管理选项,选择上传文件,上传我们的blog图片,上传成功后,可以通过复制图片URL的方式拿到图片地址,将博文中的图片地址指向此路径即可。
因为上传到OSS图片并在blog中使用后,图片的地址会被暴露在网页上,为了防止图片地址被盗用,我们可以设置只允许我们的域名可以访问图片,以进一步确保安全,如下:
添加相册功能 我们为blog添加相册功能,进一步美化blog。
我们可以为相册增加一个标签,如图所示,点击进入到相册页面。
在 next 主题的config文件里添加相册(photos)标签,如下:
1 2 3 4 5 6 7 8 9 10 11 menu: home: / || home about: /about/ || user tags: /tags/ || tags categories: /categories/ || th archives: /archives/ || archive support: /support/ || support photos: /photos/ || photo
PS: 如果不显示中文(相册),只显示photos,需要在next主题里的languages/zh-Hans.yml 里配置 photos: 相册
。
添加完标签后,回到hexo的source文件夹,在里面新建photos文件夹,并在该文件夹里新建index.md 文件,内容如下:
1 2 3 4 5 6 7 title: 相册 comments: false type: photos noDate: true --- <div class ="ImageGrid" > </div >
ImageGrid的div即用来存放相册的一个div。
我们在博客的根目录下新建photosTool.js,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 "use strict" ;const fs = require ("fs" );const sizeOf = require ('image-size' );const path = "source/images_backup/photos" ;const output = "source/photos/photos.json" ;var dimensions;fs.readdir(path, function (err, files ) { if (err) { return ; } let arr = []; (function iterator (index ) { if (index == files.length) { fs.writeFile(output, JSON .stringify(arr, null , "\t" )); return ; } fs.stat(path + "/" + files[index], function (err, stats ) { if (!files[index].endsWith(".jpg" ) || files[index].endsWith(".jpeg" )) { } if (err) { return ; } if (stats.isFile()) { if (files[index].endsWith(".jpg" ) || files[index].endsWith(".jpeg" ) || files[index].endsWith(".mp4" ) || files[index].endsWith(".png" ) || files[index].endsWith(".gif" )) { dimensions = sizeOf(path + "/" + files[index]); console .log(dimensions.width, dimensions.height); arr.push(dimensions.width + '.' + dimensions.height + ' ' + files[index]); } } iterator(index + 1 ); }) }(0 )); });
这个js用于获取图片的长和宽,以便可以获得更好的展示效果,同时,她会生成一个photos.json的文件,里面保存这图片的长和宽,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [ photo-1 -1. jpg, "3200.2000 photo-10.jpg" , "1920.1200 photo-11.jpg" , "1920.1080 photo-12.jpg" , "1920.1200 photo-13.jpg" , "1920.1080 photo-14.jpg" , "1920.1080 photo-15.jpg" , "1920.1200 photo-16.jpg" , "1920.1080 photo-17.jpg" , "1920.1186 photo-18.jpg" , "1920.1080 photo-19.jpg" , "1024.610 photo-2.jpg" , "2200.1400 photo-3.jpg" , "1200.750 photo-4.jpg" , "3500.1898 photo-5.jpg" , "1080.1920 photo-6.jpg" , "1600.1120 photo-7.jpg" , "1728.1080 photo-8.jpg" , "1920.1080 photo-9.jpg" ]
这个文件我生成在了photos文件夹下。
可以看到它们的图片是从source/images_backup/photos
路径下获取的。
为提高相应速度,需要将这些图片放到阿里云OSS上,存放到上面后,我们需要一个photos.js来解析图片并展示。
找到themes/next/source/js/src
文件夹,新建photos.js文件,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 photo = { page : 1 , offset : 20 , init : function ( ) { var that = this ; $.getJSON("/photos/photos.json" , function (data ) { that.render(that.page, data); }); }, render : function (page, data ) { var begin = (page - 1 ) * this .offset; var end = page * this .offset; if (begin >= data.length) return ; var html, imgNameWithPattern, imgName, imageSize, imageX, imageY, li = "" ; for (var i = begin; i < end && i < data.length; i++) { imgNameWithPattern = data[i].split(' ' )[1 ]; imgName = imgNameWithPattern.split('.' )[0 ] imageSize = data[i].split(' ' )[0 ]; imageX = imageSize.split('.' )[0 ]; imageY = imageSize.split('.' )[1 ]; li += '<div class="card" style="width:330px">' + '<div class="ImageInCard" style="height:' + 330 * imageY / imageX + 'px">' + '<a data-fancybox="gallery" href="http://sakuratears.oss-cn-beijing.aliyuncs.com/blog/photos/' + imgNameWithPattern + '?raw=true" data-caption="' + imgName + '">' + '<img src="http://sakuratears.oss-cn-beijing.aliyuncs.com/blog/photos/' + imgNameWithPattern + '?raw=true"/>' + '</a>' + '</div>' + '</div>' } $(".ImageGrid" ).append(li); $(".ImageGrid" ).lazyload(); this .minigrid(); }, minigrid : function ( ) { var grid = new Minigrid({ container : '.ImageGrid' , item : '.card' , gutter : 12 }); grid.mount(); $(window ).resize(function ( ) { grid.mount(); }); } } photo.init();
可以看到,我们主要是解析原来生成的photos.json文件,获得长和宽,并将其放到card框里,同时图片是通过OSS获取的。
要使该js生效,需要被引用并加载,打开themes/next/layout/_scripts/commons.swig
文件,添加photos.js的引用,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 {% if page.type ==='photos' %} {% set js_commons = [ 'src/utils.js', 'src/motion.js', 'src/minigrid.min.js', 'src/photos.js' ] %} {% else %} {% set js_commons = [ 'src/utils.js', 'src/motion.js' ] %} {% endif %} {% for common in js_commons %} <script type="text/javascript" src="{{ url_for(theme.js) }}/{{ common }}?v={{ theme.version }}"></script> {% endfor %}
PS:一些自己想实现的其它功能,如果有新的js文件,也可以做如下的添加方式,另使photos.js生效不仅仅只可以添加到这儿,也可以通过其它的地方引入,考虑到以后维护的方便,我们可以统一添加到了这里。
可以为相册相框添加缩放效果及一些其它效果,我的相框的css样式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 //图片鼠标靠近放大效果 .fancybox img { display : block; border : 0 ; width : 100% ; transform : scale (1 ); transition : all 1s ease 0s ; -webkit-transform : scale (1 ); -webkit-transform : all 1s ease 0s ; } .fancybox :hover img { transform : scale (1.1 ); transition : all 1s ease 0s ; -webkit-transform : scale (1.1 ); -webkit-transform : all 1s ease 0s ; } .ImageGrid { width : 100% ; max-width : 1040px ; margin : 0 auto; text-align : center; } .card { overflow : hidden; transition : .3s ease-in-out; border-radius : 8px ; background-color : #ddd ; } .ImageInCard img { padding : 0 0 0 0 ; } .TextInCard { line-height : 54px ; background-color : #ffffff ; font-size : 24px ; }
这个css内容我们添加到themes/next/source/css/_custom/custom.styl
文件夹里。
最终效果如下:
SEO 相关优化 这一块的优化还是蛮多的,我挑几个比较重要的说下。
我们知道,我们的blog有了域名后,相当于发布在了外网,为了提高blog阅读量,需要对blog或者其它方面做些工作,这都可以称谓博客的SEO优化。
编写质量高的原创博文 这一条基本不用多说,好的文章从不缺少流量。关键在于作者提高自身的写作水平。
更改博文生成结构 使用hexo生成博文时,博文的生成方式(permalink)为blog/:title:year:month:day/
这种格式,这种是不便于搜索的,因为相当于四级目录,我们可以改为blog/:title.html
这种格式。
在hexo 的 config.yml文件里进行修改,并重新运行命令生成博文。
1 2 3 4 url: https://www.sakuratears.top root: / permalink: blog/:title.html permalink_defaults:
禁止外链 我们在写作博文时,有可能引用到其它博文的文章,会有指向其它博文的链接,这样是不便于SEO的,我们又不能去掉该外链而影响到博文功能。因此我们可以引入 hexo-autonofollow
插件,在package.json文件里配置并安装该插件后,在hexo的config.yml文件里添加如下配置。
1 2 3 4 5 nofollow: enable: true exclude: - ‘https://www.sakuratears.top’
可以使网页爬虫更好的获取我们的页面数据,提高SEO。
人为发布博客外链 这个就比较简单了,我们可以在一些平台等地方发布我们的博客地址,提高曝光度,提高SEO。
使百度、谷歌、必应等网站收录你的网站 这项是一项漫长而又复杂的过程,但也是效果最明显的一个。
我们如果有百度账号的话,可以登陆百度站长平台,将我们的站点添加百度收录。
如果网站已备案,添加备案号可以加快收录速度。
我们可以在链接提交-自动提交-sitemap里添加我们网站的sitemap.xml并提交,以加快百度对我们网站的收录。
同时在自动推送里,我们看到我们可以使用js进行自动推送,由于hexo已经集成了该功能,我们简单设置下就行。
1 2 3 4 5 6 7 8 9 10 11 12 13 canonical: true seo: true baidu_push: true
可以看到hexo里面集成的baidu_push.swig
内容和百度提供的js是一样的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 {% if theme.baidu_push %} <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> {% endif %}
我们可以使用手动抓取功能对我们的网站进行抓取,如下效果图。
PS:由于网络等一些原因,有可能抓取失败。
弄好后,过一段时间,可以看到数据的变化。
我们可以通过 site:www.sakuratears.top
来检查百度是否收录了我们的网站,如图。
PS:我在bing上进行测试,发现必应收录的比百度要快。
后来查询了解得知Github屏蔽掉了百度爬虫,所以一些blog作者在国内托管到Coding或者Gitee上,在国外托管到GitHub上,以加快博客访问速度,提高SEO优化。
有关这一块内容,我准备后面在处理。
结语 今天差不多就这些了,关于博客的一些其它优化内容我会在整理一下。
一些其它的想法:
原来blog的音乐播放器直接使用的网易云的,但是我们公司居然把网易云墙了,而且考虑到歌曲以后可能放在那边会404等情况,下阶段优化考虑使用Hexo的aplayer去处理,并将音乐放到OSS存储上。
关于托管到Coding或者Gitee上的问题,也要研究下。
每次看博客是都会出现live2D妹子,可能并不是所有人都喜欢,也有时候觉得碍事,可能考虑新增一个关闭按钮,可以主动开启或关闭live2D妹子。
部分页面需要美化下,SEO的部分还要看看有没有需要总结的,毕竟SEO优化是条漫长的道路。
以上。