ECMA-262 Restyled のレンダリングを Next.js + Nextra から Lume (Deno)へ移行した経緯と、移行後のアーキテクチャの記録(2026-06-03〜2026-06-06)。
関連: tc39 との意図的な差異は tc39-deviations.md。
注: 本ドキュメントは 移行完了時点(2026-06-06)のスナップショット。以降の 変更(
packages/shared→src/移動、draft-nextra→ ベンダリングnextra-poc、ES2015〜ES5.1 の追加、/pipeline撤去など)は反映していない。 現行構成はコードを参照。
- 全エディション(draft / es2026 / es2025 / es2024)を Lume が単一プロジェクト
lume/から版パラメータ化してビルド。 - 旧 Nextra サイト(
packages/site-draft,site-es2024/25/26)は退役・削除。packages/site-draft-nextraのみ比較用に残置(/ecma262/draft-nextra/)。 - 入力
ecma262/<id>/spec.html(ecmarkup ソース)をbuild-chapters.mjsが変換 (ecmarkup 非依存)→build-pages.tsが Lume ページ化 → Lume がレンダリング。
lume/ # 単一 Lume プロジェクト(旧 lume-poc)
_config.ts # jsx/mdx プラグイン、静的コピー、TOC 生成
_includes/ # 共通クロム(page/header/sidebar/footer/prev-next)
editions.ts # → packages/shared/editions.json を import
chapters.ts # → 生成 chapters.json の薄い型付きローダ
scripts/build-pages.ts # EDITION/BASE_PATH で版ごとにページ生成
styles.css search.js fonts/ favicon.svg hljs-github.css deno.json
# 生成物(gitignore・毎ビルド再生成): lib/*.jsx, *.mdx, img/, _includes/chapters.json
packages/shared/
editions.json # 全エディションの単一ソース(id + title, 新しい順)
scripts/{build-chapters,build-pages の呼出元,assemble-dist,editions,spec-source}.mjs
packages/site-draft-nextra/ # 比較用 Nextra(/draft-nextra)
ecma262/<id>/spec.html # draft=submodule, es2024/25/26=vendored snapshot
- 版ごと:
EDITION=<id> BASE_PATH=/ecma262/<id> deno task pages && deno task build - 結合:
pnpm assemble(=assemble-dist.mjs)が各版を Lume でビルドしdist/<id>/へ、site-draft-nextra/outをdist/draft-nextra/へ、ランディング (/,/about,/pipeline)を生成。CI(.github/workflows/nextjs.yml)はpnpm build:nextra(比較サイトのみ)→pnpm assemble→ Pages へデプロイ。 - 公開 URL:
/ecma262/{draft,es2026,es2025,es2024}/(Lume)、/ecma262/draft-nextra/(Nextra 比較)。/ecma262/は draft へリダイレクト。
- ecmarkup は流用しない。
spec.html(ecmarkup ソース)を自前build-chapters.mjsで変換。将来 ecmarkup に無い独自メタ情報を付加できるよう出力を所有するため。 - 版ごとにディレクトリを分けない。差分は spec ソース・base path・タイトルの
3 つ だけで、コンテンツは生成物・クロムは共通。1 プロジェクトを
EDITION/BASE_PATHenv で回す。 - 生成物は
gitignore(
lib/*.jsx・*.mdx・img/・chapters.json)。版数ぶんの コミット肥大と submodule 追従 churn を回避し、毎ビルド再生成。 editions.jsonを単一ソース化。editions.mjs(Node)とlume/_includes/editions.ts(Deno)が同じファイルを読み、タイトルの二重管理を解消。draft-nextraを比較用に残す。エディション一覧には載せず直 URL のみ。
単一章 PoC(lume-poc, notational-conventions)を tc39 multipage の実出力と
突き合わせ、build-chapters.mjs とスタイルを揃えた。
- 文法表示: グラムパネル撤去・注釈色・レイアウトを tc39 化(
f4bb2fb742e1eb)、 単一行 production を inline 維持(0e81d6b)、emu-production emu-gproseのmargin-right(3ac5a44)、collapsed production の margin カスケードを tc39 と 一致(詳細度 0,3,2→0,2,1、de83df8)。 emu-grammarのexample/definition種別を保持(5.2.3 の例示文法、096bfe0)。- オプショナル
?を 下付き "opt" にレンダリング(abeb497)。 emu-xrefのtitle属性で節タイトル展開(28fb93f)。- dfn 自動リンクの大小規則を ecmarkup と一致: 先頭文字レニエンシを一方向に
(
75d0a20)、自己参照抑制を「リンク先 id == 節 id」基準に + 大小衝突時に小文字 surface 優先(223bda7)。 - 抽象操作(aoid)の自動リンクを ecmarkup 同等に実装(
dec6187)。 - draft submodule を最新 main に更新(
48effc1)。
lume-pocを 全 38 章に拡張(build-pages.ts新設、3d4ef82)。- フッターの
.site-switchers(Nextra パリティではないと判明)を削除(fb98782)。 /ecma262/draft/を Nextra(site-draft)から Lume ビルドへ切替、site-draft削除(d238d09)。
3 段階の TODO(459de16)を実施:
lume-poc→lumeリネーム + 版パラメータ化(070eabc):EDITIONで spec ソース選択、BASE_PATHでリンクプレフィックス、章一覧・現在版を生成/env 化、 生成物を gitignore。assemble-dist.mjsを全版 Lume ループに(2c26650): 各版をEDITION/BASE_PATH付きでビルドしdist/<id>へ。CI を簡素化。- Nextra
site-es20xxを退役(b5f108e): 3 パッケージ削除、editions.jsonを単一ソース化、draft-nextra は別途任意コピーに。
/pipeline(「How it's built」)記事を Lume 構成に更新(f0c158b)。
- autolink の拡充: built-in function / internal・concrete method は未リンク (ecmarkup は一部リンクする)。
- Unicode プロパティ表: ecmarkup が Unicode DB から生成する表は vendored スナップショットに無く未解決(既知の制限)。
- 比較が済めば
site-draft-nextraも将来的に退役検討。