Skip to content

Commit ef9b298

Browse files
committed
Added String#replace
1 parent 1d84f60 commit ef9b298

File tree

1 file changed

+58
-0
lines changed

1 file changed

+58
-0
lines changed

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

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,61 @@ console.log(["Apple", "Banana", "Orange"].join("/")); // Apple/Banana/Orange
193193

194194
このようにテンプレートリテラルを用いることで、複雑なウェブページの内容を表すことができます。
195195

196+
:::tip[`String#replace`]
197+
198+
上記のようにテンプレートリテラルを使って HTML を作成することもできますが、HTML がもっと長くなったり、さらに複雑なプログラムが必要になってきたらこのまま続けていくのは難しそうです。
199+
200+
[`String#replace`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace) メソッドは、第一引数に与えられた文字列 (または[正規表現]) に一致する文字列を第二引数の文字列に置き換えた新しい文字列を返します。
201+
第一引数が文字列の場合は、最初に一致した場所のみを置き換えます。
202+
一致するすべての場所を置き換えたい場合は、代わりに [`String#replaceAll`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll) を使います。
203+
元の文字列は変更されません。
204+
205+
```js
206+
const base = "ABCBCC";
207+
document.write(base.replace("BC", "EFG")); // AEFGBCC
208+
document.write(base.replaceAll("C", "T")); // ABTBTT
209+
```
210+
211+
これと `fs.readFileSync` 関数を用いることで、HTML を別のファイルに分けて保存することができるようになり、より簡単に管理することができます。
212+
213+
```js title="main.mjs"
214+
import express from "express";
215+
import fs from "fs";
216+
217+
const app = express();
218+
219+
const names = ["田中", "鈴木", "佐藤"];
220+
app.get("/", (request, response) => {
221+
const index = fs.readFileSync("./index.html", "utf-8");
222+
const html = index.replace(
223+
"{users}",
224+
names.map((user) => `<li>${user}</li>`).join(""),
225+
);
226+
response.send(html);
227+
});
228+
229+
app.listen(3000);
230+
```
231+
232+
```html title="index.html"
233+
<!doctype html>
234+
<html lang="ja">
235+
<head>
236+
<meta charset="utf-8" />
237+
<title>Title</title>
238+
</head>
239+
<body>
240+
<ul>
241+
{users}
242+
</ul>
243+
</body>
244+
</html>
245+
```
246+
247+
:::
248+
249+
{/* prettier-ignore */}
250+
{/* いったんコメントアウト、必要そうならいい感じにして戻してください
196251
:::tip[テンプレートエンジン]
197252
上記のようにテンプレートリテラルを使って HTML を作成することもできますが、HTML がもっと長くなったり、さらに複雑なプログラムが必要になってきたらこのまま続けていくのは難しそうです。
198253
[EJS](https://ejs.co/) をはじめとした**テンプレートエンジン**は、プログラミング言語から HTML などを作成する作業を簡単にしてくれます。先ほどのプログラムを、EJS を用いて書き換えると、次のようになります。(手元で試したい場合は `ejs` をインストールしてください)
@@ -235,6 +290,8 @@ app.listen(3000);
235290
236291
<ViewSource url={import.meta.url} path="_samples/ejs-template-engine" />
237292
293+
\*/}
294+
238295
イベントハンドラの中で、プログラムではまず `fs.readFileSync` 関数を用いて `template.ejs` ファイルの内容を読み込んでいます。その次の行の [`ejs.render` 関数](https://ejs.co/#docs) がポイントです。この関数は、第 1 引数にテンプレートを文字列として受け取り、諸々の変換を行った後の文字列を返します。第 2 引数には、変換の際に埋め込みたいデータをオブジェクトの形式で指定します。
239296

240297
このオブジェクトのキーと同じ名前の変数が、テンプレート内で利用できます。上の例の `template.ejs` における `listItems` は、`main.mjs` で指定した `{ listItems: names }` により `["田中", "鈴木", "佐藤"]` になります。
@@ -255,3 +312,4 @@ app.listen(3000);
255312
解答例 2:
256313

257314
<ViewSource url={import.meta.url} path="_samples/server-or-client" />
315+
````

0 commit comments

Comments
 (0)