@tenjuu99/blog 0.2.55 → 0.2.57
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/README.md +22 -79
- package/docs/develop.md +432 -0
- package/docs/spec.md +749 -0
- package/docs/tutorial.md +165 -0
- package/package.json +4 -2
- package/packages/category/helper/category.js +8 -2
package/README.md
CHANGED
|
@@ -2,96 +2,39 @@
|
|
|
2
2
|
|
|
3
3
|
静的なブログを作るのにどうして React を必要としてしまったんですか
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
`@tenjuu99/blog` は、Markdownファイルから静的HTMLサイトを生成する軽量な静的サイトジェネレーターです。
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
npm i @tenjuu99/blog
|
|
9
|
-
```
|
|
7
|
+
## クイックスタート
|
|
10
8
|
|
|
11
|
-
```
|
|
9
|
+
```bash
|
|
10
|
+
npm i @tenjuu99/blog
|
|
12
11
|
npx create-blog
|
|
13
12
|
npx server
|
|
14
13
|
```
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
## 記事を書く
|
|
15
|
+
詳細な使い方は [チュートリアル](docs/tutorial.md) をご覧ください。
|
|
19
16
|
|
|
20
|
-
|
|
17
|
+
## ドキュメント
|
|
21
18
|
|
|
22
|
-
|
|
23
|
-
|
|
19
|
+
- **[チュートリアル (docs/tutorial.md)](docs/tutorial.md)** - 初めての方向けの入門ガイド
|
|
20
|
+
- **[技術仕様書 (docs/spec.md)](docs/spec.md)** - 詳細な技術仕様とリファレンス
|
|
21
|
+
- **[開発ガイド (docs/develop.md)](docs/develop.md)** - ライブラリ開発者向けガイド
|
|
22
|
+
- **[CLAUDE.md](CLAUDE.md)** - AI開発アシスタント向け参照ドキュメント
|
|
24
23
|
|
|
25
|
-
|
|
26
|
-
`src/pages/test.md` を次のような内容で保存します。
|
|
27
|
-
|
|
28
|
-
```
|
|
29
|
-
# 第一章 人情の碗
|
|
24
|
+
## 主な特徴
|
|
30
25
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
ファイル冒頭を `---` でくくると変数を指定できます。
|
|
39
|
-
|
|
40
|
-
`src/pages/test.md` の冒頭に次のような変数を設定してみましょう。
|
|
41
|
-
|
|
42
|
-
```markdown
|
|
43
|
-
---
|
|
44
|
-
title: 第一章 人情の碗
|
|
45
|
-
url: /the_book_of_tea/section_one
|
|
46
|
-
---
|
|
47
|
-
```
|
|
26
|
+
- Markdownファイルベースのコンテンツ管理
|
|
27
|
+
- フロントマターによるメタデータ定義
|
|
28
|
+
- テンプレートエンジン機能(変数展開、条件分岐、スクリプト実行)
|
|
29
|
+
- ホットリロード対応の開発サーバー
|
|
30
|
+
- CSSの自動結合・minify・キャッシュバスト
|
|
31
|
+
- ヘルパー関数による拡張性
|
|
32
|
+
- パッケージシステムによる機能拡張
|
|
48
33
|
|
|
49
|
-
|
|
34
|
+
## システム要件
|
|
50
35
|
|
|
51
|
-
|
|
52
|
-
次のように書き換えてみます。
|
|
36
|
+
- Node.js >= 21.7
|
|
53
37
|
|
|
38
|
+
## ライセンス
|
|
54
39
|
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
title: 第一章 人情の碗
|
|
58
|
-
url: /the_book_of_tea/section_one
|
|
59
|
-
---
|
|
60
|
-
|
|
61
|
-
# {{title}}
|
|
62
|
-
|
|
63
|
-
茶は薬用として始まり後飲料となる。シナにおいては八世紀に高雅な遊びの一つとして詩歌の域に達した。十五世紀に至り日本はこれを高めて一種の審美的宗教、すなわち茶道にまで進めた。茶道は日常生活の俗事の中に存する美しきものを崇拝することに基づく一種の儀式であって、純粋と調和、相互愛の神秘、社会秩序のローマン主義を諄々と教えるものでる。茶道の要義は「不完全なもの」を崇拝するにある。いわゆる人生というこの不可解なもののうちに、何か可能なものを成就しようとするやさしい企てであるから。
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
URLの変更は、変数による定義ではなく、ファイルを移動しても問題ありません。
|
|
67
|
-
`src/pages/test.md` を `src/pages/the_book_of_tea/section_one.md` としてファイルを移動すれば、変数定義がなくてもこのURLになります。
|
|
68
|
-
|
|
69
|
-
## テンプレート
|
|
70
|
-
|
|
71
|
-
タイトルが重複して表示されて鬱陶しいので、テンプレートを編集します。
|
|
72
|
-
|
|
73
|
-
`src/template/default.html` を開き、h1 を削除しましょう。
|
|
74
|
-
|
|
75
|
-
```diff
|
|
76
|
-
<article class="container">
|
|
77
|
-
- <h1>{{TITLE}}</h1>
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
## 設定ファイル
|
|
81
|
-
|
|
82
|
-
サイト全体の名称がデフォルトのままでは味気ないので変えましょう。
|
|
83
|
-
blog.json を開いて、 `site_name` を変更します。
|
|
84
|
-
|
|
85
|
-
```json
|
|
86
|
-
{
|
|
87
|
-
"site_name": "茶の本",
|
|
88
|
-
"url_base": "http://localhost:8000",
|
|
89
|
-
"src_dir": "src",
|
|
90
|
-
"dist_dir": "dist",
|
|
91
|
-
"distribute_raw": "image",
|
|
92
|
-
"helper": "index.js"
|
|
93
|
-
}
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
設定ファイルを変更したら、一旦 `CTRL+c` で `npx server` を停止して、もういちど `npx server` を実行します。
|
|
97
|
-
ヘッダーが「茶の本」になっていたら設定更新が完了です。
|
|
40
|
+
MIT
|
package/docs/develop.md
ADDED
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
# @tenjuu99/blog — 開発ガイド
|
|
2
|
+
|
|
3
|
+
このドキュメントは `@tenjuu99/blog` ライブラリを開発する際のガイドです。
|
|
4
|
+
|
|
5
|
+
**注意**: このライブラリを使用してウェブサイトを構築する方法ではなく、ライブラリ自体を開発・改善するための情報を提供します。
|
|
6
|
+
|
|
7
|
+
## 前提知識
|
|
8
|
+
|
|
9
|
+
完全な仕様は [spec.md](spec.md) を参照してください。このドキュメントでは開発のコツや実践的な情報のみ記載します。
|
|
10
|
+
|
|
11
|
+
## 開発環境のセットアップ
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
git clone https://github.com/amashigeseiji/tenjuu99-blog.git
|
|
15
|
+
cd tenjuu99-blog
|
|
16
|
+
npm install
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### 動作確認
|
|
20
|
+
|
|
21
|
+
サンプルプロジェクトで動作確認:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm run dev # 開発サーバー起動 (src-sample/ を使用)
|
|
25
|
+
npm run generate # 静的サイト生成
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## プロジェクト構造
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
tenjuu99-blog/
|
|
32
|
+
├── lib/ # コアライブラリ(メインロジック)
|
|
33
|
+
├── bin/ # CLIコマンド
|
|
34
|
+
├── src-sample/ # サンプルプロジェクト(動作確認用)
|
|
35
|
+
├── packages/ # コアパッケージ
|
|
36
|
+
├── index.js # エントリーポイント
|
|
37
|
+
├── package.json
|
|
38
|
+
└── README.md
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## lib/ ディレクトリの構成
|
|
42
|
+
|
|
43
|
+
各モジュールの役割:
|
|
44
|
+
|
|
45
|
+
### コア処理
|
|
46
|
+
|
|
47
|
+
| ファイル | 役割 |
|
|
48
|
+
|---------|------|
|
|
49
|
+
| `config.js` | 設定管理(blog.json読み込み) |
|
|
50
|
+
| `pageData.js` | フロントマター解析・ページデータ生成 |
|
|
51
|
+
| `indexer.js` | 全ページをスキャンして `allData` オブジェクト生成 |
|
|
52
|
+
| `render.js` | ページレンダリング(Markdown変換、フィルター適用) |
|
|
53
|
+
| `generate.js` | 静的サイト生成プロセス全体の制御 |
|
|
54
|
+
| `distribute.js` | ビルド結果の出力・ファイルコピー |
|
|
55
|
+
|
|
56
|
+
### テンプレート処理
|
|
57
|
+
|
|
58
|
+
| ファイル | 役割 |
|
|
59
|
+
|---------|------|
|
|
60
|
+
| `applyTemplate.js` | テンプレート読み込み・適用 |
|
|
61
|
+
| `filter.js` | `{if}` 条件分岐、`{script}` 実行 |
|
|
62
|
+
| `includeFilter.js` | `{include()}` ディレクティブ処理 |
|
|
63
|
+
| `replaceVariablesFilter.js` | `{{変数}}` 展開、ヘルパー関数実行 |
|
|
64
|
+
|
|
65
|
+
### CSS処理
|
|
66
|
+
|
|
67
|
+
| ファイル | 役割 |
|
|
68
|
+
|---------|------|
|
|
69
|
+
| `cssGenerator.js` | CSS結合・minify・キャッシュバスト |
|
|
70
|
+
| `minify.js` | CSS/HTML minify |
|
|
71
|
+
|
|
72
|
+
### サーバー
|
|
73
|
+
|
|
74
|
+
| ファイル | 役割 |
|
|
75
|
+
|---------|------|
|
|
76
|
+
| `server.js` | HTTPサーバー(開発用) |
|
|
77
|
+
| `tryServer.js` | カスタムサーバーハンドラー |
|
|
78
|
+
| `watcher.js` | ファイル監視 |
|
|
79
|
+
| `contentType.js` | MIMEタイプ判定 |
|
|
80
|
+
|
|
81
|
+
### ユーティリティ
|
|
82
|
+
|
|
83
|
+
| ファイル | 役割 |
|
|
84
|
+
|---------|------|
|
|
85
|
+
| `dir.js` | ディレクトリパス定義・キャッシュ管理 |
|
|
86
|
+
| `files.js` | 静的ファイル読み込み・キャッシュ |
|
|
87
|
+
| `helper.js` | ユーザー定義ヘルパー関数読み込み |
|
|
88
|
+
|
|
89
|
+
## 開発ワークフロー
|
|
90
|
+
|
|
91
|
+
### 1. 機能追加の基本フロー
|
|
92
|
+
|
|
93
|
+
1. **仕様検討**: 追加する機能の要件を明確化
|
|
94
|
+
2. **影響範囲調査**: どのモジュールに影響があるか確認
|
|
95
|
+
3. **テスト作成**: 機能の振る舞いを定義するテストコードを先に書く(TDD推奨)
|
|
96
|
+
4. **実装**: 該当モジュールを編集してテストをパスさせる
|
|
97
|
+
5. **動作確認**: `src-sample/` で実際の動作テスト
|
|
98
|
+
6. **ドキュメント更新**: `docs/spec.md` を更新
|
|
99
|
+
|
|
100
|
+
#### TDD(テスト駆動開発)のワークフロー
|
|
101
|
+
|
|
102
|
+
新機能の実装時は、以下のTDDサイクルを推奨します:
|
|
103
|
+
|
|
104
|
+
**Red → Green → Refactor サイクル:**
|
|
105
|
+
|
|
106
|
+
1. **Red(テスト作成)**: 失敗するテストを書く
|
|
107
|
+
```bash
|
|
108
|
+
# test/ ディレクトリにテストファイルを作成
|
|
109
|
+
# 例: test/category-tree.test.js
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
2. **Green(最小限の実装)**: テストがパスする最小限のコードを書く
|
|
113
|
+
```bash
|
|
114
|
+
# 実装を追加
|
|
115
|
+
# 例: packages/category/helper/category.js
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
3. **テスト実行**: すべてのテストが通ることを確認
|
|
119
|
+
```bash
|
|
120
|
+
npm test
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
4. **Refactor(リファクタリング)**: コードを改善(テストは変更しない)
|
|
124
|
+
|
|
125
|
+
**テストファイルの配置:**
|
|
126
|
+
|
|
127
|
+
- `test/` ディレクトリに `*.test.js` 形式で配置
|
|
128
|
+
- Node.js標準のテストランナーを使用(`node --test`)
|
|
129
|
+
|
|
130
|
+
**テストの例:**
|
|
131
|
+
|
|
132
|
+
```javascript
|
|
133
|
+
// test/example.test.js
|
|
134
|
+
import { test } from 'node:test'
|
|
135
|
+
import assert from 'node:assert'
|
|
136
|
+
import { myFunction } from '../lib/myModule.js'
|
|
137
|
+
|
|
138
|
+
test('機能の説明', () => {
|
|
139
|
+
const result = myFunction('input')
|
|
140
|
+
assert.strictEqual(result, 'expected')
|
|
141
|
+
})
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**実装例(カテゴリー機能の場合):**
|
|
145
|
+
|
|
146
|
+
1. `test/category-tree.test.js` - カテゴリーツリー構築のテスト(12件)
|
|
147
|
+
2. `packages/category/helper/category.js` - 実装
|
|
148
|
+
3. `npm test` - テスト実行
|
|
149
|
+
4. すべてパス後、次のテストを作成
|
|
150
|
+
|
|
151
|
+
このアプローチにより:
|
|
152
|
+
- 仕様が明確になる
|
|
153
|
+
- リグレッションを防止できる
|
|
154
|
+
- リファクタリングが安全になる
|
|
155
|
+
|
|
156
|
+
### 2. バグ修正のフロー
|
|
157
|
+
|
|
158
|
+
1. **再現**: `src-sample/` で問題を再現
|
|
159
|
+
2. **原因特定**: 該当モジュールを特定
|
|
160
|
+
3. **修正**: コードを修正
|
|
161
|
+
4. **検証**: 再度 `src-sample/` でテスト
|
|
162
|
+
5. **リグレッションチェック**: 他の機能に影響がないか確認
|
|
163
|
+
|
|
164
|
+
## 主要モジュールの開発ガイド
|
|
165
|
+
|
|
166
|
+
### pageData.js の編集
|
|
167
|
+
|
|
168
|
+
フロントマターの解析ロジックを変更する際:
|
|
169
|
+
|
|
170
|
+
- `parse()`: メタデータ抽出
|
|
171
|
+
- `parseMetaData()`: フロントマターのパース(JSON対応)
|
|
172
|
+
- デフォルト値の変更: `metaDataDefault` オブジェクト
|
|
173
|
+
|
|
174
|
+
**注意点**:
|
|
175
|
+
- `config.` プレフィックスで設定値を参照可能(lib/pageData.js:74-77)
|
|
176
|
+
- 複数行文字列は `"` で開始・終了(lib/pageData.js:80-89)
|
|
177
|
+
|
|
178
|
+
### filter.js の編集
|
|
179
|
+
|
|
180
|
+
テンプレートエンジンの機能追加:
|
|
181
|
+
|
|
182
|
+
- `replaceIfFilter()`: if文処理
|
|
183
|
+
- `ifConditionEvaluator()`: 条件評価ロジック
|
|
184
|
+
- `replaceScriptFilter()`: SSGスクリプト実行
|
|
185
|
+
|
|
186
|
+
**注意点**:
|
|
187
|
+
- `{if}` と `<if>` 両方の記法をサポート(lib/filter.js:67)
|
|
188
|
+
- `helper` 関数へのアクセスは `helper` オブジェクト経由(lib/filter.js:94)
|
|
189
|
+
- `Promise` 対応済み(lib/filter.js:95-96)
|
|
190
|
+
|
|
191
|
+
### cssGenerator.js の編集
|
|
192
|
+
|
|
193
|
+
CSS処理の変更:
|
|
194
|
+
|
|
195
|
+
- `cssGenerator()`: CSS結合・minify・ハッシュ生成
|
|
196
|
+
- `applyCss()`: テンプレート内のCSS記法を処理
|
|
197
|
+
|
|
198
|
+
**記法**: `${出力先<<元ファイル1,元ファイル2}` (lib/cssGenerator.js:54)
|
|
199
|
+
|
|
200
|
+
### watcher.js の編集
|
|
201
|
+
|
|
202
|
+
ファイル監視の変更:
|
|
203
|
+
|
|
204
|
+
- `watchers.push()`: 監視対象追加
|
|
205
|
+
- `prior: true` で優先度の高い監視を登録可能(lib/watcher.js:11)
|
|
206
|
+
|
|
207
|
+
### dir.js の重要性
|
|
208
|
+
|
|
209
|
+
**最初に読み込まれるモジュール**: 他のモジュールが `import` する前に実行されます。
|
|
210
|
+
|
|
211
|
+
- `cache()` 関数: `.cache/` ディレクトリへのコピー
|
|
212
|
+
- パッケージの統合処理(lib/dir.js:34-51)
|
|
213
|
+
- 自動実行: `import` 時に自動で `cache()` が呼ばれる(lib/dir.js:64)
|
|
214
|
+
|
|
215
|
+
**注意**: `dir.js` の変更は広範囲に影響するため慎重に行ってください。
|
|
216
|
+
|
|
217
|
+
## パッケージ開発
|
|
218
|
+
|
|
219
|
+
### パッケージ構成
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
packages/{パッケージ名}/
|
|
223
|
+
├── {パッケージ名}.js # ヘルパー関数(必須)
|
|
224
|
+
├── template/ # テンプレートファイル(任意)
|
|
225
|
+
├── css/ # スタイルシート(任意)
|
|
226
|
+
└── helper/ # 追加ヘルパー(任意)
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### パッケージの動作
|
|
230
|
+
|
|
231
|
+
1. `blog.json` の `packages` で有効化
|
|
232
|
+
2. `dir.js` の `cache()` で `.cache/` にコピー(lib/dir.js:34-51)
|
|
233
|
+
3. `{パッケージ名}.js` が自動的に `helper` に追加
|
|
234
|
+
|
|
235
|
+
### 既存パッケージの参考
|
|
236
|
+
|
|
237
|
+
- `packages/breadcrumbs/` - パンくずリスト機能
|
|
238
|
+
- `packages/editor/` - エディター機能
|
|
239
|
+
- `packages/turbolink/` - Turbolink機能
|
|
240
|
+
|
|
241
|
+
## デバッグ方法
|
|
242
|
+
|
|
243
|
+
### 1. console.log デバッグ
|
|
244
|
+
|
|
245
|
+
各モジュールに `console.log()` を追加:
|
|
246
|
+
|
|
247
|
+
```javascript
|
|
248
|
+
// lib/pageData.js
|
|
249
|
+
const parse = (content, name, ext) => {
|
|
250
|
+
console.log('Parsing:', name, ext)
|
|
251
|
+
// ...
|
|
252
|
+
}
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### 2. ビルドプロセスの確認
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
npm run generate
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
- 青色: 情報メッセージ(キャッシュ、インデックス)
|
|
262
|
+
- 緑色: 成功(ファイル生成)
|
|
263
|
+
- 赤色: エラー(ファイル削除、404)
|
|
264
|
+
|
|
265
|
+
ログ出力は `node:util` の `styleText()` を使用(lib/generate.js:6, lib/dir.js:3)
|
|
266
|
+
|
|
267
|
+
### 3. .cache/ ディレクトリの確認
|
|
268
|
+
|
|
269
|
+
ビルド時に `.cache/` ディレクトリが作成されます:
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
ls -la .cache/
|
|
273
|
+
cat .cache/index.json # ページインデックス
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### 4. dist/ の確認
|
|
277
|
+
|
|
278
|
+
生成されたHTMLを直接確認:
|
|
279
|
+
|
|
280
|
+
```bash
|
|
281
|
+
cat dist/index.html
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
## Claude Code での開発のコツ
|
|
285
|
+
|
|
286
|
+
### 1. モジュール間の依存関係を把握
|
|
287
|
+
|
|
288
|
+
各モジュールがどのモジュールをimportしているか確認:
|
|
289
|
+
|
|
290
|
+
```bash
|
|
291
|
+
grep -r "import.*from.*lib/" lib/
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### 2. 変更影響範囲の特定
|
|
295
|
+
|
|
296
|
+
特定の関数がどこで使われているか検索:
|
|
297
|
+
|
|
298
|
+
```bash
|
|
299
|
+
grep -r "関数名" lib/
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### 3. フロー全体の理解
|
|
303
|
+
|
|
304
|
+
ビルドプロセス全体:
|
|
305
|
+
1. `bin/dev-server` または `bin/server` 実行
|
|
306
|
+
2. `lib/generate.js` 呼び出し
|
|
307
|
+
3. `lib/indexer.js` で全ページスキャン
|
|
308
|
+
4. `lib/render.js` で各ページレンダリング
|
|
309
|
+
5. `lib/distribute.js` で出力
|
|
310
|
+
|
|
311
|
+
### 4. エントリーポイントの確認
|
|
312
|
+
|
|
313
|
+
- `index.js`: ライブラリとしてのエクスポート
|
|
314
|
+
- `bin/server`: 本番サーバー
|
|
315
|
+
- `bin/dev-server`: 開発サーバー(ホットリロード)
|
|
316
|
+
- `bin/generate`: 静的サイト生成のみ
|
|
317
|
+
- `bin/new`: 新規プロジェクト作成
|
|
318
|
+
|
|
319
|
+
## よくある問題と対処法
|
|
320
|
+
|
|
321
|
+
### 1. キャッシュ問題
|
|
322
|
+
|
|
323
|
+
`.cache/` ディレクトリが古い状態の場合:
|
|
324
|
+
|
|
325
|
+
```bash
|
|
326
|
+
rm -rf .cache/
|
|
327
|
+
npm run dev
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### 2. テンプレートが反映されない
|
|
331
|
+
|
|
332
|
+
`lib/applyTemplate.js` のキャッシュをクリア:
|
|
333
|
+
- 開発サーバー再起動で自動クリア
|
|
334
|
+
|
|
335
|
+
### 3. ヘルパー関数が認識されない
|
|
336
|
+
|
|
337
|
+
- `blog.json` の `helper` 設定を確認
|
|
338
|
+
- `lib/helper.js` が正しくimportしているか確認
|
|
339
|
+
- パッケージの場合、`dir.js` でヘルパーが追加されているか確認
|
|
340
|
+
|
|
341
|
+
### 4. パッケージが有効化されない
|
|
342
|
+
|
|
343
|
+
- `blog.json` の `packages` 設定を確認
|
|
344
|
+
- `packages/{パッケージ名}/{パッケージ名}.js` が存在するか確認
|
|
345
|
+
- `.cache/helper/{パッケージ名}.js` にコピーされているか確認
|
|
346
|
+
|
|
347
|
+
## 制約事項と設計上の注意
|
|
348
|
+
|
|
349
|
+
### 1. 同期処理の制約
|
|
350
|
+
|
|
351
|
+
- `includeFilter.js`: 同期処理のため `await` 不可(lib/includeFilter.js:22)
|
|
352
|
+
- `files.js` の `warmUp()` で事前読み込みが必要
|
|
353
|
+
|
|
354
|
+
### 2. 変数名の小文字化
|
|
355
|
+
|
|
356
|
+
- `replaceVariablesFilter.js`: 変数名を強制的に小文字化(lib/replaceVariablesFilter.js:13)
|
|
357
|
+
- 大文字小文字を区別したい場合は別の方法を検討
|
|
358
|
+
|
|
359
|
+
### 3. eval() の使用
|
|
360
|
+
|
|
361
|
+
- `pageData.js`: `config.` 参照に `eval()` を使用(lib/pageData.js:76)
|
|
362
|
+
- セキュリティ上の理由で将来的に変更の可能性あり
|
|
363
|
+
|
|
364
|
+
### 4. フロントマターパーサー
|
|
365
|
+
|
|
366
|
+
- YAML完全互換ではなく独自実装(lib/pageData.js:61-93)
|
|
367
|
+
- 配列・オブジェクトはJSON形式必須
|
|
368
|
+
|
|
369
|
+
## テストについて
|
|
370
|
+
|
|
371
|
+
### テストフレームワーク
|
|
372
|
+
|
|
373
|
+
**Node.js標準の `node:test` を使用** - 追加の依存関係なし
|
|
374
|
+
|
|
375
|
+
```bash
|
|
376
|
+
npm test # 全テスト実行
|
|
377
|
+
npm run test:watch # ウォッチモード
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
### テストの追加方法
|
|
381
|
+
|
|
382
|
+
新しいテストを追加する場合:
|
|
383
|
+
|
|
384
|
+
```javascript
|
|
385
|
+
// test/example.test.js
|
|
386
|
+
import { test } from 'node:test';
|
|
387
|
+
import assert from 'node:assert';
|
|
388
|
+
|
|
389
|
+
test('テストの説明', () => {
|
|
390
|
+
assert.strictEqual(actual, expected);
|
|
391
|
+
});
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
### 統合テスト
|
|
395
|
+
|
|
396
|
+
ユニットテストに加えて、`src-sample/` での手動テストも推奨します。
|
|
397
|
+
|
|
398
|
+
## コントリビューション
|
|
399
|
+
|
|
400
|
+
### コーディングスタイル
|
|
401
|
+
|
|
402
|
+
- ES Modules使用(`import/export`)
|
|
403
|
+
- `"use strict"` は一部モジュールで使用
|
|
404
|
+
- JSDocコメントは部分的に記載
|
|
405
|
+
|
|
406
|
+
### 変更を加える際の確認事項
|
|
407
|
+
|
|
408
|
+
1. `src-sample/` で動作確認
|
|
409
|
+
2. 既存機能が壊れていないか確認
|
|
410
|
+
3. `docs/spec.md` を更新
|
|
411
|
+
4. `README.md` が必要に応じて更新
|
|
412
|
+
|
|
413
|
+
## パフォーマンス最適化
|
|
414
|
+
|
|
415
|
+
### 現在の最適化
|
|
416
|
+
|
|
417
|
+
1. **テンプレートキャッシュ**: `lib/applyTemplate.js` と `lib/files.js`
|
|
418
|
+
2. **CSSキャッシュバスト**: MD5ハッシュで変更検知(lib/cssGenerator.js:32)
|
|
419
|
+
3. **差分ビルド**: 開発サーバーでは変更ページのみ再生成
|
|
420
|
+
|
|
421
|
+
### 最適化の余地
|
|
422
|
+
|
|
423
|
+
- ページデータのキャッシュ
|
|
424
|
+
- 並列処理の導入
|
|
425
|
+
- インクリメンタルビルド
|
|
426
|
+
|
|
427
|
+
## 参考リソース
|
|
428
|
+
|
|
429
|
+
- [spec.md](spec.md) — 完全な技術仕様
|
|
430
|
+
- [README.md](../README.md) — ユーザー向けガイド
|
|
431
|
+
- GitHub Issues — バグ報告・機能要望
|
|
432
|
+
- `src-sample/` — サンプルプロジェクト(動作確認用)
|