最初の11のWebサイトを作成して展開する方法
著者は、 Write for DOnations プログラムの一環として、 InternetArchiveを選択して寄付を受け取りました。
11 (11tyとも呼ばれます)は、Webサイトを構築するための静的サイトジェネレーター(SSG)です。 これは、Rubyで記述された最初の主流SSGの1つである Jekyll のJavaScriptベースの代替として、 ZachLeathermanによって2017年に発売されました。 11は、静的Webサイトを構築するための最も柔軟でパフォーマンスの高いオプションの1つとして評判を得ており、Jamstackエコシステムでの採用率が着実に上昇しています。
EleventyはJavaScriptフレームワークではなく、クライアント側のJavaScriptは含まれていないことに注意してください。 HTML、Markdown、または選択したテンプレート言語で指定されたテンプレートファイルを受け取り、選択したWebサーバーに展開する準備ができた完全な静的Webサイトを出力します。
他のほとんどのSSGは1つのテンプレート言語に制限されていますが、Eleventy は、HTML、Liquid、Markdown、Nunjucks、Handlebars、moustache、EJS、Haml、Pugなどの複数のテンプレート言語をサポートしています。同じプロジェクトでそれらを組み合わせることもできます。 この柔軟性は、Eleventyを競合他社から際立たせるものの1つです。
このチュートリアルでは、Eleventyを使用して静的Webサイトを最初から開発し、DigitalOceanの AppPlatformに無料でデプロイします。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- DigitalOceanアカウント。
- GitHubアカウント。
- Node.jsは、Node.jsパッケージマネージャーである
npm
とともに、マシンにインストールおよび構成されています。 インストール方法については、Node.jsのインストール方法とローカル開発環境の作成方法に従ってください。 執筆時点でのEleventyの最新バージョン(v0.12.1)には、Node.jsv10以降が必要であることに注意してください。 - Git が初期化され、ローカルマシンにセットアップされました。 Gitの使用を開始するには、オープンソースに貢献する方法:Gitの開始に従ってください。
- HTML、CSS、JavaScriptの基本的な知識は、 HTMLシリーズでウェブサイトを構築する方法、 CSSシリーズでウェブサイトを構築する方法、および[ X180X]JavaScriptでコーディングする方法。
ステップ1—プロジェクトの設定
JekyllやHugoなどの競合他社とは異なり、Eleventyは新しいプロジェクトの足場を作る方法を提供しないため、通常のNode.jsプロジェクトを作成してから、依存関係としてEleventyを追加する必要があります。
最初のステップは、コンピュータでターミナルを起動し、ファイルシステムのどこかに新しいディレクトリを作成して、以下に示すようにそのディレクトリに変更することです。
mkdir eleventy-blog cd eleventy-blog
eleventy-blog
ディレクトリのルートで、npm init -y
を含むpackage.json
ファイルでプロジェクトを初期化し、-D
フラグを渡して、開発依存関係としてEleventyをインストールします。 install
サブコマンドに移動します。
npm init -y npm install -D @11ty/eleventy
Eleventyパッケージがインストールされたら、ls
を使用してプロジェクトディレクトリの内容を調べます。 これには、package.json
ファイル、package-lock.json
ファイル、およびnode_modules
ディレクトリが含まれます。
出力は次のようになります。
Outputnode_modules package-lock.json package.json
お気に入りのテキストエディタでpackage.json
ファイルを開き、既存のscripts
プロパティを下の強調表示された行に置き換えます。
11-blog / package.json
{ "name": "eleventy-blog", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "build": "eleventy", "start": "eleventy --serve" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "@11ty/eleventy": "^0.12.1" } }
ここには2つのスクリプトがあります。Webサイトファイルを作成するためのbuild
と、http://localhost:8080
で11のWebサーバーを実行するためのstart
です。
ファイルを保存してから、以下のコマンドを実行してWebサイトを構築します。
npm run build
出力は次のようになります。
Output> [email protected] build > eleventy Wrote 0 files in 0.04 seconds (v0.12.1)
出力は、まだファイルを作成していないことを示しているため、ビルドするものはありません。 次のステップでは、Webサイトに必要なファイルの追加を開始します。
作業するプロジェクトの最終的なディレクトリ構造を以下に示します。 空のディレクトリから開始し、この構造に到達するまで新しい機能を段階的に追加します。
. ├── about │ └── index.md ├── css │ └── style.css ├── _data │ └── site.json ├── _includes │ ├── layouts │ │ ├── base.njk │ │ ├── page.njk │ │ └── post.njk │ └── nav.njk ├── index.njk ├── node_modules ├── package.json ├── package-lock.json ├── posts │ ├── first-post.md │ ├── second-post.md │ └── third-post.md └── _site ├── about │ └── index.html ├── css │ └── style.css ├── index.html └── posts ├── first-post │ └── index.html ├── second-post │ └── index.html └── third-post └── index.html
このステップでは、Node.jsプロジェクトを作成し、依存関係としてEleventyを追加しました。 次のステップでは、テンプレート言語を選択します。
ステップ2—テンプレート言語の選択
このチュートリアルでは、 Nunjucks テンプレートを使用します。これは、多くの11のプロジェクトで一般的に選択されています。 (好みに応じて、別のテンプレート言語を選択することもできます。)
プロジェクトディレクトリのルートに、index.njk
ファイルを作成し、テキストエディタで開きます。 以下に示すように、ファイルに「Helloworld」メッセージを追加してからファイルを保存します。
11-blog / index.njk
<h1>Hello, world!</h1>
保存したら、ビルドコマンドを再度実行します。 index.njk
ファイルをindex.html
ファイルに変換し、プロジェクトのルートにある新しい_site
ディレクトリに出力します。
npm run build
出力は次のようになります。
Output> [email protected] build > eleventy Writing _site/index.html from ./index.njk. Wrote 1 file in 0.08 seconds (v0.12.1)
この時点で、以下に示すようにhttp://localhost:8080
で開発サーバーを起動することにより、ブラウザーでWebサイトを表示できます。
npm start
出力は次のようになります。
Output> [email protected] start > eleventy --serve Writing _site/index.html from ./index.njk. Wrote 1 file in 0.08 seconds (v0.12.1) Watching.. [Browsersync] Access URLs: ----------------------------------- Local: http://localhost:8080 External: http://172.29.217.37:8080 ----------------------------------- UI: http://localhost:3001 UI External: http://localhost:3001 ----------------------------------- [Browsersync] Serving files from: _site
別のポートを使用する場合は、次に示すように、--port
オプションを使用して指定できます。
npm start -- --port 4040 to set a different port
上記のコマンドの--
セパレーターは、npm
コマンド自体に渡されるパラメーターとスクリプトに渡されるパラメーターを区別するために使用されます。 開発サーバーを起動した後、Webブラウザーでhttp://localhost:8080
を開いて、サイトの動作を確認してください。 キーボードのCtrl + C
を押すと、いつでもサーバーを終了できます。
このステップでは、テンプレート言語としてNunjucksを使用し、Webサイトの構築を開始しました。 次のセクションでは、Eleventyのレイアウトについて学習し、Webサイトのホームページを作成します。
ステップ3—ホームページを作成する
プロジェクトを最初からより柔軟でスケーラブルにするために、サイトのすべてのページに適用されるベーステンプレートを作成する必要があります。 従来、これはbase
レイアウトと呼ばれ、_includes
ディレクトリ内にネストされたlayouts
ディレクトリに移動する必要があります。 以下のコマンドを使用して、_includes/layouts
ディレクトリを作成します。
mkdir -p _includes/layouts
_includes/layouts
ディレクトリに、base.njk
ファイルを作成し、テキストエディタで開きます。 次のコードをコピーしてファイルに貼り付けます。 これは、Webサイトのすべてのページの基盤として機能する基本的なHTML5ボイラープレートです。
_includes / layouts / base.njk
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>{{ title }}</title> </head> <body> <header> <h1>{{ title }}</h1> </header> <main> {{ content | safe }} </main> </body> </html>
二重中括弧内の内容はNunjucks変数であり、派生ページが作成されるときにそれに応じて置き換えられます。 テンプレート:Title
変数はページのフロントマターブロックを介して提供され、テンプレート:Content
はフロントマターの一部ではないすべての受信ページコンテンツに置き換えられます。 後者は、safe
フィルターを介してパイプされ、エスケープされないようにします。
プロジェクトルートのindex.njk
ファイルに戻り、次のように変更します。
11-blog / index.njk
--- title: Homepage layout: layouts/base.njk --- <h1>Welcome to this brand new Eleventy website!</h1>
トリプルダッシュの両側の内容はファイルの前書きを構成し、ファイルの残りの部分はcontent
としてレイアウトに渡されます。 前書きでは、ファイルのtitle
とlayout
がそれに応じて指定されています。
開発サーバーがまだ実行中の場合は、サイトのローカルホストURLにアクセスして変更を表示するか、サーバーを最初にnpm start
で起動してから、Webブラウザーで表示してみてください。
上のスクリーンショットからわかるように、base.njk
テンプレートがホームページに有効になっています。
このステップでは、サイトのページの基本テンプレートを追加し、ホームページを作成しました。 ただし、ブラウザのデフォルト以外のスタイルはまだありません。 次のセクションでは、ナビゲーションメニューを追加して、Webサイトのデザインを改善します。
ステップ4—ナビゲーションメニューの追加
_includes
ディレクトリは、Webサイトのさまざまなコンポーネントを配置する場所です。 このディレクトリの内容は、再利用を容易にするためにレイアウトファイルに配置できる部分的なファイルです。 このセクションでは、ナビゲーションメニューを部分的に作成し、base
レイアウトに含めます。
_includes
ディレクトリに、nav.njk
という名前の新しいファイルを作成します。 エディターで開き、以下のコードを入力します。 これはトップナビゲーションバーのマークアップであり、サイトのタイトル、ホームページへのリンク、およびまだ作成されていない「About」ページが含まれています。
11-blog / _includes / nav.njk
<nav class="navbar is-light" role="navigation" aria-label="main navigation"> <div class="navbar-start"> <div class="navbar-item has-text-weight-bold"> My Eleventy Blog </div> </div> <div class="navbar-end"> <a href="/" class="navbar-item"> Home </a> <a href="/about" class="navbar-item"> About Me </a> </div> </nav>
nav.njk
ファイルを保存して閉じ、エディターでベーステンプレートファイル(_includes/layouts/base.njk
)を開きます。 先に進み、以下に示すinclude
構文を使用して、このファイルに新しいナビゲーションパーシャルを含めます。
11-blog / _includes / layouts / base.njk
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>{{ title }}</title> </head> <body> <header>{% include "nav.njk" %}</header> <main> {{ content | safe }} </main> </body> </html>
ブラウザでは、サイトは次のようになります。
ホームページをもう一度確認すると、上のスクリーンショットのようにナビゲーションメニューが表示されます。 サイト「MyEleventyBlog」のタイトルは、nav
の部分にハードコードされていますが、サイトの他の場所でタイトルを繰り返す可能性があり、後で変更するのは面倒になるため、これは最適ではありません。次に、それが使用された各場所を見つける必要があります。
より良いアプローチは、グローバルデータファイルを介してこの値を提供することです。 これらは、プロジェクトルートの_data
ディレクトリに配置されたJSONファイルであり、すべてのテンプレートファイルにアクセスできるグローバルデータを提供します。 プロジェクトルートで、_data
ディレクトリを作成し、その中にsite.json
ファイルを作成します。 テキストエディタでsite.json
を開き、以下のコードを使用してサイトのタイトルを指定します。
11-blog / _data / site.json
{ "title": "My Eleventy Blog", "url": "https://example.com/", "language": "en-US", "description": "A simple blog with awesome content" }
この時点で、ファイルを保存して閉じ、_includes
ディレクトリのnav.njk
ファイルに戻り、ハードコードされたサイトタイトルを適切な変数に置き換えることができます。
11-blog / _includes / nav.njk
. . . <div class="navbar-item has-text-weight-bold"> {{ site.title }} </div> . . .
サイトは以前とまったく同じように見えるはずですが、この小さな変更により、グローバルデータの設定と更新がはるかに簡単になります。 グローバル変数について注意すべきことの1つは、それらがJSONファイルの名前にスコープされていることです。そのため、上記でテンプレート:Site.title
を使用しました。 必要に応じて他のデータファイルを作成し、それらをテンプレートで使用できます。 たとえば、名前、経歴、ソーシャルメディアプロファイルへのリンクなどの個人情報を含むauthor.json
ファイルを作成できます。 このようなデータには、Webサイトの任意のページの変数(テンプレート:Author.bio
など)を介してアクセスできます。
プロジェクトルートのindex.njk
ファイルに戻り、以下に示すようにその内容を更新して、サイトのタイトルと説明を使用するようにします。
11-blog / index.njk
--- title: Homepage layout: layouts/base.njk --- <section class="hero is-medium is-primary is-bold"> <div class="hero-body"> <div class="container"> <h1 class="title">{{ site.title }}</h1> <h2 class="subtitle">{{ site.description }}</h2> </div> </div> </section>
ブラウザでは、サイトは次のようになります。
このステップでは、Webサイトにナビゲーションメニューを追加しました。 ただし、サイトはデフォルトのスタイルを使用しています。 次のセクションでは、 Bullma CSSフレームワークを使用してWebサイトのスタイルを設定します。これは、レスポンシブWebサイトを構築するためのフレックスボックスベースのフロントエンドコンポーネントを提供します。
ステップ5—スタイルシートを追加する
現時点では、Eleventyはビルドディレクトリに自動包含されるCSSファイルを認識しないため、これを機能させるにはいくつかの追加手順が必要です。 具体的には、スタイルシートディレクトリを作成し、サイトのビルド時にビルド出力(_site
)にコピーされるようにする必要があります。 また、スタイルシートを変更すると、Webブラウザで再構築と自動更新がトリガーされることを確認する必要があります。 これは、Eleventyの構成ファイルを作成することで実現できます。
プロジェクトルートで、css
フォルダーを作成し、その中にstyle.css
ファイルを作成します。 style.css
を開き、以下のコードを使用して BullmaCSSフレームワークをインポートします。
11-blog / css / style.css
@import "https://cdn.jsdelivr.net/npm/[email protected]/css/bulma.min.css";
ファイルを保存します。
次に、プロジェクトルートに.eleventy.js
ファイルを作成します。 これは、Jekyllプロジェクトの_config.yml
ファイルに似た、Eleventyの構成ファイルです。 このファイルの前にはピリオドが付いているため、このファイルはファイルシステムで非表示になることに注意してください。 ディレクトリの内容を一覧表示するときに表示するには、ls -a
を使用する必要があります。
テキストエディタで.eleventy.js
を開き、以下を貼り付けて、ビルドにcss
ディレクトリを含め、フォルダの変更を監視します。
11-blog / .eleventy.js
module.exports = function (eleventyConfig) { // Copy the `css` directory to the output eleventyConfig.addPassthroughCopy('css'); // Watch the `css` directory for changes eleventyConfig.addWatchTarget('css'); };
この時点で、変更を有効にする前に、Ctrl+C
でサーバーを停止し、npm start
でサーバーを再起動する必要があります。 構成ファイルを変更するたびにこれを行う必要があります。
今すぐブラウザでサイトをチェックすると、変更に気付くことはありません。 これは、スタイルシートがまだどのテンプレートにもリンクされていないためです。 次に示すように、base.njk
テンプレートに追加します。
11-blog / _includes / layouts / base.njk
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" href="/css/style.css" /> <title>{{ title }}</title> </head> <body> <header>{% include "nav.njk" %}</header> <main> {{ content | safe }} </main> </body> </html>
ファイルを保存した後、スタイルはすぐに開始されます。
このステップでは、BulmaCSSフレームワークを使用してWebサイトにスタイルを追加しました。 次のステップでは、「About」ページを作成してサイトを拡張します。
ステップ6—バージョン情報ページを作成する
現時点では、ナビゲーションメニューに存在しない「About」ページへのリンクがあります。 これを変更するには、すべての静的ページに固有のレイアウトを作成し、その後、「About」ページ自体を作成します。 _includes/layouts
フォルダーに、page.njk
ファイルを作成します。 これは、サイト上のすべての静的ページのレイアウトになります。
エディターで新しいファイルを開き、以下のコードを入力します。 前書きのlayout
プロパティは、page
レイアウトが以前に作成されたbase.njk
テンプレートから継承する必要があることを示すために使用されます。 これはレイアウトチェーンと呼ばれ、新しいテンプレートに固有の固有の要素を追加しながらテンプレートを再利用できるため、基本的なサイト構造の不必要な繰り返しを回避できます。
11-blog / _includes / layouts / page.njk
--- layout: layouts/base.njk --- <article class="page-layout"> <div class="container"> <div class="columns"> <div class="column is-8 is-offset-2"> <div class="content mt-5"> <h1>{{ title }}</h1> {{ content | safe }} </div> </div> </div> </div> </article>
ページレイアウトができたので、「About」ページを作成できます。 これを行うには、プロジェクトルートにabout
というディレクトリを作成し、その中に新しいindex.md
マークダウンファイルを追加します。
次のコードをファイルに追加します。
11-blog / about / index.md
--- title: About Me layout: layouts/page.njk --- I am a person that writes stuff.
ファイルを保存したら、https://localhost:8080/about
に移動します。 ページは、指定されたレイアウトで正しく読み込まれるはずです。
連絡先ページやニュースレターページなどの他のページの作成も同じ方法で行うことができます。ページの名前でディレクトリを作成し、新しいディレクトリのルートにindex.md
ファイルを追加します。 必要に応じて、Markdownの代わりにHTMLまたはNunjucksファイルを使用することもできます。
このステップでは、静的ページの一意のレイアウトを作成し、サイトに「About」ページを追加しました。 次のセクションでは、EleventyWebサイトでブログ投稿を作成して処理します。
ステップ7—投稿を作成する
ブログ投稿の作成は、ページの作成と非常によく似ています。 プロジェクトルートにposts
というディレクトリを作成して、すべての投稿を保持することから始めます。
ただし、投稿には別のレイアウトを作成します。 pages
のレイアウトに似ていますが、区別するために日付を含めます。 実際のプロジェクトでは、投稿とページに異なるレイアウトが必要になる可能性が高いため、それぞれに新しいレイアウトを作成することをお勧めします。
_includes/layouts
ディレクトリに、新しいpost.njk
ファイルを作成し、テキストエディタで開きます。 以下のコードをpost.njk
レイアウトファイルに貼り付けます。
11-blog / _includes / layouts / post.njk
--- layout: layouts/base.njk --- <section class="page-layout"> <div class="container"> <div class="columns"> <div class="column is-8 is-offset-2"> <article class="content mt-5"> <h1 class="title">{{ title }}</h1> <p class="subtitle is-6"> Published on: <time datetime="{{ page.date }}">{{ page.date }}</time> </p> {{ content | safe }} </article> </div> </div> </div> </section>
page.njk
テンプレートと同様に、投稿テンプレートは、投稿に意味のある追加(公開日など)を使用して基本テンプレートを拡張します。
このテンプレートを使用するには、posts
ディレクトリにfirst-post.md
という名前の新しいファイルを作成し、テキストエディタで開きます。
次の内容をfirst-post.md
ファイルに貼り付けます。
11-blog / posts / first-post.md
--- title: My First Blog Post description: This is the first post on my blog tags: post date: 2021-06-19 layout: layouts/post.njk --- You’ll find this post in your `posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `eleventy --serve`, which launches a web server and auto-regenerates your site when a file is updated.
ファイルを保存してから、ブラウザのhttp://localhost:8080/posts/first-post
に移動します。 URLがプロジェクト内のファイルの場所(拡張子を除く)にどのように対応しているかに注意してください。 これはデフォルトでURLが処理される方法ですが、パーマリンクキーを使用して他の形式に変更できます。
投稿は正しく表示されますが、日付が現在どのようにフォーマットされているかに注意してください。 この日付形式はユーザーが読むのが難しいですが、他のほとんどのSSGとは異なり、Eleventyには日付の組み込みの形式オプションがありません。 これは、Eleventyでより人間が読める形式を取得するには、外部パッケージを使用する必要があることを意味します。
このステップでは、ブログ投稿の独自のレイアウトを作成し、ブログ投稿をサイトに追加しました。 次のセクションでは、日付の書式設定に役立つカスタムフィルターを作成します。
ステップ8—11でフィルターを使用する
Eleventyは、さまざまな方法でコンテンツを変換するためのfiltersをサポートしています。 たとえば、以前に使用したsafe
フィルタは、HTMLコンテンツのエスケープを防ぎます。また、テキストをURLに適した文字列に変換するためのslug
などの組み込みフィルタがあります。 任意のテンプレートで使用できる独自のカスタムフィルターを追加することもできます。 これらのカスタマイズは、構成ファイルを介して行うことができます。
先に進み、投稿テンプレートで使用できるように、日付をフォーマットするためのユニバーサルフィルターを追加します。 日付をフォーマットするための軽量JavaScriptライブラリであるLuxonをインストールすることから始めます。
npm install --save luxon
その後、.eleventy.js
構成ファイルを開き、その内容を次のように更新します。
11-blog / .eleventy.js
const { DateTime } = require('luxon'); module.exports = function (eleventyConfig) { // Copy the `css` directory to the output eleventyConfig.addPassthroughCopy('css'); // Watch the `css` directory for changes eleventyConfig.addWatchTarget('css'); eleventyConfig.addFilter('readableDate', (dateObj) => { return DateTime.fromJSDate(dateObj, { zone: 'utc' }).toFormat( 'dd LLL yyyy' ); }); };
強調表示された行は、Eleventyにカスタムフィルターを追加する方法を示しています。 まず、外部ライブラリから必要なオブジェクトをインポートする必要があります。 LuxonのDateTime
タイプは、フォーマットの目的でいくつかのメソッドを提供します。
フィルタを追加するには、eleventyConfig
引数で提供されるaddFilter()
メソッドを呼び出す必要があります。 これは最初の引数としてフィルター名を取り、コールバック関数はフィルターが使用されるときに実行されるものです。 上記のスニペットでは、フィルターはreadableDate
と呼ばれ、コールバック関数は、提供された日付トークンを使用して日付オブジェクトをフォーマットするために使用されます。 これにより、次の形式の日付が生成されます:2021年7月19日。
構成ファイルを保存し、サーバーを再起動して、変更を有効にします。 次に、以下に示すように、投稿テンプレートのreadableDate
フィルターを使用して、指定されたレイアウトに従って投稿日をフォーマットします。
11-blog / _includes / layouts / post.njk
. . . <p class="subtitle is-6"> Published on: <time datetime="{{ page.date }}">{{ page.date | readableDate }}</time> </p> . . .
ブラウザで投稿を開くと、日付の書式が更新されていることがわかります。
このステップでは、ブログ投稿の日付形式を変更するためのフィルターを追加しました。 次のセクションでは、ほとんどの個人ブログで一般的であるように、ホームページに投稿のリストを表示します。
ステップ9—ホームページに投稿を表示する
サイトへの訪問者がブログの投稿を見つけやすくするために、ホームページに投稿をリストすることをお勧めします。 この機能を実装するには、Eleventyのコレクション機能を使用します。
index.njk
ファイルの更新に進む前に、ホームページに表示するために少なくとも3つの追加の投稿を作成する必要があります。 最初の投稿を新しいファイルにコピーして、それぞれのタイトルと説明を変更できます。 それが終わったら、以下に示すようにindex.njk
ファイルを更新します。
11-blog / index.njk
--- title: Homepage layout: layouts/base.njk --- <section class="hero is-medium is-primary is-bold"> <div class="hero-body"> <div class="container"> <h1 class="title">{{ site.title }}</h1> <h2 class="subtitle">{{ site.description }}</h2> </div> </div> </section> <section class="postlist mt-3 pt-3"> <div class="container"> <h2 class="title has-text-centered mt-3 mb-6">Recent posts</h2> <div class="columns"> {% for post in collections.post | reverse %} {% if loop.index0 < 3 %} <div class="column"> <div class="card"> <header class="card-header"> <p class="card-header-title"> {{ post.data.title }} </p> </header> <div class="card-content"> <div class="content"> {{ post.data.description }} </div> </div> <footer class="card-footer"> <a href="{{ post.url }}" class="button is-fullwidth is-link card-footer-item">Read article</a> </footer> </div> </div> {% endif %} {% endfor %} </div> </div> </section>
上記のスニペットのforloop 構造は、Nunjucksテンプレート言語からのものであり、Eleventyのコレクションを反復処理する方法の1つです。 {% for post in collection.post | reverse %}
で始まり、{% endfor %}
で終わります。 post
コレクションはEleventyによって作成され、tags
フロントマタープロパティがpost
に設定されているページで構成されます。
ここではreverse
フィルターを使用して、古い投稿を最初に配置するデフォルトの順序ではなく、最新の投稿から反復を開始します。 ループ内では、コレクションの出力は3つのアイテムに制限され、post
ローカル変数を使用して、コレクション内の各投稿のタイトル、説明、およびURLにアクセスします。
ファイルを保存した後、ブラウザのホームページに移動して結果を確認します。 以下のスクリーンショットのようになります。
このステップでは、追加のブログ投稿を作成し、Eleventyのコレクション機能を使用してそれらをWebサイトのホームページに一覧表示しました。 これで、ホームページ、「About」ページ、およびいくつかの投稿を備えたスタイル付きWebサイトができました。 次に、GitHubとDigitalOceanのAppPlatformを介して本番環境にデプロイします。
ステップ10—WebサイトをGitHubにプッシュする
コードをDigitalOceanのAppPlatformにデプロイする前に、サイトをGitリポジトリに取得し、そのリポジトリをGitHubにプッシュする必要があります。 最初に行うことは、プロジェクトディレクトリでGitリポジトリを初期化することです。
git init
次に、プロジェクトルートに.gitignore
ファイルを作成して、node_modules
および_site
ディレクトリのコンテンツをGitリポジトリで追跡されないようにします。
.gitignore
node_modules _site
ファイルを保存した後、以下のコマンドを実行してすべてのプロジェクトファイルをステージング領域に追加し、最初のコミットを行います。
git add -A git commit -m "Initial version of the site"
出力は次のようになります。
Output[master (root-commit) e4e2063] Initial version of the site 15 files changed, 6914 insertions(+) create mode 100644 .eleventy.js create mode 100644 .gitignore create mode 100644 _data/site.json create mode 100644 _includes/layouts/base.njk create mode 100644 _includes/layouts/page.njk create mode 100644 _includes/layouts/post.njk create mode 100644 _includes/nav.njk create mode 100644 about/index.md create mode 100644 css/style.css create mode 100644 index.njk create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 posts/first-post.md create mode 100644 posts/second-post.md create mode 100644 posts/third-post.md
GitHub に移動し、プロファイルを使用してログインし、eleventy-blog
という名前のプロジェクト用の新しい空のリポジトリを作成します(パブリックまたはプライベートにすることができます)。 GitHubレポジトリが作成されたら、レポジトリへのリンクをコピーし、ターミナルでプロジェクトのリモートロケーションとして追加します。
git remote add origin https://github.com/username/eleventy-blog.git
変更をリモートの場所にプッシュする前に、デフォルトのブランチの名前をmain
に変更して、GitHubが期待するものと一致させます。
git branch -M main
最後に、以下のコマンドを実行して、main
ブランチをGitHubにプッシュします。 プロンプトが表示されたら、GitHubアカウントのクレデンシャルを入力します。
注:GitHubアカウントで2要素認証が有効になっている場合、コマンドラインでGitHubにアクセスするときに、個人アクセストークンまたはSSHキーを使用する必要があります。 詳細については、コマンドラインでの2要素認証の使用を参照してください。
git push origin main
出力は次のようになります。
OutputEnumerating objects: 23, done. Counting objects: 100% (23/23), done. Delta compression using up to 4 threads Compressing objects: 100% (19/19), done. Writing objects: 100% (23/23), 64.41 KiB | 2.38 MiB/s, done. Total 23 (delta 3), reused 0 (delta 0) remote: Resolving deltas: 100% (3/3), done. To https://github.com/username/eleventy-blog.git * [new branch] main -> main
このステップでは、サイトをGitリポジトリに追加し、それをGitHubにプッシュしました。 これで、WebサイトをDigitalOceanのAppPlatformにデプロイする準備が整いました。
ステップ11—AppPlatformを使用したDigitalOceanへのデプロイ
先に進み、 DigitalOceanアカウントにログインしてから、https://cloud.digitalocean.com/apps
に移動し、右上の緑色の作成ボタンをクリックします。 ドロップダウンでAppsオプションを選択し、表示されたページで、ソースとしてGitHubを選択します。
GitHubにリダイレクトされ、DigitalOceanにリポジトリへのアクセスを許可するように求められます。 すべてのリポジトリーを選択することも、デプロイしたいリポジトリーだけを選択することもできます。 選択したら、[インストールして承認]をクリックします。 もう一度ソースの選択ページにリダイレクトされます。
ソースの選択ページでGitHubを選択し、リポジトリドロップダウンからeleventy-blog
リポジトリを選択します。 選択したブランチがmain
であり、コード変更を自動デプロイするためのチェックボックスがオンになっていることを確認してから、次へをクリックして続行します。
次のページで、プロジェクトはNode.jsプロジェクトとして自動検出されます。 次のスクリーンショットに示すように、タイプを静的サイトに変更し、出力ディレクトリを_site
に変更する必要がある場合があります。 次へをクリックして、すべてが一致したら続行します。
静的サイトに名前を付け、次へをクリックしてファイナライズして起動画面に移動します。
静的サイトは無料なので、プランの下のデフォルトのスターターの選択を保持し、ページの下部にあるスターターアプリの起動を押します。
サイトはすぐに構築され、数分後に成功メッセージが表示されます。
デフォルトでは、アプリにはondigitalocean.app
のサブドメインが割り当てられます。 これでサイトが展開されたので、提供されたURLにアクセスして、ブラウザーでライブWebサイトを表示できます。 App Platformでドメインを管理する方法に従って、サイトのカスタムドメインを登録することもできます。
結論
このチュートリアルでは、Eleventyを使用して静的サイトを構築し、DigitalOceanのAppPlatformにデプロイしました。 今後は、ローカルでWebサイトに変更を加え、変更をGitHubにプッシュすると、DigitalOceanがライブサイトを自動的に更新します。 アプリダッシュボードに移動すると、いつでもビルドの進行状況を確認できます。
このチュートリアルで達成したことを基に、11のドキュメントにアクセスして、サイトのテンプレートをカスタマイズする方法の詳細を確認し、レスポンシブ画像、などの機能を追加してください。構文の強調表示、およびキャッシュ。 独自のテーマを最初から作成せずにすばやく開始したい場合は、スタータープロジェクトページを確認してください。