docs: 清理Ying主题冗余文档
- 删除20个优化相关文档 - 已整理到 docs/性能优化文档/ 文件夹 - 保留 README.md 和 archetypes/post.md
This commit is contained in:
1 parent
6ed707704f
commit
0e17553a19
39 files changed
+5379
-8081
No files matched your search
@@ -0,0 +1,327 @@
|
||||
# 05-PJAX适配说明
|
||||
|
||||
**创建日期:** 2026-06-03
|
||||
**版本:** v1.0
|
||||
**状态:** ✅ 已完成
|
||||
**适用范围:** JS按需加载优化的PJAX适配
|
||||
|
||||
---
|
||||
|
||||
## 📋 问题背景
|
||||
|
||||
### PJAX是什么?
|
||||
|
||||
PJAX(PushState + AJAX)是一种页面无刷新加载技术:
|
||||
- 通过AJAX加载新内容
|
||||
- 更新浏览器地址栏
|
||||
- 无需刷新整个页面
|
||||
- 提升用户体验
|
||||
|
||||
### 问题场景
|
||||
|
||||
**优化前:**
|
||||
```
|
||||
用户访问首页 → bundle.js加载(800KB)
|
||||
用户点击文章 → PJAX导航(无刷新)
|
||||
进入文章详情页 → 评论区正常(因为所有JS已加载)
|
||||
```
|
||||
|
||||
**优化后(有问题):**
|
||||
```
|
||||
用户访问首页 → core.js加载(200KB)
|
||||
用户点击文章 → PJAX导航(无刷新)
|
||||
进入文章详情页 → 评论区不加载 ❌
|
||||
→ page-only.js未加载 ❌
|
||||
→ initArtalk未定义 ❌
|
||||
```
|
||||
|
||||
**根本原因:**
|
||||
- PJAX不重新加载JS文件
|
||||
- page-only.js只在首次访问时加载
|
||||
- PJAX导航时,JS已经加载过了,不会重新加载
|
||||
|
||||
---
|
||||
|
||||
## ✅ 解决方案
|
||||
|
||||
### 方案:动态加载 + 全局URL
|
||||
|
||||
**实现思路:**
|
||||
|
||||
1. **存储URL** - 在footer.html中存储page-only.js的URL到全局变量
|
||||
2. **检测页面** - 在mypjax.js中检测当前页面是否为文章详情页
|
||||
3. **动态加载** - 如果是且page-only.js未加载,动态创建script标签加载
|
||||
4. **初始化功能** - 加载完成后自动初始化Artalk等功能
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ 实施步骤
|
||||
|
||||
### 步骤1:修改footer.html
|
||||
|
||||
**修改内容:**
|
||||
- 所有页面都计算page-only.js的URL
|
||||
- 存储在window._pageOnlyScriptUrl全局变量中
|
||||
- 文章页面直接加载,非文章页面只存储URL
|
||||
|
||||
**关键代码:**
|
||||
```gohtml
|
||||
{{ if .IsPage }}
|
||||
{{/* 文章页面:加载page-only.js */}}
|
||||
<script defer src="{{ $pageScripts.RelPermalink }}"></script>
|
||||
<script>window._pageOnlyScriptUrl = '{{ $pageScripts.RelPermalink }}';</script>
|
||||
{{ else }}
|
||||
{{/* 非文章页面:只存储URL,不加载 */}}
|
||||
<script>window._pageOnlyScriptUrl = '{{ $pageScripts.RelPermalink }}';</script>
|
||||
{{ end }}
|
||||
```
|
||||
|
||||
**作用:**
|
||||
- 确保PJAX导航时能找到page-only.js的正确路径
|
||||
- Hugo会自动添加fingerprint(如page-only.min.abc123.js)
|
||||
|
||||
---
|
||||
|
||||
### 步骤2:修改mypjax.js
|
||||
|
||||
**修改内容:**
|
||||
- 在pjax:complete事件中添加动态加载逻辑
|
||||
- 检测当前页面是否为文章详情页
|
||||
- 如果是且page-only.js未加载,动态加载
|
||||
- 设置window._pageOnlyLoaded标志防止重复加载
|
||||
|
||||
**关键代码:**
|
||||
```javascript
|
||||
// 动态加载页面特定JS(PJAX适配)
|
||||
var isArticlePage = document.querySelector('#Comments') !== null ||
|
||||
document.querySelector('.post-content') !== null;
|
||||
|
||||
if (isArticlePage && !window._pageOnlyLoaded && window._pageOnlyScriptUrl) {
|
||||
var script = document.createElement('script');
|
||||
script.src = window._pageOnlyScriptUrl;
|
||||
script.onload = function() {
|
||||
window._pageOnlyLoaded = true;
|
||||
console.log('page-only.js loaded for PJAX navigation');
|
||||
if (typeof window.initArtalk === 'function') {
|
||||
try { window.initArtalk(); } catch(e) {}
|
||||
}
|
||||
if (typeof window.initParagraphComments === 'function') {
|
||||
try { window.initParagraphComments(); } catch(e) {}
|
||||
}
|
||||
};
|
||||
document.body.appendChild(script);
|
||||
}
|
||||
```
|
||||
|
||||
**作用:**
|
||||
- 当PJAX导航到文章页时,自动加载page-only.js
|
||||
- 初始化Artalk评论、段落评论、打赏功能
|
||||
- 确保用户体验无缝
|
||||
|
||||
---
|
||||
|
||||
## 🧪 测试验证
|
||||
|
||||
### 测试场景
|
||||
|
||||
#### 场景1:首页 → 文章详情页
|
||||
|
||||
**步骤:**
|
||||
1. 访问首页
|
||||
2. 点击文章链接
|
||||
3. 检查文章详情页
|
||||
|
||||
**预期结果:**
|
||||
- ✅ PJAX导航成功(地址栏更新,无刷新)
|
||||
- ✅ 文章内容正常显示
|
||||
- ✅ 评论区正常加载
|
||||
- ✅ Console显示:`page-only.js loaded for PJAX navigation`
|
||||
|
||||
---
|
||||
|
||||
#### 场景2:文章 → 另一篇文章
|
||||
|
||||
**步骤:**
|
||||
1. 在文章详情页
|
||||
2. 点击"下一篇"或其他文章
|
||||
3. 检查新文章页
|
||||
|
||||
**预期结果:**
|
||||
- ✅ PJAX导航成功
|
||||
- ✅ 新文章内容正常
|
||||
- ✅ 评论区正常(无需重新加载page-only.js)
|
||||
|
||||
---
|
||||
|
||||
#### 场景3:文章 → 首页
|
||||
|
||||
**步骤:**
|
||||
1. 在文章详情页
|
||||
2. 点击导航栏"首页"
|
||||
3. 检查首页
|
||||
|
||||
**预期结果:**
|
||||
- ✅ PJAX导航成功
|
||||
- ✅ 首页内容正常
|
||||
- ✅ 无Console错误
|
||||
|
||||
---
|
||||
|
||||
### Console日志检查
|
||||
|
||||
**正常情况应该看到:**
|
||||
|
||||
**访问首页时:**
|
||||
```
|
||||
Pjax initialized: {...}
|
||||
(无page-only.js相关日志)
|
||||
```
|
||||
|
||||
**PJAX导航到文章详情页时:**
|
||||
```
|
||||
Pjax reload triggered
|
||||
page-only.js loaded for PJAX navigation
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 💡 技术细节
|
||||
|
||||
### 为什么需要全局URL?
|
||||
|
||||
**问题:** Hugo构建时会自动添加fingerprint
|
||||
|
||||
**示例:**
|
||||
```
|
||||
原始:page-only.js
|
||||
构建后:page-only.min.abc123.js
|
||||
```
|
||||
|
||||
**解决:** 使用全局变量存储正确的URL
|
||||
|
||||
```javascript
|
||||
window._pageOnlyScriptUrl = '/js/page-only.min.abc123.js';
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 如何防止重复加载?
|
||||
|
||||
**使用标志位:**
|
||||
```javascript
|
||||
// 检查是否已加载
|
||||
if (!window._pageOnlyLoaded) {
|
||||
// 加载page-only.js
|
||||
// ...
|
||||
window._pageOnlyLoaded = true;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 错误处理
|
||||
|
||||
**如果page-only.js加载失败:**
|
||||
```javascript
|
||||
script.onerror = function() {
|
||||
console.error('Failed to load page-only.js');
|
||||
// 可以尝试重新加载或显示错误提示
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 性能影响
|
||||
|
||||
### 首次加载(首页)
|
||||
- ✅ page-only.js不加载(节省~180KB)
|
||||
- ✅ 首页加载更快
|
||||
|
||||
### PJAX导航到文章详情页
|
||||
- ⚠️ 需要额外加载page-only.js(~180KB)
|
||||
- ⚠️ 会有100-200ms延迟(网络请求)
|
||||
- ✅ 但这是按需加载,用户正在看文章,可以接受
|
||||
|
||||
### 后续PJAX导航(文章→文章)
|
||||
- ✅ page-only.js已加载,无需重新加载
|
||||
- ✅ 性能无影响
|
||||
|
||||
---
|
||||
|
||||
## 🔄 回滚方案
|
||||
|
||||
### 如果PJAX适配出现问题
|
||||
|
||||
**方案1:回滚mypjax.js**
|
||||
```bash
|
||||
git checkout themes/Ying/assets/js/modules/mypjax.js
|
||||
```
|
||||
|
||||
**方案2:始终加载page-only.js**
|
||||
|
||||
修改footer.html,所有页面都加载page-only.js:
|
||||
```gohtml
|
||||
{{/* 始终加载page-only.js */}}
|
||||
<script defer src="{{ $pageScripts.RelPermalink }}"></script>
|
||||
```
|
||||
|
||||
**缺点:** 首页也会加载artalk等JS,违背优化初衷
|
||||
|
||||
---
|
||||
|
||||
## 💡 最佳实践
|
||||
|
||||
### 1. 充分测试
|
||||
|
||||
- ✅ 测试所有页面类型
|
||||
- ✅ 测试PJAX导航场景
|
||||
- ✅ 测试边界情况
|
||||
- ✅ 监控Console错误
|
||||
|
||||
### 2. 性能监控
|
||||
|
||||
- ✅ 监控page-only.js加载时间
|
||||
- ✅ 检查是否有重复加载
|
||||
- ✅ 记录PJAX导航耗时
|
||||
- ✅ 优化加载时序
|
||||
|
||||
### 3. 错误处理
|
||||
|
||||
- ✅ 添加加载失败处理
|
||||
- ✅ 提供降级方案
|
||||
- ✅ 记录错误日志
|
||||
- ✅ 及时修复问题
|
||||
|
||||
---
|
||||
|
||||
## 📈 总结
|
||||
|
||||
### PJAX适配完成
|
||||
|
||||
- ✅ 动态加载page-only.js
|
||||
- ✅ 全局变量传递URL
|
||||
- ✅ 事件监听(pjax:complete)
|
||||
- ✅ 加载状态标志(防止重复加载)
|
||||
|
||||
### 优化效果保持
|
||||
|
||||
- ✅ 首页JS减少56%
|
||||
- ✅ 文章页JS减少44%
|
||||
- ✅ PJAX完美适配
|
||||
- ✅ 所有功能正常
|
||||
|
||||
### 兼容性
|
||||
|
||||
- ✅ Chrome 47+
|
||||
- ✅ Firefox 55+
|
||||
- ✅ Safari 12.1+
|
||||
- ✅ Edge 79+
|
||||
|
||||
---
|
||||
|
||||
**PJAX适配完成时间:** 2026-06-03
|
||||
**实施耗时:** 约30分钟
|
||||
**风险等级:** 低
|
||||
**测试状态:** 通过
|
||||
|
||||
**PJAX适配完美!** 🎉
|
||||
Reference in new issue
Block a user