11ty(Eleventy)をやってみた
名前をたまたま見かけただけ。
インストール
11ty/EleventyはNode.jsで動作するのでインストールはnpmを使う
インストールしたパッケージ等
eleventy.config.js で設定
Eleventyの設定やスクリプトは eleventy.config.js に記述する。
下の方のreturn dirでディレクトリの設定をする。ここでは/src/content以下にテンプレートを置く。
includes:やlayouts:のディレクトリはinput:のディレクトリから見た相対パス。
以下は eleventy.config.js全体。eleventy-imgによる画像最適化もここで行う。
とても長いのでほとんどの部分は省略した。
const = ;// Shiki の設定は省略default ディレクトリの図
大まかなツリーは以下の通り。
/├── eleventy.config.js├── package.json└── src ├── _data ├── _includes ├── _layouts │ ├── base.html │ └── post.html ├── assets ├── content │ ├── index.html(トップページのテンプレート) │ ├── posts (markdownファイルがあるディレクトリ) └── publicレイアウト
AstroでいうLayoutは/src/_layouts ディレクトリに置く。(上記の設定ファイルで場所は自由)
画像やcssなどは/src/assets以下に配置。
{{ content | safe }}はAstroで言う<slot>にあたる。
{{ metada.SITE_LANG }} のような表記は /src/_data ディレクトリのjsonファイルの中のデータを読み込んでいる。
metadataはmetadata.jsonのファイル名。
基本のレイアウト/src/_layouts/base.html
{% if title %}{{ title }} | {% endif %}{{ metadata.SITE_TITLE }} <!-- ------ 省略 ------- --> {% include "site_header.html" %} {{ content | safe }} {% include "site_footer.html" %} ブログ記事のレイアウト。/src/_layouts/post.html
frontmatter部分でbase.htmlをレイアウトとして読み込んでいる。
---layout: base.html--- {% include "post_head.html" %} {{ content | safe }} {% include "post_foot.html" %} テンプレート
ここでは/src/contet以下にテンプレートを置いていく。
markdownファイルもテンプレートなのでcontent内にディレクトリを作りそこに配置する。
以下はサイトのトップページのテンプレート。
---layout: base.htmltitle: HomeeleventyNavigation: key: Home order: 1pagination: data: collections.posts size: 9 alias: postspermalink: "{% if pagination.pageNumber > 0 %}/{{ pagination.pageNumber + 1 }}/{% endif %}index.html"---{% include "blogcard.html" %}{% include "page_nav.html" %} {% include 'avatar.html' %}pagination:でブログのコレクション(data: collections.posts)を元にしたページネーションの設定をしている。size: 9で9項目ごとにページ分割される。permalink:でページごとのURLを設定している。alias: postsでコレクションにアクセスできる。({% for post in posts %}のような使い方)。
インクルード
別のファイルを特定の位置に読み込みたい場合は_includes以下にファイルを置く。
インクルードされる側のテンプレート/src/_includes/avatar.html
{{ metadata.SITE_OWNER }}{% include "avatar.html" %}のようにインクルードする。
---layout: base.htmltitle: プロフィール---{% include "avatar.html" %}引数のあるコンポーネントを使いたい場合はショートコード以外の方法としてmacroを使う。
{{ caller() | safe }}がAstroでいうコンポーネントの中の<slot>。
{% macro button(url, rounded=false, blank=false, color="base", border=false, extraAttributes="") %} {% set classList = ["button-base", "button-color-" + color] %} {% if rounded %} {% set classList = classList.concat(["button-rounded"]) %} {% endif %} {% if border %} {% set classList = classList.concat(["button-bordered"]) %} {% endif %} {% set classString = classList.join(" ") %} {{ caller() | safe }} {% endmacro %}呼び出し元では使いたいmacroをimportして call endcall ブロックを使ってmacroを呼び出す
{% import "components/button.html" as components %}{% call components.button(url="https://example.com", rounded=true) %} ボタンの中身{% endcall %}レイアウトの指定とURLの変更
markdownがあるディレクトリ以下にレイアウト情報などを設定する。
ここでレイアウトを設定するとこのディレクトリ以下のレイアウトはすべて指定されたものになる。
posts.11tydata.jsを作成する。(コレクション名がnoteならばnote.11tydata.js)
元のAstroブログではblogはサイトのルートに配置されるようになっていたので以下のようにURLを変更する設定も記述。
実際に表示させてみる。
Astroからかなり移植したので見た目はほぼ同じ。

11tyの結論
手間はかかりそうなもののかなりスクリプトでなんとかなる雰囲気。
Hugoと比べて融通は効くものの大変そうではある。画像変換はプラグインもあり便利。macroがイマイチ使いづらい。
Astroに慣れてしまったせいかもしれない。