11ty(Eleventy)+Gulp+Sassスターターの構成とか特徴の紹介のイメージ画像

前回に続き、11ty(Eleventy)+Gulp+Sassスターターがどういった構成になってるかをご紹介です。

スターターのデータ一式はGitHubに有ります。

hirasawa/latele-11ty-gulp-starter

これからこのスターターに関して色々ご説明していくのですが、11ty(Eleventy)とNunjucksは多少なり使ったことが有る前提で書いてるので説明不足な点も有るかもしれません。
その辺は予めご了承頂ければと!

11ty(Eleventy)の使い方に関しては、CodeGridの記事が一番詳しく書いてあります。
月額880円ですが、30日間無料で読めるので気になったら読んでみるのも良いかと思います。

ディレクトリ構成

今回作ったスターターのディレクトリ構成は次のような感じになっています。
シンプルに作ってたつもりだけど、Sassファイルが有るとたくさん有るように見えますね。

latele-11ty-gulp-starter
├ src
│ ├ _data
│ │ ├ news.json // News取得用サンプルJSON
│ │ └ site.js // サイトの基本設定
│ ├ _includes
│ │ ├ layouts
│ │ │ ├ base.njk // ベースとなるレイアウト
│ │ │ ├ default.njk
│ │ │ └ page.njk
│ │ ├ breadcrumb.njk // パンくずリスト
│ │ ├ footer.njk // 共通フッター
│ │ ├ footer_script.njk
│ │ ├ header.njk // 共通ヘッダー
│ │ └ meta.njk // meta関係いろいろ
│ ├ about // aboutページ
│ │ └ index.njk
│ ├ assets
│ │ ├ img
│ │ ├ js
│ │ │ └ main.js
│ │ └ sass // FLOCSSな感じのSassファイル
│ │   ├ foundation
│ │   │ ├ _base.scss
│ │   │ └ _normalize.scss
│ │   ├ global
│ │   │ ├ _index.scss
│ │   │ ├ _mixin.scss
│ │   │ └ _variables.scss
│ │   ├ layout
│ │   │ ├ _contents.scss
│ │   │ ├ _footer.scss
│ │   │ ├ _header.scss
│ │   │ ├ _nav.scss
│ │   │ └ _page.scss
│ │   ├ object
│ │   │ ├ component
│ │   │ │ ├ _skipLink.scss
│ │   │ │ └ _title.scss
│ │   │ ├ project
│ │   │ └ utility
│ │   │   ├ _display.scss
│ │   │   └ _margin.scss
│ │   └ s.scss
│ ├ info // Infoページ
│ │ └ index.njk
│ ├ 404.njk // 404ページ
│ ├ index.njk // トップページ
│ └ sitemap.xml.njk // sitemap.xml
├ .browserslistrc // オートプレフィクサーの設定
├ .editorconfig // エディタの設定
├ .eleventy.js // 11tyの設定
├ .gitignore
├ README.md
├ gulpfile.js // Gulp Sass関係の処理はここ
├ package-lock.json
└ package.json

トップページを表示する

コマンドラインで npm i してインストールした後に npm start でサーバーが起動します。
すると、ブラウザシンクの設定で open: 'external', にしているので標準設定のブラウザに以下の画面が表示されると思います。

11ty-gulp-sass2_01.png

無事に表示されれば、問題なく動いていると思います。
初回の起動時はSassファイルがコンパイルされませんが、適当な .scss を保存すると次のような見た目になると思います。

11ty-gulp-sass2_02.png

後は src フォルダ内のファイルを好きにいじってください。

各ページやファイルに関して

サイト全体の設定をする site.js

まずはサイト全体の設定をするために、src/_data/site.js を開いてください。
これJSONでも良かったんですが、ちゃんとコメント付けるならJSの方が良いかなって事でJSにしてます。

この site.js の中身はこんな感じ。

module.exports = {
  // サイト名
  title: "新規でサイトを作るやつ",
  // トップページのみ付与される簡易的な説明文
  catch: " - サイトの簡易的な説明文",
  // meta description
  description: "11tyとGulp(Sass)で始めるスターターセット",
  // URL(最後の / は含めない)
  url: "https://example.com",
  // 文字コード
  charset: "utf-8",
  // 言語
  lang: "ja",
  locale: "ja_JP",
  // ビューポートの指定
  viewport: "width=device-width, initial-scale=1",
  // パンくずリストのトップページの文言
  breadcrumbHomeText: "トップページ",
  // faviconのパス
  faviconPath: "/assets/img/favicon.ico",
  // Google AnalyticsのUA設定(gtag.jsは _includes/footer_script.njk)
  gtagUA: "UA-xxxxxxxx-x",
  // トップページ用 og:type
  ogType_top: "website",
  // トップページ以外の og:type
  ogType: "article",
  // og:image
  ogImage: "/assets/img/blog/share/ogp.jpg",
  // Twitter Card
  twitterCard: "summary",
  // Twitter Site(空の場合出力しない) 例:@ユーザー名
  twitterSite: ""
};

コメントがっつり入れてるのでだいたい何が設定できるか分かるかと思いますが、これを適所書き換えて頂ければと。
主に src/_includes/meta.njk に入る値を設定できる感じです。

トップページ

src/index.njk がトップページです。
トップページでは、 collections.all を使った全ページ一覧と日付をいい感じにするやつのテストと、 src/_data/news.json の内容を表示するサンプルが有ります。

日付に関しては、何も処理をしないと「Mon Sep 06 2021 10:22:27 GMT+0900 (GMT+09:00)」みたいに出ちゃうので、Day.js を予め入れてあります。
| formatDate('YYYY/MM/DD') みたいに指定するだけなので楽ちん。

アバウトページ

src/about/index.njk がアバウトページです。
ここは複数ページ作る際の参考的な意味合いと、パンくずリストを include してます。
親の階層に関しては、ベタでも良さそうですし、ボクの場合はfront-matterに parent とかってのを作ってその値を入れるようにしてます。

お知らせページ

src/info/index.njk がお知らせページです。
このページは src/_data/news.json の内容を取得して、それをページ分割してるサンプルが有ります。

front-matterの size を変更することで表示件数を調整できます。
実際にお知らせっぽいコンテンツ作るのに使えるかなーと思います。

404ページ

src/404.njk にて404もご用意しております。
ブラウザシンクの設定で404も表示されるようにしていますのでご利用いただけますと幸いです。

現在、トップページに一覧で表示するために、eleventyExcludeFromCollections: false の指定をしてますが、実際に使う際は一覧に出てくると困ると思いますので、値を true に変えてください。

sitemap.xml

src/sitemap.xml.njk にて sitemap.xml も後から作るの面倒だなーって思ったので予め用意しました。

src/_data/site.js の設定をちゃんとやってればいい感じに sitemap.xml が作られると思います。
先程の404と同じように、sitemap.xml に出てほしくないページが有る場合、front-matterに eleventyExcludeFromCollections: true を書けば出なくなります。

インクルードファイル

src/_includes にインクルードファイルが入ってます。
ここに入ってれば、{%- include 'breadcrumb.njk' -%} みたいな感じでサクッと呼び出せるので使い勝手が良いですね。

この src/_includes 内にある layouts/base.njk が大枠の部分です。
default.njkpage.njk は、大枠の base.njk をインクルードしています。
こうしておくと、ページによって大枠は同じだけどメインコンテンツ部分だけマークアップを変えるのに良い感じです。

例えば、 page.njk はMarkdownで書いた内容を表示させる場合に、

---
layout: layouts/base.njk
---
<div class="markdown">
  {{ content | safe }}
</div>

みたいにしておけば、スタイルの切り替えやら、.md ファイルが扱いやすいと思います。

header.njkfooter.njk はそのまんま全ページ共通のヘッダーやらフッターです。
footer_script.njk は /body 直前にscript書いたりするのに使える感じです。

assetsフォルダ

assetsフォルダには imgsassjs 等が入ってます。

sass に関してはCSS設計でFLOCSSを採用することが多いので、そんな感じのフォルダ構成になっています。
採用するCSS設計にも寄ると思いますが、scssファイルを細かく分割する場合に都度読み込ませるのが面倒なので、gulp-sass-glob-use-forward - npmを使い、@forward を使っててもGlobが使えるようにしています。

おわりに

駆け足気味な紹介でしたが、11ty(Eleventy)+Gulp+Sassスターターがどんな感じになっているかのご説明でした。

色々ご説明してきましたが、結局こういうのって自分が使いやすい感じで作ってるので、これをベースに自分なりのスターターを作って頂ければと思います。
なので、src 内はあまり気にせず使いやすい感じにカスタマイズして頂ければ幸いです。

参考にしたサイト