0Pricing
HTML Academy · レッスン

サーバーサイドテンプレート:Jinja2とHandlebars

テンプレートエンジンでサーバー上のHTMLを動的にレンダリングします

「サーバーサイドテンプレート:Jinja2とHandlebars」はCoddyKit上の無料HTML Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはHTML Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 HTML Academyコースには全4レッスンが含まれています。

サーバーサイドテンプレートを使う理由

サーバーサイドテンプレートは、ブラウザーに送信する前にサーバー上で HTML を生成します。最初のバイトから SEO に適したマークアップを提供でき、JavaScript がなくても動作し、クライアントサイドレンダリングだけで起きる「JavaScript の読み込みが終わるまでページが空白になる」問題も回避できます。

Jinja2(Python)

Jinja2 は Python のデファクトスタンダードのテンプレートライブラリで、Flask、Django(組み込みまたは jinja2 バックエンド経由)、Pelican、mkdocs などで使われています。{% %} タグにロジックを、{{ }} に式を記述します。変数には <h1>{{ title }}</h1>、ループには {% for item in items %} のように使います。

<ul>
  {% for item in items %}
  <li>{{ item.name }} — ${{ item.price }}</li>
  {% endfor %}
</ul>

Handlebars(JavaScript)

Handlebars は最も広く使われている Node.js テンプレートライブラリで、トランザクションメール(SendGrid、Mailgun)や Express 経由の SSR でよく利用されます。式には {{ }}、ブロックには {{# }} を使います。{{#each items}}<li>{{name}}</li>{{/each}} のように記述します。

<ul>
  {{#each items}}
  <li>{{name}} — ${{price}}</li>
  {{/each}}
</ul>

自動エスケープ

どちらのエンジンも、デフォルトで変数の出力を自動エスケープします。name = "<script>" のとき、{{ user.name }} は "&lt;script&gt;" を出力し、XSS を無効化します。常に自動エスケープを利用し、明示的な raw フィルター(Jinja: {{ x|safe }}、Handlebars: {{{x}}})は信頼できる HTML に対してのみ使用してください。

テンプレート継承

Jinjaでは、子テンプレートに {% extends "base.html" %} を記述し、ベーステンプレートに {% block content %}{% endblock %} を記述します。Handlebarsでは、部分ブロックを使って {{#> layout }}{{/layout}} を記述します。ベースレイアウトで構造を一度定義し、ページごとに可変領域を埋められます。

インクルードとパーシャル

Jinjaでは {% include "header.html" %}、Handlebarsでは {{> header}} を使います。どちらも別のテンプレートを現在のテンプレートにインラインで組み込みます。パーシャルは大規模なコンポーネントライブラリを構成する基本要素であり、ページやレイアウトに組み合わせて使います。

フィルターとヘルパー

Jinjaのフィルターは {{ price|currency }}、Handlebarsのヘルパーは {{currency price}} のように記述します。どちらも値に対してフォーマット関数を呼び出せます。プロジェクト固有の変換(日付のフォーマット、複数形処理、リンク生成など)には、独自のフィルターやヘルパーを定義します。

条件分岐

Jinjaでは {% if user.is_logged_in %}Welcome{% else %}Sign in{% endif %}、Handlebarsでは {{#if user.isLoggedIn}}Welcome{{else}}Sign in{{/if}} のように記述します。クライアント側のJSでコンテンツを表示・非表示にするのではなく、データに応じてテンプレートを分岐できます。

パフォーマンス

どちらのエンジンもテンプレートを関数に事前コンパイルし、リクエストごとにその関数を呼び出します。コンパイルは一度だけで、レンダリングは高速です。非常にトラフィックの多いサイトでは、同一ページを再レンダリングするのではなく、エッジ(Varnish、Cloudflare)でレンダリング済みの出力をキャッシュします。

ローカライズ

テンプレートをi18nライブラリと組み合わせます。PythonではJinja2 + Babel、NodeではHandlebars + i18nextを使います。テンプレートには翻訳キー({{ t "welcome" }})を記述し、i18n層が適切な言語の翻訳を解決します。これにより、1つのテンプレートを多言語でレンダリングできます。

フレームワークのテンプレート

Modern frameworkには、それぞれ独自のテンプレート形式があります。ERB(Rails)、Twig(Symfony)、Blade(Laravel)、Razor(.NET)、Slim/Haml(より簡潔な記法)などです。基本的なパターンは同じで、構文が異なります。バックエンドの言語とエコシステムに合ったエンジンを選びます。

コンポーネントへの移行

テンプレートは従来のサーバーレンダリング型サイトに適しています。よりインタラクティブなアプリでは、Next.js(React)、Nuxt(Vue)、SvelteKitなどのフレームワークによって境界が曖昧になります。これらはサーバー上でテンプレートをレンダリングしつつ、同じコンポーネントをクライアント側でハイドレーションしてインタラクティブ性を実現します。

理解度チェック

Jinja2やHandlebarsのようなテンプレートエンジンで、自動エスケープがデフォルトの動作になっているのはなぜですか?

まとめ

サーバーサイドテンプレートエンジン(PythonのJinja2、JSのHandlebars、その他のスタックのERB/Twig/Blade)は、変数、ループ、条件分岐、パーシャル、継承を使ってサーバー上でHTMLを生成します。自動エスケープは、デフォルトでXSSから防御します。多言語サイトではi18nライブラリと組み合わせます。テンプレートが基盤となり、その上に現代的なフレームワークがハイドレーションを重ねます。

よくある質問

「サーバーサイドテンプレート:Jinja2とHandlebars」レッスンは無料ですか?

はい。「サーバーサイドテンプレート:Jinja2とHandlebars」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、HTML Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 HTML Academyコースには全4レッスンが含まれています。

「サーバーサイドテンプレート:Jinja2とHandlebars」で何を学びますか?

テンプレートエンジンでサーバー上のHTMLを動的にレンダリングします ブラウザで直接実行するハンズオンコードでHTML Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

HTML Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのHTML Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「サーバーサイドテンプレート:Jinja2とHandlebars」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このHTML Academyレッスンでコードを書いて実行できますか?

はい。すべてのHTML Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. コンポーネントの抽出とパーシャル
  2. サーバーサイドテンプレート:Jinja2とHandlebars
  3. デザインシステムにおけるHTML
  4. ドキュメントとスタイルガイドの統合
← HTML Academyに戻る