首页 > 其他分享 >尝试改造Hexo主题以兼容Pjax

尝试改造Hexo主题以兼容Pjax

时间:2023-01-28 17:01:50浏览次数:37  
标签:Hexo pjax script 兼容 Pjax href 重载 页面

先说结果,暂时没有改造成功。原因是发现 ​​Pjax​​ 其实非常依赖布局的一致性。而目前自己名为 Gacman 的主题,本质是脱胎于老版本的 Pacman ,各个页面结构差别较大,而 ​​Pjax​​ 在检测到布局差别大的页面时,会自动重新拉取页面,从而失去了局部刷新的特性。

尝试改造Hexo主题以兼容Pjax_局部刷新

什么是 Pjax

​Pjax​​​ 通过ajax从服务器获取HTML,然后用加载的HTML替换页面上容器元素的内容。然后,它使用pushState更新浏览器中的当前URL。即 ​​pjax = pushState + ajax​​ 。

它最大的优势在于,可以在网站本身无刷新的情况下,局部刷新内容,同时在现代浏览器中支持前进和后退,由于局部加载的数据量极小,加载速度极快,因此可以最大程度的提升用户体验。

它的天生劣势在于,默认配置对 ​​SEO​​ 并不友好,需要大量改造来优化。

最早的时候,​​Pjax​​​ 是一个基于 ​​jQuery​​ 的插件,后来推出了完全独立的版本,适应更广泛的应用场景。

为 Hexo 引入 Pjax

很多较早使用 ​​Pjax​​ 的 Hexo 主题,都使用了基于 jQuery 的版本。由于我是新引入,所以使用了最新的独立版本的 ​​Pjax​​ ( https://github.com/MoOx/pjax )。

<script src="https://cdn.jsdelivr.net/npm/pjax@VERSION/pjax.min.js"></script>

为什么要引入 Pjax

其实原因超简单,因为最近迷上了 精神氮泵 ,也是晚上肝代码肝图的有效工具。于是在网易云音乐做了个专辑,想放到博客里。

但是如果不进行改造,跳转页面肯定会引起播放器中断,于是就想到了利用 ​​Pjax​​ 的特性,局部加载核心内容,而不影响播放器。

兼容处理

查了不少资料,整体是参考 Volantis6 主题 Pjax 版的开发文档。

首先独立版的 Pjax 工作方式其实特别好理解。例如初始化:

document.addEventListener('DOMContentLoaded', function () {
pjax = new Pjax({
elements: 'a[href]:not([href^="#"]):not([href="javascript:void(0)"]):not([pjax-fancybox]):not([notallow="return false;"]):not([notallow="return!1"]):not([target="_blank"]):not([target="view_window"]):not([href$=".xml"])', // 丁仪
selectors: [
"head title", // 标题
"head meta[name=keywords]", // 关键词
"head meta[name=description]", // 描述
".pjax",
"pjax", // <pjax></pjax> 标签
"script[data-pjax], .pjax-reload script" // script标签添加data-pjax 或 script标签外层添加.pjax-reload 的script代码段重载
],
cacheBust: <%= theme.plugins.pjax.cacheBust %>, // url 地址追加时间戳,用以避免浏览器缓存
timeout: <%= theme.plugins.pjax.timeout %>,
});
});

然后是标签部分,当然,在我主题中是轻量使用 ​​Pjax​​,所以主要是用在以下场景:

<div class="pjax">我是将被pjax重载的内容</div>
<script data-pjax>我是将被pjax重载的内容</script>
<div class="pjax-reload">
<div>
<div>我不是将被pjax重载的内容</div>
<script>我是将被pjax重载的内容</script>
</div>
</div>

问题

看上去都很顺畅,但是后来实际测试问题非常多。

调整

我为了模块化管理,把一些脚本都放到各个模块的 ejs 中了,这就造成管理重载内容非常麻烦,需要每个地方单独改,否则就需要整理到一个地方统一处理。总之都很麻烦。

然而我还是耐着性子花了几乎一个通宵处理好了所有模板(除了评论外)。

布局

这个是最严重的问题,独立版的 ​​Pjax​​ 会自动检测布局变化,如果变化过大,则会重载整个页面。

实际测试就发现非常容易触发重载,尤其是 ​​page​​​ 和 ​​post​​ ,因为这两个部分原本的处理就完全不同。测试了一下,如果完全相同,则不会触发重载。

所以,最终由于这个原因,我给 ​​Pjax​​ 版的博客打了个分支,还是继续使用老版的主题了。

[2023年01月27日原始发布于本作者博客]

标签:Hexo,pjax,script,兼容,Pjax,href,重载,页面
From: https://blog.51cto.com/u_3568871/6024995

相关文章

  • Hexo 修改默认文章路径
    更多技术文章,请关注我的个人博客www.immaxfang.com。修改文章默认url在hexo中新建的文章,默认的url路径是年/月/日/标题这样的格式,这其实是不利于SEO的。可......
  • 安装Hexo
    Hexo+Github搭建个人网站前言在下载Hexo之前,明确Hexo的搭建过程:1.安装Hexo2.配置Hexo主题并配置网站信息3.创建Github个人仓库并配置hexo关于Github的配置4.发布文......
  • Unity使用VS2019打开代码出现不兼容的解决方法
     目录问题解决附:VS如何更换主题颜色 问题当将外部unitypackage导入Unity编辑器后,使用VS2019打开代码时,出现了如下图所示情况:解决VS安装如下环境:安装完......
  • 下拉列表选择项的选中在不同浏览器中的兼容性问题
    使用jquery做了一个项目,下拉列表选择项变化时,获取选中项的文本。我按如下方式写了:$("#rd").change(function(){$("#name").val($("#rd").find("opti......
  • [兼容问题]关于页面适配的整理
    先进行分类。有空填坑。 1.pc长页面,h5长页面,根据浏览器宽度适配。考虑:fixed属性的页面头部、弹窗,可能需要才用.container.top .pup三部分分别进行适配。(参考wh春......
  • VMware Workstation与Credential Guard不兼容。在禁用 Device/Credential Guard后,可以
    出现问题的原因:原因一、出现此问题的原因是DeviceGuard或CredentialGuard与Workstation不兼容。原因二、Windows系统的Hyper-V不兼容导致。解决方案:1、“win+R“打开运行......
  • Node Sass7.0.1版本与^4.0.0不兼容:解决
    今天碰到了个很麻瓜的问题我的node是16的里面的NodeSass7.0.1版本比较高跑老项目不兼容,卸载重装,但是安装NodeSass4.0.0失败,奇怪了还好找到一个文章上d1.npmuninstall......
  • vue-cli/webpack4.x 打包--兼容IE等低版本浏览器
    依赖版本  "babel-polyfill":"^6.26.0",  "core-js":"3.21.1",  "regenerator-runtime":"0.13.5",main.js引入vue.config.js配置 transpileDe......
  • 安装部署hexo博客(Windows)
    简介Hexo是一款基于Node.js的静态博客框架,快速、简洁、高效,使用Markdown(或其他渲染引擎)解析文章。安装安装node.js官网下载,一路next,就安装完成。然后打开cmd,用node-......
  • Vue.js框架:引入Element-ui和国际化i18n组件冲突及兼容问题处理
    一、问题如下要使用element-ui的表格时,在main.js中同时全局引入了element和i18n时,页面会报错如下:Errorinrender: TypeError:Cannotreadpropertiesofund......