本文へ移動

Koyomi Calendars暦

カレンダーのページをSVGで描きます。1日を18種類のアイコンで、1か月をポスターや卓上カレンダーで、そして日めくりも使えます。

「暦」(こよみ) は、カレンダーのことです。 名前について(英語)

目次

解説

サイズとバンドル

各インポートがページに与える重さ、デザイン1つだけをインポートする方法、ほかが付いてこない理由、CIが守るバイトの予算を説明します。

English

パッケージの各部分は、それぞれ単独のインポートなので、ページは使うものの分だけを負担します。メインのインポートには18種類のデザインがすべて入っています。1つのデザインだけを描くページは、そのデザインを単独でインポートし、残りの17は読み込みません。

インポート最小化後gzip後
デザイン1つだけ、themes/pins8.8 kB4.0 kB
デザイン1つだけ、themes/squircle9.3 kB4.1 kB
日めくりのデザイン1つだけ、themes/sun24.7 kB10.9 kB
18種類すべて、メインのインポート48.3 kB19.1 kB
月間カレンダー、/month11.0 kB4.7 kB
ページめくり、/animate3.1 kB1.4 kB

サイズは、各エントリーをesbuildでバンドルして最小化し、ほかには何も加えずに測ったものです。日めくりのデザインには、描ける日本の暦のコードが含まれます。デモの表には、現在のビルドの数字が出ています。

デザイン1つだけ

import { calendarIcon } from "@johnmorrisdotca/koyomi-calendars/themes/squircle";

const svg = calendarIcon({ month: 11, day: 2, year: 2026, scheme: "dark" });
console.log(svg.startsWith("<svg"));
// true
true

デザイン自身のcalendarIconは、メインのものと同じオプションをthemeなしで受け取ります。デザインを選べるページはメインのcalendarIconを、デザインが決まっているページはそのデザインをインポートします。

副作用なし

パッケージは"sideEffects": falseなので、バンドラーは使わないものを捨てられ、インポートしてもページには何も起きません。依存も、ネットワークへのリクエストも、保存されるデータもありません。

予算

scripts/check-bytes.tsは、上の各エントリーをバンドルして、予算を超えると失敗します(pinsは10,000バイト、squircleは10,500、sunは27,000、メインのインポートは52,000、/monthは12,500、/animateは3,500)。pnpm checkがこれを実行するので、インポートが大きくなる変更は、予算ファイルを意図的に更新して、そのことを明示する必要があります。

メインのインポートの中身

メインのインポートには、アイコン、補助関数(calendarLayout、calendarThemeOf、calendarWeekend、calendarMoon)、プリセット、枠、日本の暦の関数が入っています。月間カレンダーとページめくりは、わざと別にしてあります。月間カレンダーは多くのアイコンより大きく、ページめくりはブラウザーが必要で、サーバー上のアイコンには要らないからです。

使いたいものインポート
名前で選ぶ18種類のデザインのどれでも@johnmorrisdotca/koyomi-calendars
デザイン1つ@johnmorrisdotca/koyomi-calendars/themes/<name>
1か月分@johnmorrisdotca/koyomi-calendars/month
ページめくり@johnmorrisdotca/koyomi-calendars/animate
デザインの名前とラベルだけ@johnmorrisdotca/koyomi-calendars/names
日本の暦だけ@johnmorrisdotca/koyomi-calendars/japanese
import { CALENDAR_THEMES } from "@johnmorrisdotca/koyomi-calendars/names";
import { japaneseHoliday } from "@johnmorrisdotca/koyomi-calendars/japanese";

console.log(CALENDAR_THEMES.length, japaneseHoliday(2026, 11, 3)?.ja !== undefined);
// 18 true
18 true

ソースを見るGitHub で編集@johnmorrisdotca/koyomi-calendars 0.3.0 のソースから作成しました。

この日本語は、まだ日本語を母語とする方の確認を受けていません。訂正を歓迎します。