Skip to content

Commit eb25395

Browse files
authored
Merge pull request #584 from ut-code/add-string-replace
Added String#replace
2 parents 8cda253 + ab48378 commit eb25395

File tree

1 file changed

+33
-26
lines changed

1 file changed

+33
-26
lines changed

docs/3-web-servers/04-server/index.mdx

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)