Eleventy の collections を Nunjucks で dump する
静的サイトジェネレーターの Eleventy でコンテンツの反復処理に使うのが collections
です。ページデータのオブジェクトを取得でき、全記事一覧やカテゴリー別記事一覧などを作る際に使います。取得できるデータは COLLECTION ITEM DATA STRUCTURE に書かれています。
Eleventy は多くの テンプレート言語 に対応していますが、Nunjucks(拡張子は njk)を使う方が多いです。この Nunjucks には、オブジェクトを JSON 文字列でダンプする dump
があります。
.njk ファイルで collections
を使った際、どのページのデータを取得しているのかを知りたくて下記のように書きました。
{{ collections.all | dump }}
すると、エラーが出ました。
`TemplateWriterWriteError` was thrown
[11ty] > (./src/_includes/layouts/post.njk)
TypeError: Converting circular structure to JSON
dump
は JSON.stringify()
で JSON に変換しているとのことですが、それではダメのようです。
調べてみたところ、GitHub の Issues に Documentation/helper functions for dumping collections state info がありました。collections
を dump
するとエラーが出ると書かれています。ちなみに、Issue の作成者は Google のエンジニアさんです。
それに対し、Eleventy の制作者の Zach Leatherman さんが、npm パッケージ の JavaScript Stringify に言及しています。また、それで解決したとの コメント があります。そこで試してみます。
とりあえず、JavaScript Stringify を開発用としてインストールします。
npm i javascript-stringify -D
そして .eleventy.js に addFilter
を追加します。
const { stringify } = require('javascript-stringify');
module.exports = (eleventyConfig) => {
eleventyConfig.addFilter('dumping', (value) => {
return stringify(value, null, '\t', { maxDepth: 3 });
});
};
最後に .njk ファイルで collections
をフィルターを通し確認してみます。
<pre>{{ collections.all | dumping }}</pre>
無事に collections
の全てのデータが出力されました。
npm パッケージの util で上手くいくとの コメント もあります。試したところ、上手くいきました。すでに util をインストールしている場合は、こちらの方法でもいいと思います。
また、collections
は取得するデータの数が多いため、Google のエンジニアさんの コメント のように欲しいデータのみを出力するのが実用的かもしれません。