gridea对于搜索的改动

简介

写博客这么长时间了, 突然发现生成后的文件越来越大, 本博客使用的是 Gridea | 一个静态博客写作客户端 生成静态文件, 使用的香港虚拟云空间, 省却备案, 我们就开始找问题,发现是由于 Gridea搜索 会把所有的文章放入到页面中, 从而导致页面非常的庞大

不想折腾的可以直接在下面的下载修改后的模板文件, 解压就能使用(文章要看下, 有需要手动处理的search.html)

查找问题

对于一个后端, 对前端不怎么熟悉的人来说, 这可就有点难了。

查看源码

由于用的是next模板, 这边直接看next的模板文件了

点击搜索, 我们发现是id为fa_search的元素, 我们查看其触发方法为foot.ejs文件中的

  let faSearch = document.querySelector('#fa_search');
  faSearch.addEventListener('click', function () {
    document.querySelector('#search_mask').style = ''
  })

就是让id为search_mask 的style设置为空

我们再去查看search_mask 是什么东西?

我们在search.ejs中查看, search_mask原来就点击后出现的搜索框,然后作者应该是通过js来实现搜索的功能。

考虑解决方案

考虑了好多方法, 由于我们的是静态博客, 不可能使用后端服务提供搜索, 并且由于不太懂前端, 最好能使用原来的代码去实现

我们就像能否让这么一大堆的内容不生成在文件中,而是一个独立的文件, 每次搜索的时候, 再去加载此文件。

解决

搜索内容

生成独立的内容, 这一点有点尴尬, 没有找到特别好的方案, 我们只能先打开站内搜索, 生成页面, 手动把生成的内容拿下来, 再关掉站内搜索, 将手动处理的内容保存为search.html

按钮开关位置: 主题-自定义-特征

image-20210923171352200

处理方法: 直接复制带有站内搜索的index.html文件,修改为search.html(放在另外一个目录中, 否者Gridea重新生成文件的时候会删掉), 保留 id为search_mask, 以及处理搜索的一大端js, 其他的全部删掉。

从外部加载

修改foot.ejs, 我们需要在点击搜索框的时候去加载上面处理过的search.html文件

let faSearch = document.querySelector('#fa_search');
  faSearch.addEventListener('click', function () {
  
	var httpRequest = new XMLHttpRequest();//第一步:建立所需的对象
	httpRequest.open('GET', '/search.html', true);//第二步:打开连接  将请求参数写在url中  ps:"./Ptest.php?name=test&nameone=testone"
	httpRequest.send();//第三步:发送请求  将请求参数写在URL中
	/**
	 * 获取数据后的处理程序
	 */
	httpRequest.onreadystatechange = function () {
		if (httpRequest.readyState == 4 && httpRequest.status == 200) {
			var json = httpRequest.responseText;//获取到json字符串,还需解析
			document.getElementById("search_incloud").innerHTML = json;
			
		   // https://www.iteye.com/blog/blogzhoubo-1716769  innerHtml加载进来的js不会执行
		   var myDivScript = document.getElementById("search_script");
		   var newScript = document.createElement("SCRIPT");
		   newScript.innerHTML = myDivScript.innerHTML;
		   document.getElementsByTagName("HEAD").item(0).appendChild(newScript);  
			
			 document.querySelector('#search_mask').style = ''
		}
	};
  })

保留搜索入口

保留搜索入口, 关闭一大段搜索文件的生成。

header.ejs中 在判断中加个!, 标识当在设置中关闭搜索的时候反而会生成此元素

<% if (!site.customConfig.enableSearch) { %>
    <li id="fa_search" class="nav-item">
        <a href="javascript:void(0);">
       		<i class="fa fa-search"></i> <span class="language" data-lan="search">搜索</span>
        </a>
    </li>
<% } %>

after-body.ejs中, 修改如下代码,加入了div#search_incloud

<div id="search_incloud">
<% if (site.customConfig.enableSearch) { %>
<%- include('./search') %>
<% } %>
</div>

总结

优点: 这样改动之后, 文件大大减小之前一篇文章在600KB大小, 当前67篇文章,大概使用了60多M的空间, 优化后单个文件40Kb,只用了6M的空间。

弊端:

  1. 空间是节省了,不过由于search.html大小依然是600kb(这个没法省), 导致如果网络不佳的情况下, 加载比较慢,搜索元素点击后, 要过好久才能出搜索弹框。

  2. 每次修改,都要手动生成search.html文件

saerch.html处理方法, 防止不看文章的:

**处理方法: 直接复制带有站内搜索的index.html文件,修改为search.html(放在另外一个目录中, 否者Gridea重新生成文件的时候会删掉), 保留 id为search_mask, 以及处理搜索的一大端js, 其他的全部删掉。

文件大概内容查看 search.html, 浏览器右键源代码

更新-2021年10月8日

由于之前的修改有bug, 得到的搜索结果中分页有问题, , 我们进行再次修改, 问题好像是源码的???

  • 更新1:

foot.ejs 我们需要判断search.html是否已经加载过了, 如果已经加载, 我们就不再加载。

  • 更新2:

添加 , 便于定位删除地方

  • 更新3:

修复分页加载错误的问题

详细debug了源码, 发现search.ejs中appendResults方法有点问题, index就是分页的页码, 当index=2 时, 会拿出2~12的内容。

    function appendResults(index) {
      let htmlResult = '';
      let start = index || 0;
      let end = Math.min(start + pageSize, finds.length);
      ...

修改之后的模板压缩包下载 next-修改包