@@ -193,30 +193,23 @@ console.log(["Apple", "Banana", "Orange"].join("/")); // Apple/Banana/Orange
193193
194194このようにテンプレートリテラルを用いることで、複雑なウェブページの内容を表すことができます。
195195
196- :::tip[ テンプレートエンジン]
197- 上記のようにテンプレートリテラルを使って HTML を作成することもできますが、HTML がもっと長くなったり、さらに複雑なプログラムが必要になってきたらこのまま続けていくのは難しそうです。
198- [ EJS] ( https://ejs.co/ ) をはじめとした** テンプレートエンジン** は、プログラミング言語から HTML などを作成する作業を簡単にしてくれます。先ほどのプログラムを、EJS を用いて書き換えると、次のようになります。(手元で試したい場合は ` ejs ` をインストールしてください)
196+ :::tip[ ` String#replace ` メソッド]
199197
200- ``` javascript title=main.mjs
201- import { readFileSync } from " fs" ;
202- import express from " express" ;
203- import { render } from " ejs" ;
198+ 上記のようにテンプレートリテラルを使って HTML を作成することもできますが、HTML がもっと長くなったり、さらに複雑なプログラムが必要になってきたらこのまま続けていくのは難しそうです。
204199
205- const app = express ();
206-
207- const names = [" 田中" , " 鈴木" , " 佐藤" ];
208- app .get (" /" , (request , response ) => {
209- const template = readFileSync (" template.ejs" , " utf-8" );
210- const html = render (template, {
211- listItems: names,
212- });
213- response .send (html);
214- });
200+ [ ` String#replace ` ] ( https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace ) メソッドは、第一引数に与えられた文字列に一致する文字列を第二引数の文字列に置き換えた新しい文字列を返します。
201+ ` String#replace ` メソッドは、最初に一致した場所のみを置き換えます。
202+ 一致するすべての場所を置き換えたい場合は、代わりに [ ` String#replaceAll ` ] ( https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll ) メソッドを使います。
215203
216- app .listen (3000 );
204+ ``` js
205+ const base = " ABCBCC" ;
206+ document .write (base .replace (" BC" , " EFG" )); // AEFGBCC
207+ document .write (base .replaceAll (" C" , " T" )); // ABTBTT
217208```
218209
219- ``` html title=template.ejs
210+ ` String#replace ` メソッドを用いることで、長い HTML を見通しよく記述できるようになります。
211+
212+ ``` html title="index.html"
220213<!doctype html>
221214<html lang =" ja" >
222215 <head >
@@ -225,21 +218,35 @@ app.listen(3000);
225218 </head >
226219 <body >
227220 <ul >
228- <% for (const listItem of listItems) { %>
229- <li ><%= listItem %></li >
230- <% } %>
221+ {users}
231222 </ul >
232223 </body >
233224</html >
234225```
235226
236- <ViewSource url = { import .meta .url } path = " _samples/ejs-template-engine" />
227+ ``` js title="main.mjs"
228+ import express from " express" ;
229+ import { readFileSync } from " fs" ;
230+
231+ const app = express ();
232+
233+ const names = [" 田中" , " 鈴木" , " 佐藤" ];
234+ app .get (" /" , (request , response ) => {
235+ const template = fs .readFileSync (" ./index.html" , " utf-8" );
236+ const html = template .replace (
237+ " {users}" ,
238+ names .map ((name ) => ` <li>${ name} </li>` ).join (" " ),
239+ );
240+ response .send (html);
241+ });
242+
243+ app .listen (3000 );
244+ ```
237245
238- イベントハンドラの中で 、プログラムではまず ` fs.readFileSync ` 関数を用いて ` template.ejs ` ファイルの内容を読み込んでいます。その次の行の [ ` ejs.render ` 関数 ] ( https://ejs.co/#docs ) がポイントです。この関数は、第 1 引数にテンプレートを文字列として受け取り、諸々の変換を行った後の文字列を返します。第 2 引数には、変換の際に埋め込みたいデータをオブジェクトの形式で指定します 。
246+ リクエストを受け取ったとき 、プログラムではまず ` fs.readFileSync ` 関数を用いて ` index.html ` ファイルの内容を文字列として読み込んでいます 。
239247
240- このオブジェクトのキーと同じ名前の変数が、テンプレート内で利用できます。上の例の ` template.ejs ` における ` listItems ` は、 ` main.mjs ` で指定した ` { listItems: names } ` により ` ["田中", "鈴木", "佐藤"] ` になります 。
248+ 次の行で ` String#replace ` メソッドを用いて、読み込んだ HTML ファイルの中の ` "{users}" ` を、 ` names ` を箇条書きにした文字列に置換します 。
241249
242- テンプレート内の ` <% ` から ` %> ` で囲まれた部分は、JavaScript のプログラムとして実行されます。また、` <%= ` から ` %> ` で囲まれた部分は JavaScript の式として評価され、最終的な結果に埋め込まれます。
243250:::
244251
245252## 課題
0 commit comments