hexo-theme-development
npx skills add https://github.com/hsiangfeng/hexo-skills --skill hexo-theme-development
Agent 安装分布
Skill 文档
Hexo 主é¡éç¼
ç®é
- Hexo åºç¤
- 主é¡çµæ§
- 模æ¿ç³»çµ±
- è®æ¸ç³»çµ±
- è¼å©å½æ¸
- åéå
- æ´å± API
- 測試
- ç¼å¸ä¸»é¡
Hexo åºç¤
éç¼ä¸»é¡åéäºè§£ç Hexo åºç¤ç¥èã
é ç½®æªæ¡
主è¦é
ç½®å¨ _config.ymlï¼
# ç¶²ç«è¨å®
title: My Blog
author: Author Name
language: zh-tw
# URL è¨å®
url: https://example.com
permalink: :year/:month/:day/:title/
# ç®éè¨å®
source_dir: source
public_dir: public
# 主é¡è¨å®
theme: my-theme
å¸¸ç¨æä»¤
hexo new post "æ¨é¡" # æ°å»ºæç«
hexo new page "about" # æ°å»ºé é¢
hexo generate # ç¢çéæ
æªæ¡
hexo server # å忬å°ä¼ºæå¨
hexo clean # æ¸
é¤å¿«å
Front-matter
æç« éé ç YAML åå¡ï¼
---
title: æç« æ¨é¡
date: 2024-01-15
tags: [Tag1, Tag2]
categories: [Category]
---
è³ææªæ¡
å¨ source/_data/ æ¾ç½® YAML/JSONï¼éé site.data ååï¼
# source/_data/menu.yml
home: /
archives: /archives
詳細åºç¤åèï¼reference/basics.md
主é¡çµæ§
Hexo 主é¡éµå¾ªæ¨æºåç®éçµæ§ï¼
.
âââ _config.yml # 主é¡é
ç½®æª
âââ languages/ # åéåèªè¨æªæ¡
âââ layout/ # æ¨¡æ¿æªæ¡
âââ scripts/ # JavaScript æ´å±è
³æ¬
âââ source/ # éæ
è³æº (CSS, JS, åç)
åç®é說æï¼
| ç®é/æªæ¡ | 說æ |
|---|---|
_config.yml |
主é¡é ç½®ï¼ä¿®æ¹å¾èªåçæç¡ééå |
languages/ |
åæ¾ YAML/JSON èªè¨æªæ¡ |
layout/ |
æ¨¡æ¿æªæ¡ï¼æ¯æ´ EJSãNunjucksãPug |
scripts/ |
åå§åæèªåè¼å ¥ç JS è ³æ¬ |
source/ |
éæ
è³æºï¼_ éé åé±èæªæ¡æè¢«å¿½ç¥ |
模æ¿ç³»çµ±
å ç¨®æ ¸å¿æ¨¡æ¿
| æ¨¡æ¿ | 說æ | åæ´ |
|---|---|---|
index |
é¦é ï¼å¿ éï¼ | – |
post |
æç« é é¢ | index |
page |
ç¨ç«åé | index |
archive |
æ¸æªé é¢ | index |
category |
å顿¸æª | archive |
tag |
æ¨ç±¤æ¸æª | archive |
ä½å±æ©å¶
ä½å±æªæ¡éå
å« body è®æ¸ä»¥é¡¯ç¤ºæ¨¡æ¿å
§å®¹ï¼
<!-- layout.ejs -->
<!DOCTYPE html>
<html>
<head><title><%= page.title %></title></head>
<body><%- body %></body>
</html>
å¨ front-matter æå®æç¦ç¨ä½å±ï¼
---
layout: false # ç¦ç¨ä½å±
---
å±é¨æ¨¡æ¿
ä½¿ç¨ partial() å¼å
¥å
±ç¨å
ä»¶ï¼
<%- partial('partial/header') %>
<%- partial('partial/sidebar', {active: 'home'}) %>
çæ®µå¿«åï¼ç¨æ¼è·¨é é¢ä¸è®çå §å®¹ï¼ï¼
<%- fragment_cache('header', function(){ return '<header>...</header>'; }) %>
<%- partial('partial/header', {}, {cache: true}) %>
è®æ¸ç³»çµ±
å ¨åè®æ¸
| è®æ¸ | 說æ |
|---|---|
site |
ç¶²ç«è³è¨ |
page |
ç¶åé é¢è³è¨ |
config |
ç¶²ç«é ç½® |
theme |
主é¡é ç½® |
path |
ç¶åé é¢è·¯å¾ |
url |
ç¶åé é¢å®æ´ç¶²å |
è©³ç´°è®æ¸åèï¼reference/variables.md
è¼å©å½æ¸
Hexo æä¾è±å¯çå §å»ºè¼å©å½æ¸ï¼
- URL é¡ï¼
url_for(),relative_url(),full_url_for() - HTML æ¨ç±¤é¡ï¼
css(),js(),link_to(),image_tag() - æ¢ä»¶å¤æ·é¡ï¼
is_home(),is_post(),is_archive() - å串èçé¡ï¼
trim(),strip_html(),truncate() - æ¥ææéé¡ï¼
date(),time(),relative_date() - å表é¡ï¼
list_categories(),list_tags(),paginator()
è©³ç´°å½æ¸åèï¼reference/helpers.md
åéå
é ç½®èªè¨
å¨ _config.yml è¨å®ï¼
language: zh-tw
# æå¤èªè¨
language:
- zh-tw
- en
èªè¨æªæ¡
å¨ languages/ å»ºç« YAML æªæ¡ï¼
# languages/zh-tw.yml
Home: é¦é
Archive: æ¸æª
Search: æå°
模æ¿ä¸ä½¿ç¨
<%= __('Home') %>
<%= _p('posts', 5) %> <!-- è¤æ¸å½¢å¼ -->
詳細說æï¼reference/i18n.md
æ´å± API
Hexo æä¾å¼·å¤§çæ´å± APIï¼ç¨æ¼éç¼æä»¶åèªè¨åè½ã
ä¸»è¦æ´å±é»
| API | 說æ | ç¨é |
|---|---|---|
| Filter | éæ¿¾å¨ | ä¿®æ¹èçä¸çè³æ |
| Helper | è¼å©å½æ¸ | 卿¨¡æ¿ä¸æå ¥ç¨å¼ç¢¼ç段 |
| Generator | ç¢çå¨ | æ ¹ææªæ¡å»ºç«è·¯ç± |
| Tag | æ¨ç±¤ | å¨æç« ä¸æå ¥èªè¨å §å®¹ |
| Renderer | 渲æå¨ | è½æå §å®¹æ ¼å¼ |
| Injector | æ³¨å ¥å¨ | å¨ HTML ç¹å®ä½ç½®æå ¥ç¨å¼ç¢¼ |
| Console | æ§å¶å° | 建ç«èªè¨æä»¤ |
å¿«éç¯ä¾
// scripts/my-plugin.js
// èªè¨è¼å©å½æ¸
hexo.extend.helper.register('greeting', function(name) {
return `Hello, ${name}!`;
});
// æç« 渲æå¾èç
hexo.extend.filter.register('after_post_render', function(data) {
// ä¿®æ¹æç« å
§å®¹
return data;
});
// èªè¨æ¨ç±¤
hexo.extend.tag.register('note', function(args, content) {
return `<div class="note">${content}</div>`;
}, { ends: true });
詳細 API åèï¼reference/api.md
測試
宿´ç䏻顿¸¬è©¦å å«å¤å層é¢ã
æ¸¬è©¦å·¥å ·
| é¡å | å·¥å · | ç¨é |
|---|---|---|
| å®å 測試 | Mocha + Chai | 測試è¼å©å½æ¸ãæ¨ç±¤ |
| é ç½®é©è | js-yaml | é©è YAML æ ¼å¼ |
| JS Linting | ESLint | JavaScript å質 |
| CSS Linting | Stylelint | 樣å¼è¡¨å質 |
| åè½æ¸¬è©¦ | hexo-theme-unit-test | 主é¡å®æ´æ§ |
| CI/CD | GitHub Actions | èªå忏¬è©¦ |
åºæ¬è¨ç½®
{
"scripts": {
"test": "mocha test/index.js",
"lint": "eslint scripts/ source/js/"
},
"devDependencies": {
"chai": "^5.0.0",
"eslint": "^9.0.0",
"mocha": "^10.0.0"
}
}
è¼å©å½æ¸æ¸¬è©¦ç¯ä¾
// test/helpers/my-helper.js
const Hexo = require('hexo');
describe('my-helper', () => {
const hexo = new Hexo(__dirname, { silent: true });
before(() => hexo.init());
const helper = hexo.extend.helper.get('my_helper').bind(hexo);
it('should return formatted text', () => {
helper('hello').should.equal('<span>hello</span>');
});
});
åè½æ¸¬è©¦æ¸ å®
- DOCTYPE å charset æ£ç¢º
- é¦é æç« å表ååé
- æç« é æ¨é¡ãå §å®¹ãæ¨ç±¤
- æ¸æªé ææéæåº
- é¿æå¼è¨è¨æ£å¸¸
詳細測試åèï¼reference/testing.md
ç¼å¸ä¸»é¡
- å·è¡æ¸¬è©¦ç¢ºä¿å質
- Fork hexojs/site å²å庫
- å¨
themes.ymlæ°å¢ä¸»é¡è³è¨ - æä¾ 800Ã500px PNG æªå
åèè³æ
- åºç¤åèï¼reference/basics.md
- 模æ¿åèï¼reference/templates.md
- è®æ¸åèï¼reference/variables.md
- è¼å©å½æ¸åèï¼reference/helpers.md
- åéååèï¼reference/i18n.md
- API åèï¼reference/api.md
- 測試åèï¼reference/testing.md
- åºæ¬ç¯ä¾ï¼examples/basic-theme.md
- é²éç¨æ³ï¼examples/advanced-usage.md