文章页顶部广告

优化Typecho的思路

185 次浏览
11 评论

共计4756个字符,预计需要花费 6分钟才能阅读完成。

AI摘要:文章介绍了优化Typecho博客性能的多种方法:1)服务器端使用Nginx开启gzip压缩和浏览器缓存;2)图片优化采用原生JS实现懒加载;3)通过PHP压缩HTML输出;4)设置浏览器缓存和页面缓存策略,包括简单的PHP缓存实现。这些技术可显著提升网站加载速度和性能。

服务器端

使用Nginx作为web服务端可以使用以下开启

# 启用 gzip 压缩
gzip on;
gzip_comp_level 5;
gzip_min_length 256;
gzip_proxied any;
gzip_types
  application/javascript
  application/json
  application/xml
  text/css
  text/plain
  text/xml;

# 浏览器缓存控制
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
}

图片优化

使用原生js实现懒加载

document.addEventListener('DOMContentLoaded', function() {
    // 获取所有图片(如果主题默认输出 src,可以动态替换为 data-src)
    const images = document.querySelectorAll('img[src]:not([data-src])');
    
    // 防止重复处理
    images.forEach(img => {
        if (!img.getAttribute('data-src')) {
            img.setAttribute('data-src', img.src); // 把 src 存到 data-src
            img.removeAttribute('src'); // 移除 src,避免立即加载
        }
    });

    // 懒加载逻辑
    const lazyLoad = (targets) => {
        if ('IntersectionObserver' in window) {
            const observer = new IntersectionObserver((entries) => {
                entries.forEach(entry => {
                    if (entry.isIntersecting) {
                        const img = entry.target;
                        img.src = img.dataset.src;
                        observer.unobserve(img); // 加载后停止观察
                    }
                });
            });
            targets.forEach(img => observer.observe(img));
        } else {
            // 兼容旧浏览器(滚动监听)
            const checkImages = () => {
                targets.forEach(img => {
                    const rect = img.getBoundingClientRect();
                    if (rect.top < window.innerHeight + 100) { // 提前 100px 加载
                        img.src = img.dataset.src;
                    }
                });
            };
            window.addEventListener('scroll', checkImages);
            checkImages(); // 初始检查
        }
    };

    // 对所有 data-src 图片应用懒加载
    lazyLoad(document.querySelectorAll('img[data-src]'));
});

资源合并与压缩

压缩HTML输出

// 在主题的 functions.php 中
function compress_html($html) {
    $placeholders = [];
    $i = 0;

    // 匹配 <pre> 和 <code> 区块,替换为唯一占位符
    $html = preg_replace_callback(
        '/<(pre|code)[^>]*>.*?<\/\1>/is',
        function ($matches) use (&$placeholders, &$i) {
            $key = "###HTML_COMPRESS_IGNORE_" . $i . "###";
            $placeholders[$key] = $matches[0];
            $i++;
            return $key;
        },
        $html
    );

    // 正常压缩
    $search = array(
        '/\>[^\S ]+/s',
        '/[^\S ]+\</s',
        '/(\s)+/s'
    );
    $replace = array(
        '>',
        '<',
        '\\1'
    );
    $html = preg_replace($search, $replace, $html);

    // 恢复占位符
    if (!empty($placeholders)) {
        $html = str_replace(array_keys($placeholders), array_values($placeholders), $html);
    }

    return $html;
}
//在head.php中开启
<?php ob_start("compress_html"); ?>
//在footer.php中结束
<?php ob_end_flush(); ?>

缓存策略

浏览器缓存

<meta http-equiv="Cache-Control" content="max-age=86400" />

header.php中加入

页面缓存

在主题的 functions.php 中添加简单的页面缓存

function page_cache() {
    // 不缓存后台、登录页和提交操作
    if (defined('__TYPECHO_ADMIN__') || $_SERVER['REQUEST_METHOD'] != 'GET') {
        return;
    }
    
    $cache_dir = __TYPECHO_ROOT_DIR__ . '/cache';
    if (!is_dir($cache_dir)) {
        mkdir($cache_dir, 0755, true);
    }
    
    $url_hash = md5($_SERVER['REQUEST_URI']);
    $cache_file = $cache_dir . '/' . $url_hash . '.html';
    
    // 缓存过期时间(秒)
    $cache_time = 3600; // 1小时
    
    // 如果缓存文件存在且未过期,则直接输出
    if (file_exists($cache_file) && (time() - filemtime($cache_file) < $cache_time)) {
        echo file_get_contents($cache_file);
        exit;
    }
    
    // 否则开始输出缓冲
    ob_start();
}

function save_cache() {
    // 同样跳过后台等页面
    if (defined('__TYPECHO_ADMIN__') || $_SERVER['REQUEST_METHOD'] != 'GET') {
        return;
    }
    
    $cache_dir = __TYPECHO_ROOT_DIR__ . '/cache';
    $url_hash = md5($_SERVER['REQUEST_URI']);
    $cache_file = $cache_dir . '/' . $url_hash . '.html';
    
    // 保存缓冲内容到文件
    $content = ob_get_contents();
    file_put_contents($cache_file, $content);
}
// 在页面开始处调用
page_cache();
// 在页面结束前调用
register_shutdown_function('save_cache');

Impact-Site-Verification: 52b4ec5d-e5be-481e-ad19-28bba5ed5c58

正文完
 0
评论(11 条评论)
  1. 大大的小蜗牛 初识 LV.2
    2025-06-11 23:45:43 回复

    用了快 10 年的 Typecho,还是有感情的。

      Windows   Chrome  中国香港
    1. 老孙 博主
      2025-06-14 14:01:55 回复
      @大大的小蜗牛

      我也差不多 最早是bo-blog 后来 wordpress 然后 就在typecho 和 wordpress 之间来回摇摆.

      现在有了gpt 就不再考虑wordpress了

        Windows   Chrome  摩尔多瓦
  2. 绪风 初识 LV.2
    2025-06-11 20:57:31 回复

    感觉可以封装成一个插件

      Windows   Chrome  中国广东省广州市电信
  3. 全局变量 初见 LV.1
    2025-06-11 07:55:18 回复

    使用前端纯js来处理懒加载我之前写过,就是那个获得所有img src赋值data-src ,大部分时候页面src已经开始加载了js写在页顶部也会存在延时解释,就会让浏览者看到图片加载了部分然后一闪被清空。 我现在使用的办法是后端文章输出时使用正则表达式将所有图片的src赋值到data-src。很久以前写的,或许现在前端已经有更好的方法了

      iOS   Safari  中国湖南省长沙市联通
    1. 老孙 博主
      2025-06-11 09:32:02 回复
      @全局变量

      后端实现也很合理

        Windows   Chrome  摩尔多瓦
  4. 星语 初见 LV.1
    2025-06-09 17:01:23 回复

    优化思路不错,回头我试试👍

      Windows   Chrome  伊朗
    1. 老孙 博主
      2025-06-10 16:49:14 回复
      @星语

      欢迎反馈

        Windows   Chrome  美国加利福尼亚
  5. 彼岸临窗 初识 LV.2
    2025-06-04 09:22:12 回复

    有空把我的友链地址更新一下,现在更新为顶级域名:oneblog.net

      Windows   Chrome  中国香港电讯盈科
    1. 老孙 博主
      2025-06-04 09:27:01 回复
      @彼岸临窗

      已经更新啦

        Windows   Chrome  美国加利福尼亚
  6. acevs 熟识 LV.4
    2025-05-31 13:23:26 回复

    优化后速度快了少大概?

      Windows   Chrome  IPv6
    1. 老孙 博主
      2025-05-31 22:55:10 回复
      @acevs

      快了一丢丢吧。聊胜于无。

        iOS   Safari  中国北京北京市广电
联系我们

版权说明

版权所有 转载请注明出处

SiteMap| RSS|

© 2025 老孙博客
 Theme by Puock  Powered by Typecho

老孙博客制作