ホームページ > ウェブフロントエンド > jsチュートリアル > モジュール式の Edge Side には、JavaScript Compute 用のコンポーネントが含まれています

モジュール式の Edge Side には、JavaScript Compute 用のコンポーネントが含まれています

Mary-Kate Olsen
リリース: 2024-12-20 03:13:09
オリジナル
478 人が閲覧しました

A modular Edge Side Includes component for JavaScript Compute

2022 年の夏、私のチームメイトの Kailan は Fastly Compute 用の Rust クレートに取り組み、Edge Side include (ESI) テンプレート言語のサブセットを実装し、次のブログ投稿を公開しました。それ。この記事が重要だったのは、私たちが便利なライブラリをリリースしたというだけではなく、コンピューティングがもたらすもの、つまりモジュラー機能を備えたプログラマブル エッジを見事に示したものだったからです。そして、JavaScript が Compute で一般的に利用可能になってから 1 年以上が経過したため、JavaScript ユーザー向けに同様のソリューションを用意する時期が来ました。 Fastly の JavaScript 用 ESI ライブラリは npm で利用できるようになり、アプリケーションに強力な ESI 処理を追加できます。


プログラマビリティとモジュール性

Fastly の CDN は、ほぼ 10 年にわたり、HTML ソース内の特別なタグを解釈することで機能するテンプレート言語である Edge Side include (ESI) をサポートしてきました。これはタグ を中心に展開し、エッジ サーバーに別のドキュメントをフェッチしてストリームにインライン化するよう指示します。

index.html

<body>
<esi:include src="./header.html" />
<main>
Content
</main>
</body>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

header.html

<header>Welcome to the web site</header>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

出力


<header>Welcome to the web site</header>
Content
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

コンピューティングが登場すると、エッジの状況は主にプログラマビリティとモジュール性の 2 つの点で変化しました。

Rust のプラットフォーム サポートが安定してからすぐに、ESI を実装し、プログラマビリティを追加した Rust 用のクレートを公開しました。コードを使用して、追加のバックエンド要求を構築する方法と、応答フラグメントを処理する方法を構成できるようになりました。バックエンド サーバーから発信されていないドキュメントに対して ESI 処理を実行することもできます。このプログラマビリティにより、提供する機能の固定セットに限定されていた VCL の ESI サポートとは区別されました。

同時に、このアプローチは高度にモジュール化されており、プログラマはこの ESI 処理をリクエストごとに実行する選択肢と、互換性のあるデータ型で動作する他のモジュールと処理を組み合わせて適用するオプションを提供しました。任意の順序および/または指定された論理条件でそれらを実行します。

次のターゲット: JavaScript

Rust リリースと同様に、この JavaScript ライブラリをプログラム可能にする必要がありました。 Fastly の JavaScript サポートには、Fetch API とその付属の Streams API が常に組み込まれています。 Streams API の便利な機能の 1 つは TransformStream インターフェイスです。これにより、ESI に最適な変換を適用するためにオブジェクトを介してデータを「パイプ」することができます。 ESI プロセッサを TransformStream の実装として実装することで、JavaScript で書かれた Fastly Compute アプリケーションに ESI プロセッサを適合させることができました。

ストリーミング方法は次のとおりです:

<body>
<esi:include src="./header.html" />
<main>
Content
</main>
</body>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

EsiTransformStream と呼ばれる変換はストリームに直接適用され、メモリとパフォーマンスの問題が軽減されます。これは次のことを意味します:

  • 変換を適用する前にアップストリーム応答全体をバッファーする必要はありません。
  • トランスフォーマーは、アップストリームの応答をできるだけ早く消費し、ストリームに表示される ESI タグを処理します。トランスフォーマーが各 ESI タグの処理を完了すると、結果はすぐに下流にリリースされるため、最小限のバッファーを保持できます。これにより、クライアントは、ストリーミングされた結果が完全に処理されるまで待つことなく、準備が整ったときにその最初のバイトを受信できるようになります。

さらに、この設計はモジュール式であるため、EsiTransformStream は他のものと一緒に使用できる単なるツールになります。たとえば、圧縮などの他の変換を応答に適用したい場合、応答は完全に標準のインターフェイスであるため、これらの変換ストリームをいくつでもパイプ処理できます。 必要に応じて、リクエスト ヘッダー、パス、レスポンス コンテンツ タイプなどによって、特定のリクエストまたはレスポンスのみに対して ESI を条件付きで有効にすることもできます。

EsiTransformStream をインスタンス化する方法は次のとおりです。

<header>Welcome to the web site</header>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

コンストラクターは URL と Headers オブジェクトを受け取り、オプションでいくつかのオプションを 3 番目のパラメーターとして受け取ります。前述したように、ESI の主な機能は、追加のテンプレートをダウンロードして、結果のストリームに含めることです。 に遭遇しました。タグは、テンプレートを取得するための基礎となるメカニズムとしてフェッチを使用します。これらのパラメーターの主な目的は、フェッチ呼び出しを構成することです。

  • URL は、 の src 内の相対パスを解決するために使用されます。タグ。
  • ヘッダーは、テンプレートを取得するための追加リクエストを行うときに使用されます。
  • オプションの構成オブジェクトを使用すると、行われたフェッチの動作をオーバーライドしたり、フェッチされたテンプレートの処理方法やカスタム エラー処理などの他のカスタム動作を適用したりできます。

最も単純なケースでは、構成オブジェクトのフェッチ値のみを使用します。これを指定しない場合は、代わりにグローバル フェッチ関数が使用されますが、Compute では、テンプレートを含めるときにフェッチに使用するバックエンドを指定する必要があります (動的バックエンド機能を使用している場合を除く)。上のサンプル スニペットは、グローバル フェッチを呼び出す前に、origin_0 という名前のバックエンドを割り当てます。

それだけです!この簡単なセットアップにより、バックエンドで ESI タグを処理し、コンピューティング アプリケーションで ESI タグを処理することができます。実行できる完全な例は次のとおりです:

fiddle.fastly.dev

ESI機能のサポート

この実装では、これまでに利用可能にした他の機能よりも多くの ESI 機能が提供されます。

エラー処理

によって参照されるファイルが存在する場合があります。タグが存在しないか、サーバー エラーが発生するため、タグの取得に失敗する可能性があります。このような場合、属性 onerror="Continue" を追加することでエラーを無視できます。

<body>
<esi:include src="./header.html" />
<main>
Content
</main>
</body>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

/templates/header.html でエラーが発生した場合、ESI プロセッサはエラーを無視し、 全体を置き換えます。空の文字列を含むタグ。

を使用することで、より構造化されたエラー処理を使用することもできます。ブロックは次のようになります:

<header>Welcome to the web site</header>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ESI プロセッサは最初に の内容を実行します。 esi:include タグによってエラーが発生した場合、ESI プロセッサは の内容を実行します。

全体がブロックは の全体に置き換えられます。成功した場合はブロック、または エラーがある場合。上記の例では、/templates/header.html でエラーが発生すると、テキスト "Main header" も出力に表示されなくなります。 「代替ヘッダー」 というテキストのみが含まれます。詳細については、ESI 言語仕様を参照してください。

条件文

ESI では、変数に対して実行時チェックを実行することにより、条件付き実行も可能です。以下はそのようなチェックの例です:


<header>Welcome to the web site</header>
Content
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

プロセッサが に遭遇したとき。ブロックでは、 を通じて実行されます。ブロックをテストし、テスト属性に設定された式をチェックします。プロセッサは、式が true と評価される最初の esi:when ブロックを実行します。どの式も true と評価されない場合は、esi:otherwise ブロックが指定されている場合は、オプションでそれを実行します。 全体ブロックは、 のいずれか全体で置き換えられます。または 実行するブロック。

プロセッサは、主にリクエスト Cookie に基づく、限られた変数セットを利用可能にします。上の例では、「group」という名前の HTTP Cookie の値がチェックされます。私たちの実装は ESI 言語仕様に基づいています。詳細については、それを参照してください。

サポートされているタグと機能のリスト

この実装は、ESI 言語仕様の次のタグをサポートします。

  • esi:include
  • esi:コメント
  • esi:削除
  • esi:try / esi:attempt / esi:以外
  • esi:選択 / esi:いつ / esi:それ以外
  • esi:vars

タグは仕様でオプションとして定義されており、この実装には含まれていません。

ESI 変数は ESI タグの属性でサポートされ、ESI 式は の test 属性でサポートされます。さらに、コメントがサポートされています。

カスタム動作は無限の可能性を意味します

この機能セットだけでも十分興奮できますが、プログラム可能であることの本当にエキサイティングな部分は、さらに多くのことが可能になることです。 ESI の主な用途はテンプレートの導入ですが、ESI でできることはそれだけではありません。以下に例を示します。

文書内にマークアップされたタイムスタンプがあり、表示時に相対日付として表示したいとします (「2 日前」など)。これを行う方法はたくさんありますが、パフォーマンスとメモリへの影響を最大限に高めるには、ストリーム内で検索/置換を実行するのが最適です。この ESI ライブラリのプログラミングは、実際にこれを行うための優れたオプションとして使用できます。

次のような形式で特別に作成された ESI タグを使用して、バックエンド ドキュメントでエンコードされるタイムスタンプを定義できます。

<body>
<esi:include src="./header.html" />
<main>
Content
</main>
</body>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

たとえば、次のスニペットは太平洋時間の 2024 年 1 月 1 日の午前 0 時を表すことができます。

<header>Welcome to the web site</header>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

次に、その URL パターンを検出したときに合成置換ドキュメントを提供するように EsiTransformStream を設定します。


<header>Welcome to the web site</header>
Content
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

プロセッサが上記のサンプル スニペットに遭遇すると、次のような結果が出力されます (実行する日数に応じて異なります)。

const transformedBody = resp.body.pipeThrough(esiTransformStream);

return new Response(
  transformedBody,
  {
    status: resp.status,
    headers: resp.headers,
  },
);
ログイン後にコピー

バックエンド ドキュメントは Fastly によってキャッシュ可能であるため、処理では更新された相対時間を表示し続けながら、今後のリクエストはキャッシュ ヒットの恩恵を受けることができます。

この実際の例については、次のフィドルを参照してください。

fiddle.fastly.dev

試してみてください!

@fastly/esi が npm で利用できるようになり、あらゆる JavaScript プログラムに追加できるようになりました。もちろん、Fastly Compute プログラムのエッジで使用しますが、実際には、環境がフェッチ API をサポートしている限り、Compute の外部でも機能します。完全なソース コードは GitHub で入手できます。

Fastly アカウントを作成する前であっても、上記の Fiddle のいずれかを複製し、独自のオリジンでテストすることから始めます。弊社のグローバル ネットワークでサービスを公開する準備ができたら、Compute の無料トライアルにサインアップして、npm の ESI ライブラリをすぐに使い始めることができます。

コンピューティングを使用すると、エッジはプログラム可能かつモジュール式になります。最適なソリューションを選択して組み合わせたり、独自のソリューションを構築したりすることもできます。 Compute 用にこのようなモジュールを提供できるのは当社だけではありません。誰もがエコシステムに貢献し、そこから得ることができます。そしていつものように、Fastly コミュニティ フォーラムでお会いして、あなたが何を構築しているのか教えてください!

以上がモジュール式の Edge Side には、JavaScript Compute 用のコンポーネントが含まれていますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート