@ywal123456/jskim 0.1.1 → 0.3.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/README.md +113 -145
- package/docs/configuration.md +217 -175
- package/docs/create-jskim.md +22 -7
- package/package.json +1 -1
- package/scripts/commands/dev-command.js +10 -109
- package/scripts/commands/watch-command.js +15 -25
- package/scripts/lib/build-project.js +18 -12
- package/scripts/lib/create-nunjucks-env.js +39 -1
- package/scripts/lib/create-watch-runtime.js +516 -0
- package/scripts/lib/merge-config.js +87 -2
- package/scripts/lib/process-files.js +263 -0
- package/scripts/lib/render-pages.js +17 -1
- package/scripts/lib/resolve-project.js +152 -28
- package/scripts/lib/resolve-watch-paths.js +31 -13
package/README.md
CHANGED
|
@@ -2,18 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
Nunjucks を使った汎用の静的 HTML ビルド環境です。
|
|
4
4
|
|
|
5
|
-
特定のアプリ構成、業務ロジック、CSS/JS 設計、Git
|
|
6
|
-
Nunjucks ソースを設定に従って静的 HTML にレンダリングし、assets をコピーして配布可能な結果を作ります。
|
|
5
|
+
特定のアプリ構成、業務ロジック、CSS/JS 設計、Git 運用、デプロイ基盤を強制しません。`jskim.config.js` に従ってソースを処理し、配布可能な静的ファイルを `outputDir` に生成します。
|
|
7
6
|
|
|
8
7
|
## 現在の対応範囲
|
|
9
8
|
|
|
10
|
-
- `
|
|
11
|
-
-
|
|
12
|
-
- Nunjucks
|
|
13
|
-
- 静的ファイルのコピー
|
|
14
|
-
- outputDir の clean
|
|
9
|
+
- `files` pipeline による Nunjucks レンダリングと静的ファイルコピー
|
|
10
|
+
- legacy `render` / `copy` 設定の継続サポート
|
|
11
|
+
- `data`、Nunjucks `filters` / `globals`
|
|
15
12
|
- `rootPath` の自動注入
|
|
16
|
-
-
|
|
13
|
+
- outputDir の clean
|
|
17
14
|
- ファイル監視(`watch`)後の全体再ビルド
|
|
18
15
|
- ビルド結果のローカル静的サーバー(`serve`)
|
|
19
16
|
- 開発サーバー(`dev` = build + watch + serve)
|
|
@@ -25,12 +22,13 @@ Nunjucks ソースを設定に従って静的 HTML にレンダリングし、as
|
|
|
25
22
|
|
|
26
23
|
- ブラウザ自動起動
|
|
27
24
|
- HMR / CSS だけのホット更新
|
|
28
|
-
-
|
|
29
|
-
- JSON データの自動読み込み
|
|
25
|
+
- JSON / YAML などの外部データファイル自動読み込み
|
|
30
26
|
- API / Mock API
|
|
31
|
-
- config の hot reload
|
|
32
27
|
- 増分ビルド
|
|
33
28
|
- SPA fallback / proxy
|
|
29
|
+
- formatter 機能
|
|
30
|
+
|
|
31
|
+
既存 HTML の自動 import / migration は JSKim core の責任範囲外です。既存 source の移行は利用者が project に合わせて行います。将来必要になった場合も、JSKim 本体ではなく独立した tool / package として検討します。
|
|
34
32
|
|
|
35
33
|
## パッケージの役割
|
|
36
34
|
|
|
@@ -46,6 +44,7 @@ Nunjucks ソースを設定に従って静的 HTML にレンダリングし、as
|
|
|
46
44
|
|
|
47
45
|
詳細:
|
|
48
46
|
|
|
47
|
+
- [docs/configuration.md](docs/configuration.md)
|
|
49
48
|
- [docs/create-jskim.md](docs/create-jskim.md)
|
|
50
49
|
- [docs/publishing.md](docs/publishing.md)(maintainer 向け release 手順)
|
|
51
50
|
|
|
@@ -67,6 +66,8 @@ npm create jskim@latest
|
|
|
67
66
|
npx create-jskim my-project
|
|
68
67
|
```
|
|
69
68
|
|
|
69
|
+
生成器は自動で `npm install` / `git init` を実行しません。空ではない既存ディレクトリも上書きしません。
|
|
70
|
+
|
|
70
71
|
## CLI
|
|
71
72
|
|
|
72
73
|
```bash
|
|
@@ -91,8 +92,6 @@ jskim dev <project>
|
|
|
91
92
|
|
|
92
93
|
要点:
|
|
93
94
|
|
|
94
|
-
- npm package 名は `@ywal123456/jskim`(scoped)
|
|
95
|
-
- インストール後の CLI binary 名は `jskim`
|
|
96
95
|
- コマンドは実行したディレクトリの `process.cwd()` をプロジェクトルートとして扱う
|
|
97
96
|
- パッケージのインストール先(`node_modules/@ywal123456/jskim`)を作業空間とはみなさない
|
|
98
97
|
- プロジェクトルートに `jskim.config.js` が必要
|
|
@@ -104,44 +103,89 @@ jskim --help
|
|
|
104
103
|
jskim --version
|
|
105
104
|
```
|
|
106
105
|
|
|
107
|
-
##
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
106
|
+
## files pipeline
|
|
107
|
+
|
|
108
|
+
v0.3.0 以降の推奨設定は `files` です。`files[].from` 配下を走査し、末尾が `.njk` のファイルは Nunjucks でレンダリングして末尾の `.njk` だけを外します。それ以外のファイルは byte copy します。
|
|
109
|
+
|
|
110
|
+
```js
|
|
111
|
+
module.exports = {
|
|
112
|
+
defaults: {
|
|
113
|
+
files: [{ from: 'pages', to: '' }],
|
|
114
|
+
templates: ['layouts', 'components'],
|
|
115
|
+
},
|
|
116
|
+
projects: {
|
|
117
|
+
sample: {
|
|
118
|
+
sourceDir: 'src/sample',
|
|
119
|
+
outputDir: 'dist/sample',
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
};
|
|
113
123
|
```
|
|
114
124
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
125
|
+
例:
|
|
126
|
+
|
|
127
|
+
```text
|
|
128
|
+
src/sample/pages/index.html.njk → dist/sample/index.html
|
|
129
|
+
src/sample/pages/assets/css/style.css.njk → dist/sample/assets/css/style.css
|
|
130
|
+
src/sample/pages/assets/image/logo.svg → dist/sample/assets/image/logo.svg
|
|
119
131
|
```
|
|
120
132
|
|
|
121
|
-
|
|
122
|
-
- 空ではない既存ディレクトリは上書きしません
|
|
133
|
+
推奨命名:
|
|
123
134
|
|
|
124
|
-
|
|
135
|
+
- HTML は `index.html.njk`、`request/index.html.njk` のように最終拡張子を含める
|
|
136
|
+
- CSS / JS を Nunjucks で処理する場合は `style.css.njk`、`main.js.njk` のように書く
|
|
137
|
+
- 画像などテンプレート処理しないファイルは通常の拡張子のまま置く
|
|
125
138
|
|
|
126
|
-
|
|
139
|
+
`templates` に指定した `layouts` / `components` は loader の検索パスになり、直接出力されません。
|
|
127
140
|
|
|
128
|
-
|
|
141
|
+
legacy の `render` / `copy` も引き続き使えます。ただし同じプロジェクトで `files` と `render` / `copy` は同時に設定できません。詳細は [docs/configuration.md](docs/configuration.md) を参照してください。
|
|
129
142
|
|
|
130
|
-
|
|
131
|
-
|
|
143
|
+
## data / filters / globals
|
|
144
|
+
|
|
145
|
+
`defaults.data` と project の `data` はテンプレート context に渡されます。Nunjucks の filter / global も `jskim.config.js` から登録できます。
|
|
146
|
+
|
|
147
|
+
```js
|
|
148
|
+
data: {
|
|
149
|
+
site: { name: 'JSKim Sample', language: 'ja' },
|
|
150
|
+
},
|
|
151
|
+
nunjucks: {
|
|
152
|
+
filters: {
|
|
153
|
+
formatPrice(value) {
|
|
154
|
+
return `${Number(value).toLocaleString('ja-JP')}円`;
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
globals: {
|
|
158
|
+
currentYear() {
|
|
159
|
+
return new Date().getFullYear();
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Nunjucks は `autoescape: true` です。JavaScript に JSON を埋め込む filter は `nunjucks.runtime.SafeString` を返してください。
|
|
166
|
+
|
|
167
|
+
```js
|
|
168
|
+
toJson(value) {
|
|
169
|
+
const nunjucks = require('nunjucks');
|
|
170
|
+
return new nunjucks.runtime.SafeString(JSON.stringify(value));
|
|
171
|
+
}
|
|
132
172
|
```
|
|
133
173
|
|
|
134
|
-
|
|
174
|
+
機密情報を `data` やテンプレートへ入れると、生成済み HTML / JS / CSS に含まれる可能性があります。API key、token、社内 URL などの secret は公開成果物に混入しないよう確認してください。
|
|
175
|
+
|
|
176
|
+
## このリポジトリでの開発コマンド
|
|
177
|
+
|
|
178
|
+
開発リポジトリでは従来どおり `npm run` も使えます。
|
|
135
179
|
|
|
136
180
|
```bash
|
|
181
|
+
npm install
|
|
137
182
|
npm run build -- sample
|
|
138
|
-
|
|
139
|
-
jskim build sample
|
|
183
|
+
npm run dev -- sample
|
|
140
184
|
```
|
|
141
185
|
|
|
142
186
|
`sample` は `jskim.config.js` の `projects` に登録されたプロジェクト名です。
|
|
143
187
|
|
|
144
|
-
##
|
|
188
|
+
## watch
|
|
145
189
|
|
|
146
190
|
```bash
|
|
147
191
|
npm run watch -- sample
|
|
@@ -156,152 +200,68 @@ jskim watch sample
|
|
|
156
200
|
3. 変更検知後、debounce して全体ビルドを再実行
|
|
157
201
|
4. ビルドエラーがあってもウォッチャーは維持し、次の保存で再試行
|
|
158
202
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
マージ済みプロジェクト設定から計算します。
|
|
162
|
-
|
|
163
|
-
- `sourceDir` + `render[].from`(例: `src/sample/pages`)
|
|
164
|
-
- `sourceDir` + `templates[]`(例: `src/sample/layouts`, `src/sample/components`)
|
|
165
|
-
- `sourceDir` + `copy[].from`(例: `src/sample/assets`)
|
|
166
|
-
|
|
167
|
-
`dist/`、`node_modules/`、`outputDir` は監視しません。
|
|
203
|
+
監視対象はマージ済みプロジェクト設定から計算します。
|
|
168
204
|
|
|
169
|
-
|
|
205
|
+
- files mode: `sourceDir` + `files[].from`、`sourceDir` + `templates[]`
|
|
206
|
+
- legacy mode: `sourceDir` + `render[].from`、`sourceDir` + `templates[]`、`sourceDir` + `copy[].from`
|
|
207
|
+
- `dist/`、`node_modules/`、`outputDir` は監視しません
|
|
170
208
|
|
|
171
|
-
|
|
172
|
-
- `build.clean: true` のとき、再ビルドで outputDir を消して作り直すため、ソース削除も結果に反映されます。
|
|
173
|
-
- `jskim.config.js` を変更した場合は **watch / dev を再起動** してください(config hot reload なし)。
|
|
174
|
-
- 終了: `Ctrl+C`(SIGINT)または SIGTERM → `[JSKim] ウォッチを停止しました。`
|
|
209
|
+
`watch` / `dev` は `jskim.config.js` の変更を検知し、正常なら監視対象を更新して全体ビルドします。`dev` で `outputDir` / `serve.host` / `serve.port` / `dev.liveReload` を変えた場合は process 再起動が必要です。
|
|
175
210
|
|
|
176
|
-
|
|
211
|
+
## serve / dev
|
|
177
212
|
|
|
178
|
-
|
|
213
|
+
`serve` は **すでにビルドされた** `outputDir` をローカルで確認するためのコマンドです。
|
|
179
214
|
|
|
180
215
|
```bash
|
|
181
216
|
npm run build -- sample
|
|
182
217
|
npm run serve -- sample
|
|
183
|
-
# または
|
|
184
|
-
jskim build sample
|
|
185
|
-
jskim serve sample
|
|
186
218
|
```
|
|
187
219
|
|
|
188
|
-
`
|
|
189
|
-
|
|
190
|
-
- 自動で build / watch は実行しません
|
|
191
|
-
- サーバールートは `outputDir`(例: `dist/sample`)
|
|
192
|
-
- 対応 HTTP メソッドは `GET` と `HEAD` のみ
|
|
193
|
-
- ライブリロードはありません(HTML を変換しません)
|
|
194
|
-
- ローカル確認用です(本番サーバー機能ではありません)
|
|
195
|
-
|
|
196
|
-
既定の接続先:
|
|
197
|
-
|
|
198
|
-
```text
|
|
199
|
-
http://127.0.0.1:3000/
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
`host` / `port` は `jskim.config.js` の `serve` で変更できます。
|
|
203
|
-
|
|
204
|
-
`outputDir` が無い場合は、先に build するよう案内して終了します。
|
|
205
|
-
|
|
206
|
-
終了: `Ctrl+C` → `[JSKim] 静的サーバーを停止しました。`
|
|
207
|
-
|
|
208
|
-
## 開発サーバー(dev)
|
|
220
|
+
`dev` は build + watch + serve を統合します。
|
|
209
221
|
|
|
210
222
|
```bash
|
|
211
223
|
npm run dev -- sample
|
|
212
|
-
# または
|
|
213
|
-
jskim dev sample
|
|
214
224
|
```
|
|
215
225
|
|
|
216
|
-
`dev` は次を統合します。
|
|
217
|
-
|
|
218
|
-
1. 初回に全体ビルド
|
|
219
|
-
2. 実際の `outputDir`(`dist`)を静的サーバーで提供
|
|
220
|
-
3. ファイル監視と全体再ビルド(`watch` と同じ debounce / 直列化)
|
|
221
|
-
4. **成功した再ビルドのあとだけ** ブラウザを全体リロード(SSE)
|
|
222
|
-
|
|
223
|
-
ポイント:
|
|
224
|
-
|
|
225
|
-
- メモリ専用レンダリングではなく、常に実際の `dist` を提供します
|
|
226
|
-
- ライブリロードは HMR ではなく **ページ全体の reload** です
|
|
227
|
-
- `dist` ファイルへ script を書き込みません。dev の HTML レスポンスにだけ一時注入します
|
|
228
|
-
- ビルドエラー時も watcher / server は維持し、reload は送りません
|
|
229
|
-
- ブラウザ自動起動はサポートしません
|
|
230
|
-
- `watch.debounce` / `serve.host` / `serve.port` / `dev.liveReload` を使います
|
|
231
|
-
|
|
232
226
|
既定 URL:
|
|
233
227
|
|
|
234
228
|
```text
|
|
235
229
|
http://127.0.0.1:3000/
|
|
236
230
|
```
|
|
237
231
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
設定を変えた場合は `dev` を再起動してください。
|
|
241
|
-
|
|
242
|
-
終了: `Ctrl+C` → `[JSKim] 開発サーバーを停止しました。`
|
|
243
|
-
|
|
244
|
-
### 予約パス `/_jskim/live-reload`
|
|
245
|
-
|
|
246
|
-
`dev.liveReload: true` のとき、JSKim が内部で使う予約パスです。
|
|
247
|
-
|
|
248
|
-
- 実際の静的ファイルパスとして使わないことを推奨します
|
|
249
|
-
- `serve` ではこの endpoint は有効になりません
|
|
250
|
-
- `dev.liveReload: false` のときも有効になりません
|
|
251
|
-
|
|
252
|
-
## テスト
|
|
253
|
-
|
|
254
|
-
```bash
|
|
255
|
-
npm test
|
|
256
|
-
```
|
|
232
|
+
ポイント:
|
|
257
233
|
|
|
258
|
-
|
|
234
|
+
- `serve` は自動で build / watch を実行しません
|
|
235
|
+
- サーバールートは `outputDir`(例: `dist/sample`)
|
|
236
|
+
- `serve` は HTML を変換せず、ライブリロード script を注入しません
|
|
237
|
+
- `dev` は成功した再ビルドのあとだけ SSE でページ全体 reload を送ります
|
|
238
|
+
- `dev` でも `dist` ファイルへ script は書き込みません
|
|
239
|
+
- ブラウザ自動起動はサポートしません
|
|
259
240
|
|
|
260
|
-
-
|
|
261
|
-
- 各テストは一時ワークスペース(`os.tmpdir`)で実行します
|
|
262
|
-
- build / watch / serve / dev / 言語ポリシーの回帰を検証します
|
|
241
|
+
`/_jskim/live-reload` は `dev.liveReload: true` のときだけ使う内部予約パスです。実際の静的ファイルパスとしては使わないことを推奨します。
|
|
263
242
|
|
|
264
243
|
## 基本ディレクトリ構成
|
|
265
244
|
|
|
266
245
|
```text
|
|
267
246
|
jskim/
|
|
268
247
|
├─ bin/
|
|
269
|
-
│ └─ jskim.js
|
|
270
248
|
├─ jskim.config.js
|
|
271
249
|
├─ scripts/
|
|
272
|
-
│ ├─ build.js
|
|
273
|
-
│ ├─ watch.js
|
|
274
|
-
│ ├─ serve.js
|
|
275
|
-
│ ├─ dev.js
|
|
276
|
-
│ └─ commands/
|
|
277
250
|
├─ src/
|
|
278
251
|
│ └─ sample/
|
|
279
252
|
│ ├─ pages/
|
|
253
|
+
│ │ ├─ index.html.njk
|
|
254
|
+
│ │ ├─ assets/
|
|
255
|
+
│ │ └─ request/
|
|
280
256
|
│ ├─ layouts/
|
|
281
|
-
│
|
|
282
|
-
│ └─ assets/
|
|
257
|
+
│ └─ components/
|
|
283
258
|
└─ dist/
|
|
284
259
|
└─ sample/
|
|
285
260
|
```
|
|
286
261
|
|
|
287
|
-
## jskim.config.js の役割
|
|
288
|
-
|
|
289
|
-
コマンドを実行したディレクトリ(`process.cwd()`)をワークスペースルートとし、そこに置いた `jskim.config.js` がビルド動作の基準です。
|
|
290
|
-
|
|
291
|
-
- `defaults`: 全プロジェクト共通の render / templates / copy / build / watch / serve / dev
|
|
292
|
-
- `projects`: プロジェクトごとの `sourceDir`、`outputDir`、および任意の上書き
|
|
293
|
-
|
|
294
|
-
詳細は [docs/configuration.md](docs/configuration.md) を参照してください。
|
|
295
|
-
|
|
296
|
-
## src と dist の関係
|
|
297
|
-
|
|
298
|
-
- `sourceDir`(例: `src/sample`)に Nunjucks ソースと assets を置きます
|
|
299
|
-
- `outputDir`(例: `dist/sample`)にレンダリング済み HTML とコピーされた静的ファイルが生成されます
|
|
300
|
-
- `dist/` はビルド成果物なので手編集しないでください
|
|
301
|
-
|
|
302
262
|
## rootPath の使い方
|
|
303
263
|
|
|
304
|
-
|
|
264
|
+
各 `.njk` ファイルの最終出力位置を基準に `rootPath` が自動計算され、Nunjucks context に注入されます。
|
|
305
265
|
|
|
306
266
|
```njk
|
|
307
267
|
<link rel="stylesheet" href="{{ rootPath }}assets/css/style.css">
|
|
@@ -311,12 +271,14 @@ jskim/
|
|
|
311
271
|
| 出力ファイル | rootPath |
|
|
312
272
|
|-----------|----------|
|
|
313
273
|
| `dist/sample/index.html` | `./` |
|
|
314
|
-
| `dist/sample/
|
|
315
|
-
| `dist/sample/guide/syntax/
|
|
274
|
+
| `dist/sample/request/index.html` | `../` |
|
|
275
|
+
| `dist/sample/guide/syntax/index.html` | `../../` |
|
|
276
|
+
|
|
277
|
+
`data.rootPath` は予約語のため使えません。
|
|
316
278
|
|
|
317
279
|
## sample
|
|
318
280
|
|
|
319
|
-
`src/sample` は
|
|
281
|
+
`src/sample` は files pipeline、`data`、custom filter、global、ページ別 assets を示す小さなサンプルです。
|
|
320
282
|
|
|
321
283
|
```bash
|
|
322
284
|
npm run build -- sample
|
|
@@ -327,6 +289,14 @@ npm run dev -- sample
|
|
|
327
289
|
|
|
328
290
|
ビルド後、`dist/sample/index.html` または `http://127.0.0.1:3000/` で確認できます。
|
|
329
291
|
|
|
292
|
+
## テスト
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
npm test
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
Node 標準の `node:test` / `node:assert` を使います。外部テスト framework は使いません。
|
|
299
|
+
|
|
330
300
|
## リポジトリ
|
|
331
301
|
|
|
332
302
|
- Repository: https://github.com/ywal123456-collab/jskim
|
|
@@ -334,6 +304,4 @@ npm run dev -- sample
|
|
|
334
304
|
|
|
335
305
|
## ライセンス
|
|
336
306
|
|
|
337
|
-
JSKim は MIT License
|
|
338
|
-
自由に使用・修正・再配布・商用利用できます。著作権表示と License 文言の保持が必要であり、無保証です。
|
|
339
|
-
詳細は [`LICENSE`](./LICENSE) を確認してください。
|
|
307
|
+
JSKim は MIT License のもとで提供されます。自由に使用・修正・再配布・商用利用できます。著作権表示と License 文言の保持が必要であり、無保証です。詳細は [`LICENSE`](./LICENSE) を確認してください。
|