hexo next主题深度优化之加入pjax,实现局部刷新,让我们的博客上高速公路吧~~~~

版权声明:本文为作者原创,转载请注明出处,联系qq:32248827 https://blog.csdn.net/dataiyangu/article/details/84351467

特别声明:
看不懂没关系,往下读,因为我写的逻辑可能不是很清晰~
本人源码在github上实在不懂的 git clone自己扣一扣,github在博客中有连接
本人博客mmmmmm.me

背景:

我有强迫症,遇到好的东西就想给自己整上去,在这里想忠诚的奉劝大家一句,不要再搭建自己的博客了,这是一个无底洞,就跟打游戏一样,当你到达六十级之后,你发现版本更新了,顶级变成了八十级,而且,目前看来你自己只有三级,只是自己感觉自己是六十级~~~~ 就像我,这个东西我足足花了一周多,当然也有我经常加班的原因吧,好了不吐槽了~~

进入正题

pjax初体验–instantclick

首先本人加了一个不蒜子的群,看到有人说instantclick能够实现自己的博客实现不中断的播放(大家都知道博客一刷新,一换页,播放的歌曲插件肯定也会刷新,歌也就断了),看到这里是不是有感觉了~~,这个时候我就开始拼命的往里面加,大概花了两天放弃了,可是无奈中文文档也比较少,而且,bug巨多,最大的原因也是bug巨多,适配起来十分麻烦,比如多说评论系统等等。但是速度确实蛮快的,因为可以1鼠标放到标签上实现预加载2鼠标点下去的瞬间实现预加载,而且可以自己设定预加载的时间。(好像是这么回事,时间太久远了)
下面贴出我找到的几个教程,对于bug多这点不介意,喜欢钻研的同学可以看看:
https://www.ihewro.com/archives/515/
https://qqdie.com/archives/instantclick.html
https://www.jianshu.com/p/c306360e4270
https://www.songhaifeng.com/razt/32.html
好了就先这么多,google上也有好多,赶紧让我们进入正题吧~

真正的pjax

官方介绍:pushState + ajax = pjax 带来最直观的效果是整个网站变成单页应用。这样的效果将会极大的提升用户体验,并且可以减少https的请求的次数和内容。使用github上面的一个开源项目defunkt/jquery-pjax 可以很轻松的帮助我们实现pjax。

这样可以实现,刷新的时候只加载局部的html和css js 大大加快速度。
真诚提醒:如果对前端一点点基础都没有的话,要不就放弃吧。

第一步

找到theme->next->layout->_layout.swig文件
在开头加入以下代码:

<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/jquery.pjax/2.0.1/jquery.pjax.min.js"></script>
<script src="/js/src/pjax/pjaxBase.js"></script>

解释一下:前两行是引入jq文件和pjax的js文件,jq文件必须在pjax文件前面引入,第三行是引入我自己的文件,这个文件是我自己diy的目录如图。在第二行下面中间加入内容是一样的效果。

第二步

还是在这个文件中在底部加入

{# 在这里依次加载pjax需要的js文件 #}//swig文件中的注释是这样子的
<script type="text/javascript"   src="/js/src/pjax/category_js.js" ></script>
<script type="text/javascript"   src="/js/src/pjax/opacity_js.js" ></script>
<script type="text/javascript"   src="/js/src/pjax/motion_js.js" ></script>
<script type="text/javascript"   src="/js/src/pjax/velocity.ui_js.js" ></script>
<script type="text/javascript"   src="/js/src/pjax/velocity_js.js" ></script>
<script type="text/javascript"   src="/js/src/pjax/bootstrap_js.js" ></script>
<script type="text/javascript"   src="/js/src/pjax/scrollspy_js.js" ></script>
<script type="text/javascript"   src="/js/src/pjax/utils_js.js" ></script>
<script type="text/javascript"   src="/js/src/pjax/post-details_js.js" ></script>

注意这里的文件是有顺序的,具体的我会在下文详细讲述。

第三步

第二步中的这些文件都是我自己加入的,原因是因为(划重点了!!!)
在pjax中是局部刷新的也就是局部加载的,而以上的文件,next主题中本身是没有的,原来的文件名称没有我的_js后缀,在目录next->source->js->src下面,
源文件大部分都是 ( d o c u m e n t ) . r e a d y ( ) d o m j s W i n d o w . o n l o a d j s / j s / s r c / p j a x / b o o t s t r a p j s . j s (document).ready()的,这个函数,大家可以上网好好查查,是加载完整个dom结构后进行加载的,当然了和js中的Window.onload是不一样的,后者是在图片等全部加载完之后才会加载js,好了不闲扯了,注意将这些文件复制到我上面的目录下并且重命名例如:/js/src/pjax/bootstrap_js.js然后将所有的文件都把 (document).ready()去掉,然后用function xxx包住,这样就可以外部调用了,我会在下面讲到,很有用哦。

为什么这么麻烦,因为next的js是相互调用的,本人比较懒,实在没有时间阅读全部的源码。

目录:

第四步

在这里插入图片描述

第四步

如上面的目录,我单独还建了一个/js/src/pjax/pjaxBase.js,你可能就懂了第一步了。这个js是pjax的核心,下面贴出源码:

$(document).pjax('a[target!=_blank]', '#main', {
  fragment: '#main',
  timeout: 5000,
});

$(document).on('pjax:complete',
  function() {
// 分类的js
    category_js();
// 局部刷新后文章内容不显示bug的js
    opacity_js()
    // 点击有目录的文章sidebar不显示的bug解决
    motion_js()
    velocity_js()
    velocityui_js()
    // bootstrap_js()
    scrollspyyyyyyy()
    utils_js()
    postdetails_js()
    // 来必力评论系统js
    $.getScript("https://cdn-city.livere.com/js/embed.dist.js")
//下面的js是调用别的文件是我之前试的一种方法,屏蔽了
    // $.getScript("/js/src/category.js")
    // 这段是针对于muse还是mist主题来着,点击有目录的文章,右面的sidebar会自动浮出来的js,这个是核心。
    var $tocContent = $('.post-toc-content');
    var isSidebarCouldDisplay = CONFIG.sidebar.display === 'post' ||
      CONFIG.sidebar.display === 'always';
    var hasTOC = $tocContent.length > 0 && $tocContent.html().trim().length > 0;
    if (isSidebarCouldDisplay && hasTOC) {
      NexT.utils.displaySidebar();
    }


  })

解释一下:
$(document).pjax(‘a[target!=_blank]’ ‘#main’, {
fragment: ‘#main’,
timeout: 5000,
});
这个函数是pjax的核心,
'a[target!=_blank]'是你将会点击的标签[target!=_blank],是当你的标签是blank的时候就是需要点击出现一个新的窗口,比如友链之类的,这个时候就不进行局部加载了,没有类似a标签的可以省略。
‘#main’是你将会刷新的地方
fragment: ‘#main’,是把那个地方的代码刷新然后放到’#main’中
timeout,懂js得都懂就不解释了。

$(document).on(‘pjax:complete’,
function() {}
划重点了:这个函数是在局部加载完之后自己需要diy的js,因为pjax是局部加载我已经强调了很多遍了,这个时候有的js会失效比如说评论功能。
这个时候引入我们之前定义好的函数。完成!

贴几个对我很有帮助的博文和hexo next的博客和一个github,实在不懂得可以扒一扒别人的github源码,有很大的帮助。
https://www.ihewro.com/archives/354/comment-page-3#comments
https://www.jimoe.cn/archives/typecho-add-pjax.html
http://yelog.org/2017/02/08/pjax/
https://www.jianshu.com/p/808a647dc324
https://blog.dyboy.cn/
https://blog.flysay.com/
https://github.com/DIYgod/hexo-theme-sagiri
http://www.qingpingshan.com/m/view.php?aid=355579
https://diygod.me/
中间有个小技巧:chrom的审查元素里面的内容是可以移动和删除的,更利于我们的检查。

猜你喜欢

转载自blog.csdn.net/dataiyangu/article/details/84351467