hexo-theme-stellar 1.34.0 → 1.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_config.yml +25 -19
- package/layout/_partial/comments/artalk/layout.ejs +2 -2
- package/layout/_partial/comments/artalk/script.ejs +3 -9
- package/layout/_partial/comments/beaudar/script.ejs +2 -8
- package/layout/_partial/comments/giscus/script.ejs +2 -8
- package/layout/_partial/comments/twikoo/layout.ejs +2 -2
- package/layout/_partial/comments/twikoo/script.ejs +3 -9
- package/layout/_partial/comments/utterances/script.ejs +2 -8
- package/layout/_partial/comments/waline/layout.ejs +1 -1
- package/layout/_partial/comments/waline/script.ejs +1 -7
- package/layout/_partial/head.ejs +0 -3
- package/layout/_partial/scripts/defines.ejs +118 -1
- package/layout/_partial/scripts/lazyload.ejs +7 -6
- package/layout/_partial/scripts/services.ejs +11 -13
- package/layout/_partial/scripts/utils.ejs +358 -66
- package/layout/_partial/widgets/tagtree.ejs +1 -1
- package/layout/_partial/widgets/toc.ejs +1 -4
- package/layout/_partial/widgets/tree.ejs +1 -1
- package/layout/_plugins/fancybox.ejs +23 -8
- package/layout/_plugins/scrollreveal.ejs +77 -13
- package/layout/layout.ejs +0 -1
- package/package.json +4 -2
- package/scripts/events/index.js +2 -1
- package/scripts/events/lib/doc_tree.js +7 -4
- package/scripts/events/lib/merge_posts.js +3 -1
- package/scripts/events/lib/notebooks.js +5 -3
- package/scripts/events/lib/path_normalize.js +22 -0
- package/scripts/filters/lib/img_lazyload.js +9 -9
- package/scripts/generators/search.js +3 -1
- package/scripts/helpers/json_ld.js +3 -2
- package/scripts/helpers/pretty_url.js +9 -10
- package/scripts/lib/path_utils.js +24 -0
- package/scripts/tags/lib/emoji.js +17 -2
- package/scripts/tags/lib/image.js +13 -18
- package/source/css/_common/html.styl +0 -2
- package/source/css/_components/widgets/toc.styl +2 -2
- package/source/css/_plugins/index.styl +0 -3
- package/source/css/_plugins/lazyload.styl +40 -26
- package/source/css/_plugins/scrollreveal.styl +5 -1
- package/source/js/main.js +157 -73
- package/source/js/search/algolia-search.js +62 -62
- package/source/js/search/local-search.js +37 -36
- package/source/js/services/artalk_latest_comment.js +5 -7
- package/source/js/services/contributors.js +4 -6
- package/source/js/services/fcircle.js +4 -6
- package/source/js/services/friends.js +4 -6
- package/source/js/services/friends_and_posts.js +4 -6
- package/source/js/services/ghinfo.js +6 -8
- package/source/js/services/giscus_latest_comment.js +4 -6
- package/source/js/services/mdrender.js +2 -2
- package/source/js/services/memos.js +3 -4
- package/source/js/services/rss.js +10 -12
- package/source/js/services/siteinfo.js +24 -26
- package/source/js/services/sites.js +4 -6
- package/source/js/services/timeline.js +4 -6
- package/source/js/services/twikoo_latest_comment.js +5 -7
- package/source/js/services/waline_latest_comment.js +4 -6
- package/source/js/services/weibo.js +4 -6
- package/CLAUDE.md +0 -217
- package/docs/audits/2026-08-08-stellar-analysis.md +0 -267
- package/docs/release-process.md +0 -59
- package/layout/_plugins/pjax.ejs +0 -8
- package/source/css/_plugins/pjax.styl +0 -61
- package/source/js/plugins/pjax.js +0 -646
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const els = document.getElementsByClassName('ds-giscus');
|
|
1
|
+
(function () {
|
|
2
|
+
const els = document.getElementsByClassName('ds-giscus');
|
|
4
3
|
for (var i = 0; i < els.length; i++) {
|
|
5
4
|
const el = els[i];
|
|
6
5
|
const api = el.dataset.api;
|
|
@@ -29,9 +28,8 @@ utils.jq(() => {
|
|
|
29
28
|
cell += comment;
|
|
30
29
|
cell += '</a>';
|
|
31
30
|
cell += '</div>';
|
|
32
|
-
|
|
31
|
+
utils.dom(el).append(cell);
|
|
33
32
|
});
|
|
34
33
|
});
|
|
35
34
|
}
|
|
36
|
-
|
|
37
|
-
});
|
|
35
|
+
})();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
(function () {
|
|
2
2
|
const els = Array.from(document.getElementsByClassName('ds-memos'));
|
|
3
3
|
|
|
4
4
|
els.forEach(el => {
|
|
@@ -18,7 +18,7 @@ utils.jq(() => {
|
|
|
18
18
|
const hide = el.getAttribute('hide')?.split(",") || [];
|
|
19
19
|
|
|
20
20
|
await Promise.all(memos.data.slice(0, limit || memos.data.length).map(item =>
|
|
21
|
-
createMemoCell(item, memos, users, hide, default_avatar, host).then(cell =>
|
|
21
|
+
createMemoCell(item, memos, users, hide, default_avatar, host).then(cell => utils.dom(el).append(cell))
|
|
22
22
|
));
|
|
23
23
|
});
|
|
24
24
|
|
|
@@ -130,5 +130,4 @@ utils.jq(() => {
|
|
|
130
130
|
}
|
|
131
131
|
};
|
|
132
132
|
});
|
|
133
|
-
});
|
|
134
|
-
|
|
133
|
+
})();
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const els = document.getElementsByClassName('ds-rss');
|
|
1
|
+
(function () {
|
|
2
|
+
const els = document.getElementsByClassName('ds-rss');
|
|
4
3
|
|
|
5
4
|
for (let i = 0; i < els.length; i++) {
|
|
6
5
|
const el = els[i];
|
|
@@ -44,10 +43,9 @@ utils.jq(() => {
|
|
|
44
43
|
handleRSS1(el, doc, content_type, show_title, show_content, limit);
|
|
45
44
|
return;
|
|
46
45
|
}
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
})();
|
|
51
49
|
|
|
52
50
|
|
|
53
51
|
function handleAtom(el, doc, content_type, show_title, show_content, limit) {
|
|
@@ -88,7 +86,7 @@ function handleAtom(el, doc, content_type, show_title, show_content, limit) {
|
|
|
88
86
|
return cell;
|
|
89
87
|
}).join('');
|
|
90
88
|
|
|
91
|
-
|
|
89
|
+
utils.dom(el).append(htmlBuffer);
|
|
92
90
|
}
|
|
93
91
|
|
|
94
92
|
function handleRSS2(el, doc, content_type, show_title, show_content, limit) {
|
|
@@ -124,7 +122,7 @@ function handleRSS2(el, doc, content_type, show_title, show_content, limit) {
|
|
|
124
122
|
return cell;
|
|
125
123
|
}).join('');
|
|
126
124
|
|
|
127
|
-
|
|
125
|
+
utils.dom(el).append(htmlBuffer);
|
|
128
126
|
}
|
|
129
127
|
function handleRSS1(el, doc, content_type, show_title, show_content, limit) {
|
|
130
128
|
const items = Array.from(doc.querySelectorAll('item')).slice(0, limit);
|
|
@@ -159,7 +157,7 @@ function handleRSS1(el, doc, content_type, show_title, show_content, limit) {
|
|
|
159
157
|
return cell;
|
|
160
158
|
}).join('');
|
|
161
159
|
|
|
162
|
-
|
|
160
|
+
utils.dom(el).append(htmlBuffer);
|
|
163
161
|
}
|
|
164
162
|
function handleJsonFeed(el, data, content_type, show_title, show_content, limit) {
|
|
165
163
|
const items = (data.items || []).slice(0, limit);
|
|
@@ -196,5 +194,5 @@ function handleJsonFeed(el, data, content_type, show_title, show_content, limit)
|
|
|
196
194
|
return cell;
|
|
197
195
|
}).join('');
|
|
198
196
|
|
|
199
|
-
|
|
200
|
-
}
|
|
197
|
+
utils.dom(el).append(htmlBuffer);
|
|
198
|
+
}
|
|
@@ -8,31 +8,29 @@ function setCardLink(nodes) {
|
|
|
8
8
|
el.removeAttribute('cardlink');
|
|
9
9
|
const api = el.dataset.api;
|
|
10
10
|
if (api == null) return;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
el.querySelector('.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
console.error(error);
|
|
36
|
-
});
|
|
11
|
+
// 走统一请求入口,动态数据缓存对 siteinfo 同样生效
|
|
12
|
+
utils.request(null, api, function(response) {
|
|
13
|
+
return response.json().then(function(data) {
|
|
14
|
+
var autofill = [];
|
|
15
|
+
const autofillStr = el.getAttribute('autofill');
|
|
16
|
+
if (autofillStr) {
|
|
17
|
+
autofill = autofillStr.split(',');
|
|
18
|
+
}
|
|
19
|
+
if (data.title && data.title.length > 0 && autofill.includes('title')) {
|
|
20
|
+
el.querySelector('.title').innerHTML = data.title;
|
|
21
|
+
el.title = data.title;
|
|
22
|
+
}
|
|
23
|
+
if (data.icon && data.icon.length > 0 && autofill.includes('icon')) {
|
|
24
|
+
el.querySelector('.img').style = 'background-image: url("' + data.icon + '");';
|
|
25
|
+
el.querySelector('.img').setAttribute('data-bg', data.icon);
|
|
26
|
+
}
|
|
27
|
+
let desc = el.querySelector('.desc');
|
|
28
|
+
if (desc && data.desc && data.desc.length > 0 && autofill.includes('desc')) {
|
|
29
|
+
desc.innerHTML = data.desc;
|
|
30
|
+
}
|
|
31
|
+
}).catch(function(error) {
|
|
32
|
+
console.error(error);
|
|
33
|
+
});
|
|
34
|
+
}, undefined, { service: 'siteinfo' });
|
|
37
35
|
})
|
|
38
36
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const els = document.getElementsByClassName('ds-sites');
|
|
1
|
+
(function () {
|
|
2
|
+
const els = document.getElementsByClassName('ds-sites');
|
|
4
3
|
for (var i = 0; i < els.length; i++) {
|
|
5
4
|
const el = els[i];
|
|
6
5
|
const api = el.dataset.api;
|
|
@@ -34,10 +33,9 @@ utils.jq(() => {
|
|
|
34
33
|
cell += `</div>`;
|
|
35
34
|
cell += `</a>`;
|
|
36
35
|
cell += `</div>`;
|
|
37
|
-
|
|
36
|
+
utils.dom(el).find('.grid-box').append(cell);
|
|
38
37
|
}
|
|
39
38
|
window.wrapLazyloadImages(el);
|
|
40
39
|
});
|
|
41
40
|
}
|
|
42
|
-
|
|
43
|
-
});
|
|
41
|
+
})();
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const reactions = {
|
|
1
|
+
(function () {
|
|
2
|
+
const reactions = {
|
|
4
3
|
'+1': '👍',
|
|
5
4
|
'-1': '👎',
|
|
6
5
|
'laugh': '😀',
|
|
@@ -99,10 +98,9 @@ utils.jq(() => {
|
|
|
99
98
|
|
|
100
99
|
cell += '</div>';
|
|
101
100
|
cell += '</div>';
|
|
102
|
-
|
|
101
|
+
utils.dom(el).append(cell);
|
|
103
102
|
});
|
|
104
103
|
window.wrapLazyloadImages(el);
|
|
105
104
|
});
|
|
106
105
|
}
|
|
107
|
-
|
|
108
|
-
});
|
|
106
|
+
})();
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const el = document.querySelector('.ds-twikoo');
|
|
1
|
+
(function () {
|
|
2
|
+
const el = document.querySelector('.ds-twikoo');
|
|
4
3
|
utils.onLoading(el); // 加载动画
|
|
5
4
|
|
|
6
5
|
const api = el.dataset.api;
|
|
@@ -38,10 +37,9 @@ utils.jq(() => {
|
|
|
38
37
|
cell += commentText;
|
|
39
38
|
cell += '</a>';
|
|
40
39
|
cell += '</div>';
|
|
41
|
-
|
|
40
|
+
utils.dom(el).append(cell);
|
|
42
41
|
});
|
|
43
42
|
})
|
|
44
43
|
.catch(() => utils.onLoadFailure(el));
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
})();
|
|
45
|
+
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const els = document.getElementsByClassName('ds-waline');
|
|
1
|
+
(function () {
|
|
2
|
+
const els = document.getElementsByClassName('ds-waline');
|
|
4
3
|
for (var i = 0; i < els.length; i++) {
|
|
5
4
|
const el = els[i];
|
|
6
5
|
const limit = parseInt(el.getAttribute('limit')) || 10;
|
|
@@ -25,9 +24,8 @@ utils.jq(() => {
|
|
|
25
24
|
cell += item.comment.replace(/<a\b[^>]*>(.*?)<\/a>/g, '$1');
|
|
26
25
|
cell += '</a>';
|
|
27
26
|
cell += '</div>';
|
|
28
|
-
|
|
27
|
+
utils.dom(el).append(cell);
|
|
29
28
|
});
|
|
30
29
|
});
|
|
31
30
|
}
|
|
32
|
-
|
|
33
|
-
});
|
|
31
|
+
})();
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const els = document.getElementsByClassName('ds-weibo');
|
|
1
|
+
(function () {
|
|
2
|
+
const els = document.getElementsByClassName('ds-weibo');
|
|
4
3
|
for (var i = 0; i < els.length; i++) {
|
|
5
4
|
const el = els[i];
|
|
6
5
|
const api = el.dataset.api;
|
|
@@ -53,9 +52,8 @@ utils.jq(() => {
|
|
|
53
52
|
cell += '</div>';
|
|
54
53
|
cell += '</div>';
|
|
55
54
|
// 右下角结束
|
|
56
|
-
|
|
55
|
+
utils.dom(el).append(cell);
|
|
57
56
|
});
|
|
58
57
|
});
|
|
59
58
|
}
|
|
60
|
-
|
|
61
|
-
});
|
|
59
|
+
})();
|
package/CLAUDE.md
DELETED
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
# Stellar Theme Development
|
|
2
|
-
|
|
3
|
-
这是 Hexo 主题 **Stellar** 的仓库。主题是一个独立的 npm 包,用于 [hexo-theme-stellar](https://github.com/xaoxuu/hexo-theme-stellar)。
|
|
4
|
-
|
|
5
|
-
## 技术栈
|
|
6
|
-
|
|
7
|
-
| 层级 | 技术 | 目录 |
|
|
8
|
-
|------|------|------|
|
|
9
|
-
| 模板引擎 | EJS | `layout/` |
|
|
10
|
-
| CSS 预处理 | Stylus | `source/css/` |
|
|
11
|
-
| 服务端 JS | CommonJS (ES5) | `scripts/` |
|
|
12
|
-
| 浏览器 JS | ES5 (Babel 转译) | `source/js/` |
|
|
13
|
-
| 国际化 | YAML | `languages/` |
|
|
14
|
-
| 文档 | Markdown | `docs/` |
|
|
15
|
-
|
|
16
|
-
## 目录结构
|
|
17
|
-
|
|
18
|
-
```
|
|
19
|
-
layout/ # EJS 模板
|
|
20
|
-
├── _partial/ # 可复用组件
|
|
21
|
-
│ ├── main/ # 文章列表、导航、页脚
|
|
22
|
-
│ ├── sidebar/ # 侧栏组件
|
|
23
|
-
│ ├── cover/ # 封面
|
|
24
|
-
│ ├── comments/ # 评论系统
|
|
25
|
-
│ ├── widgets/ # 小部件
|
|
26
|
-
│ └── scripts/ # 脚本注入
|
|
27
|
-
├── _plugins/ # 可选插件片段
|
|
28
|
-
├── layout.ejs # 根布局
|
|
29
|
-
├── index.ejs # 首页
|
|
30
|
-
├── page.ejs # 通用页面
|
|
31
|
-
└── archive.ejs # 归档页
|
|
32
|
-
scripts/ # Hexo 服务端脚本
|
|
33
|
-
├── tags/ # 自定义标签 `{% tag %}`
|
|
34
|
-
│ └── lib/ # 标签实现
|
|
35
|
-
├── helpers/ # EJS 辅助函数
|
|
36
|
-
├── filters/ # Hexo 过滤器
|
|
37
|
-
├── generators/ # 页面生成器
|
|
38
|
-
├── events/ # 事件处理
|
|
39
|
-
└── commands/ # CLI 命令
|
|
40
|
-
source/ # 浏览器端资源
|
|
41
|
-
├── css/ # Stylus 样式
|
|
42
|
-
│ ├── _defines/ # 变量和函数
|
|
43
|
-
│ ├── _common/ # 通用基础样式
|
|
44
|
-
│ ├── _components/ # 组件样式
|
|
45
|
-
│ └── _plugins/ # 插件样式
|
|
46
|
-
└── js/ # 浏览器 JavaScript
|
|
47
|
-
├── plugins/ # 交互插件
|
|
48
|
-
├── services/ # 数据服务
|
|
49
|
-
└── search/ # 搜索
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
## EJS 模板规范
|
|
53
|
-
|
|
54
|
-
- `<% %>` 逻辑控制,`<%- %>` 输出非转义 HTML
|
|
55
|
-
- 变量声明用 `var`(IE8 兼容)
|
|
56
|
-
- 2 空格缩进,HTML 属性双引号
|
|
57
|
-
- 可复用片段提取到 `_partial/`
|
|
58
|
-
- 复杂逻辑提取到 `helpers/` 辅助函数
|
|
59
|
-
|
|
60
|
-
```ejs
|
|
61
|
-
<%
|
|
62
|
-
var items = site.posts.sort('date', -1).limit(10)
|
|
63
|
-
items.forEach(function(post) {
|
|
64
|
-
%>
|
|
65
|
-
<article>
|
|
66
|
-
<%- partial('_partial/main/post_list/post_card', {post: post}) %>
|
|
67
|
-
</article>
|
|
68
|
-
<%
|
|
69
|
-
})
|
|
70
|
-
%>
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
## Node.js 脚本规范
|
|
74
|
-
|
|
75
|
-
- CommonJS: `require()` / `module.exports`
|
|
76
|
-
- 文件头: `/* global hexo */` + `'use strict';`
|
|
77
|
-
- 2 空格缩进,双引号,分号结尾
|
|
78
|
-
- 标签注册: `hexo.extend.tag.register(name, handler, options)`
|
|
79
|
-
- 辅助函数注册: `hexo.extend.helper.register(name, handler)`
|
|
80
|
-
|
|
81
|
-
```js
|
|
82
|
-
/* global hexo */
|
|
83
|
-
'use strict';
|
|
84
|
-
|
|
85
|
-
module.exports = function(hexo) {
|
|
86
|
-
return function(args, content) {
|
|
87
|
-
var result = '';
|
|
88
|
-
// ...
|
|
89
|
-
return result;
|
|
90
|
-
};
|
|
91
|
-
};
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
## Stylus 样式规范
|
|
95
|
-
|
|
96
|
-
- 文件引入顺序: `const` → `custom` → `theme_base` → `theme_colorful` → `func`
|
|
97
|
-
- 类名和文件名: `kebab-case`
|
|
98
|
-
- 变量在 `_defines/`,通用样式在 `_common/`,组件在 `_components/`
|
|
99
|
-
- 2 空格缩进,属性后空格
|
|
100
|
-
- CSS 兼容 IE8
|
|
101
|
-
|
|
102
|
-
## 浏览器 JS 规范
|
|
103
|
-
|
|
104
|
-
- ES5 语法(Gulp Babel 转译为 ES2015+)
|
|
105
|
-
- 避免直接操作 DOM,使用主题工具函数
|
|
106
|
-
- 注释: `//` 单行,`/* */` 多行
|
|
107
|
-
|
|
108
|
-
## 工作流程
|
|
109
|
-
|
|
110
|
-
每次修改必须遵循以下流程,产物保留在仓库中:
|
|
111
|
-
|
|
112
|
-
### 1. 方案
|
|
113
|
-
|
|
114
|
-
在 `docs/` 目录下创建或更新方案文档,描述:
|
|
115
|
-
- 要解决的问题或新增的能力
|
|
116
|
-
- 技术方案和实现思路
|
|
117
|
-
- 影响范围(涉及哪些文件/模块)
|
|
118
|
-
|
|
119
|
-
### 2. 执行计划
|
|
120
|
-
|
|
121
|
-
方案通过后,列出具体执行步骤,记录在对应文档中:
|
|
122
|
-
- 改动文件清单
|
|
123
|
-
- 分步实施顺序
|
|
124
|
-
- 依赖关系
|
|
125
|
-
|
|
126
|
-
### 3. 测试
|
|
127
|
-
|
|
128
|
-
变更完成后,在自己的 Hexo 项目中集成验证:
|
|
129
|
-
- **`npm run g && npx gulp minify` 全量验证**(`scripts/` 变更必须执行:`npm run g` 发现模板渲染错误,`npx gulp minify` 发现 HTML 结构错误如多余引号等)
|
|
130
|
-
- `npm run s` 启动本地服务
|
|
131
|
-
- 检查涉及的所有页面类型(首页、文章页、Wiki 页等)
|
|
132
|
-
- 验证浏览器兼容性
|
|
133
|
-
- 测试结果记录在 `docs/` 中
|
|
134
|
-
|
|
135
|
-
### 4. 文档归档
|
|
136
|
-
|
|
137
|
-
- 方案、执行计划、测试记录保存在 `docs/` 目录
|
|
138
|
-
- 文件命名: `docs/{YYYY-MM-DD}-{功能简称}.md`
|
|
139
|
-
- 涉及逻辑变更(API、配置项、行为变化)必须同步更新仓库 Wiki
|
|
140
|
-
|
|
141
|
-
### 新增功能 Checklist
|
|
142
|
-
|
|
143
|
-
新增功能必须覆盖以下维度:
|
|
144
|
-
|
|
145
|
-
1. `layout/` — EJS 模板
|
|
146
|
-
2. `scripts/` — Hexo 标签 / 辅助函数 / 过滤器
|
|
147
|
-
3. `source/css/` — Stylus 样式
|
|
148
|
-
4. `source/js/` — 浏览器脚本(如需)
|
|
149
|
-
5. `docs/` — 方案 + 执行计划 + 测试记录
|
|
150
|
-
6. `languages/` — 国际化文案(如需新增文本)
|
|
151
|
-
|
|
152
|
-
## 组件架构
|
|
153
|
-
|
|
154
|
-
### 自定义标签开发
|
|
155
|
-
|
|
156
|
-
1. 在 `scripts/tags/lib/` 下创建标签实现文件
|
|
157
|
-
2. 在 `scripts/tags/index.js` 中注册
|
|
158
|
-
3. 在 `source/css/_components/tag-plugins/` 添加对应样式
|
|
159
|
-
4. 推荐使用 `hexo` 参数传入,避免 `require('hexo')`
|
|
160
|
-
|
|
161
|
-
### 评论系统
|
|
162
|
-
|
|
163
|
-
- 接口目录: `layout/_partial/comments/`
|
|
164
|
-
- 每个评论系统提供 `layout.ejs` 和 `script.ejs`
|
|
165
|
-
- 遵循现有的配置驱动模式
|
|
166
|
-
|
|
167
|
-
## Git 规范
|
|
168
|
-
|
|
169
|
-
```
|
|
170
|
-
<type>(<scope>): <description>
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
| Type | 说明 |
|
|
174
|
-
|------|------|
|
|
175
|
-
| `feat` | 新功能 |
|
|
176
|
-
| `fix` | Bug 修复 |
|
|
177
|
-
| `refactor` | 重构 |
|
|
178
|
-
| `perf` | 性能优化 |
|
|
179
|
-
| `style` | CSS/样式修改 |
|
|
180
|
-
| `docs` | 文档更新 |
|
|
181
|
-
|
|
182
|
-
## 发版规范
|
|
183
|
-
|
|
184
|
-
发版分两步:脚本完成版本号更新和推送 → CI 自动完成 npm 发布和 tag 创建。
|
|
185
|
-
|
|
186
|
-
```
|
|
187
|
-
npm-publish.sh → push main + npm → CI → npm publish + git tag
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
### 使用方式
|
|
191
|
-
|
|
192
|
-
```bash
|
|
193
|
-
# 正常发版(CI 自动处理 npm publish 和 tag)
|
|
194
|
-
bash npm-publish.sh 1.33.2
|
|
195
|
-
|
|
196
|
-
# 预览模式(仅显示改动,不提交/推送,执行后自动回滚)
|
|
197
|
-
bash npm-publish.sh 1.33.2 --dry-run
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
### AI 调用指南
|
|
201
|
-
|
|
202
|
-
1. **分析变更确定版本号**: 查看上一版本以来的 commit,按以下规则确定版本号:
|
|
203
|
-
- `x.y.z` → `x.y.(z+1)`: 仅含 fix / perf / style(修复和优化,安全升级)
|
|
204
|
-
- `x.y.z` → `x.(y+1).0`: 含 feat / refactor / breaking change(功能增减、一般重构)
|
|
205
|
-
- `x.y.z` → `(x+1).0.0`: 大型重构,用户可感知的设计调整
|
|
206
|
-
- `x.y.z` → `x.y.z-rc.N`: 测试版本
|
|
207
|
-
2. **向用户确认**: 列出版本号和变更摘要,等待用户确认后再继续
|
|
208
|
-
3. **dry-run 预览**: `bash npm-publish.sh <version> --dry-run` 检查变更是否正确
|
|
209
|
-
4. **正式执行**: `bash npm-publish.sh <version>`
|
|
210
|
-
5. **CI 自动**: 检测 `release:` commit → npm publish + tag
|
|
211
|
-
|
|
212
|
-
## 约束
|
|
213
|
-
|
|
214
|
-
- **修改 `scripts/` 目录下任何文件后,必须运行 `npm run g && npx gulp minify` 验证构建成功。** `npm run g` 做全量渲染发现模板错误,`npx gulp minify` 做 HTML 压缩发现结构错误(如多余引号)。`npm run s` 是按需渲染,不能替代全量验证。
|
|
215
|
-
- 不引入新构建系统,保持 Hexo 原生 + Gulp 后处理
|
|
216
|
-
- 不混用 EJS 和前端框架语法
|
|
217
|
-
- CSS 兼容 IE8,JS 兼容 ES2015+
|