HTMLとTSXの違いって?? Next.jsを始めたばかりの私が、やさしく整理してみました
HTMLなら少し分かるけれど、Next.jsを開いたら突然出てきた「TSX」。
見た目はHTMLに似ているのに、同じように書くとエラーになることもあります。
この記事では、HTMLとTSXの違いを初心者目線で一つずつ整理します。
Next.jsで出会った「TSX」
Next.jsの勉強を始めて、最初に少し戸惑ったものの一つが 「TSX」でした。
HTMLファイルなら、これまでのWeb制作でも見慣れています。
ところがNext.jsのプロジェクトを開くと、
page.tsxやlayout.tsxといったファイルが並んでいます。
最初に感じた疑問
「見た目はHTMLみたいだけれど、普通のHTMLと何が違うの?」
「どうしてHTMLファイルではなく、TSXファイルに書くの?」
実際に触ってみると、TSXはHTMLとまったく別のものというより、 HTMLに似た書き方を使いながら、JavaScriptやTypeScriptの処理も一緒に書けるもの と考えると理解しやすくなりました。
まずは、HTMLとTSXがそれぞれ何をするものなのかを見ていきます。
そもそもHTMLとは?
HTMLは、Webページの構造を作るためのマークアップ言語です。
見出し、文章、画像、リンク、表など、 ページの中にどのような要素があるのかをタグで表します。
<section class="profile">
<h2>プロフィール</h2>
<p>Web制作を勉強しています。</p>
<a href="/contact/">お問い合わせ</a>
</section>
HTMLは、基本的にタグを使って文書の意味や構造を組み立てます。
<h1>や<h2>は見出し<p>は文章<a>はリンク<img>は画像<section>は内容のまとまり
HTMLは、Webページの「骨組み」を作るためのものです。 ブラウザーはHTMLを読み取り、見出しや文章、画像などを画面に表示します。
TSXとは?
TSXは、簡単にいうと TypeScriptの中に、HTMLのような見た目の記述を書ける形式です。
ReactやNext.jsでは、画面を作るためにJSXという記法を使います。 そのJSXにTypeScriptの型チェックを加えたものがTSXです。
例えば、次のようなコードがTSXです。
export default function Profile() {
const name: string = "さくら";
return (
<section className="profile">
<h2>プロフィール</h2>
<p>こんにちは、{name}です。</p>
</section>
);
}
タグの部分だけを見るとHTMLに似ています。 しかし、上には関数があり、文字列を入れた変数も書かれています。
さらに{name}のように波括弧を使うと、
TypeScriptやJavaScriptの値を画面内に表示できます。
TSXは、画面の見た目と、画面に表示するデータや処理を、 一つのファイル内で関連づけて書ける仕組みです。
HTMLとTSXの主な違い
HTMLとTSXは見た目がよく似ていますが、役割や書き方にはいくつか違いがあります。
| 比較項目 | HTML | TSX |
|---|---|---|
| 主な役割 | ページの構造を作る | Reactコンポーネントとして画面を作る |
| 使用する場所 | 通常のHTMLファイル | ReactやNext.jsのファイル |
| 拡張子 | .html |
.tsx |
| 変数の表示 | そのままではできない | { }の中に書ける |
| 条件分岐 | HTML単体ではできない | JavaScriptの処理を使える |
| 繰り返し表示 | 同じタグを手作業で書く | map()などで生成できる |
| 属性の書き方 | class |
className |
| 型チェック | なし | TypeScriptによるチェックあり |
HTMLは完成した文書に近い
HTMLでは、表示したい内容をタグの中に直接書いていきます。
<h2>新着記事</h2>
<p>HTMLとTSXの違いを解説します。</p>
TSXはデータから画面を作れる
TSXでは、変数や外部から取得したデータを使って画面を作れます。
const title = "HTMLとTSXの違いを解説します";
return (
<>
<h2>新着記事</h2>
<p>{title}</p>
</>
);
この違いは、microCMSのような外部サービスから取得したデータを表示するときに、 とても重要になります。
TSXで特に気をつけたい書き方
HTMLの知識があるとTSXも理解しやすいのですが、 HTMLとまったく同じようには書けません。
初心者のうちは間違えやすいポイントを、順番に確認します。
classではなくclassNameを使う
HTMLではCSSのクラス名を指定するときにclassを使います。
しかし、TSXではclassNameと書きます。
<div class="card">
カードの内容
</div>
<div className="card">
カードの内容
</div>
TypeScriptやJavaScriptではclassが別の意味を持つため、
TSXではclassNameを使用します。
タグは必ず閉じる
TSXでは、開始したタグを必ず閉じる必要があります。 画像や改行のように中身を持たないタグも、最後にスラッシュを付けます。
<img src="/images/photo.jpg">
<br>
<img src="/images/photo.jpg" />
<br />
複数の要素は一つにまとめる
Reactのコンポーネントから返す要素は、 基本的に一つの親要素で囲む必要があります。
return (
<h1>タイトル</h1>
<p>本文です。</p>
);
return (
<div>
<h1>タイトル</h1>
<p>本文です。</p>
</div>
);
不要なdivを増やしたくないときは、
フラグメントと呼ばれる<>と</>も使えます。
return (
<>
<h1>タイトル</h1>
<p>本文です。</p>
</>
);
JavaScriptの処理は波括弧の中に書く
TSXのタグ内で変数や計算結果を表示するときは、
{ }を使います。
const userName = "あかり";
const articleCount = 5;
return (
<div>
<p>こんにちは、{userName}さん。</p>
<p>記事は全部で{articleCount}件あります。</p>
</div>
);
波括弧の中には、変数だけでなく計算式や関数の実行結果も書けます。
<p>合計金額は{1200 + 800}円です。</p>
style属性は文字列ではなくオブジェクトで書く
HTMLでは、style属性の中にCSSを文字列として書けます。 TSXでは、JavaScriptのオブジェクトとして指定します。
<p style="color: pink;">
ピンクの文字
</p>
<p style={{ color: "pink" }}>
ピンクの文字
</p>
ただし、実際のNext.js制作では、 CSS Modulesや通常のCSSファイルを使って装飾することも多いです。
TSXでは条件によって表示を変えられる
TSXの大きな特徴は、データの状態に合わせて表示内容を変えられることです。
例えば、ログインしているときだけメッセージを表示する、 記事が存在しないときは別の案内を表示する、といった処理ができます。
export default function UserMessage() {
const isLoggedIn = true;
return (
<div>
{isLoggedIn ? (
<p>ログインしています。</p>
) : (
<p>ログインしてください。</p>
)}
</div>
);
}
isLoggedInがtrueなら「ログインしています」、
falseなら「ログインしてください」と表示されます。
HTMLは基本的に書かれた内容をそのまま表示しますが、 TSXはデータや条件に合わせて、表示する内容を組み立てられます。
配列のデータを繰り返し表示できる
ブログの記事一覧や商品一覧のように、 同じ形の要素を何件も表示したい場面があります。
HTMLだけで作る場合は、同じようなタグを件数分書く必要があります。
<article>
<h3>記事タイトル1</h3>
</article>
<article>
<h3>記事タイトル2</h3>
</article>
<article>
<h3>記事タイトル3</h3>
</article>
TSXでは、配列のデータをmap()で繰り返して表示できます。
const articles = [
{ id: 1, title: "HTMLの基本" },
{ id: 2, title: "TSXの基本" },
{ id: 3, title: "Next.jsの始め方" },
];
export default function ArticleList() {
return (
<div>
{articles.map((article) => (
<article key={article.id}>
<h3>{article.title}</h3>
</article>
))}
</div>
);
}
これなら、記事が3件でも30件でも、 基本となる画面のコードは一つだけで済みます。
microCMSから取得した記事一覧を表示するときも、 このような繰り返し処理を使います。
Next.jsではTSXをどう使う?
Next.jsでは、ページや共通パーツをReactコンポーネントとして作ります。
App Routerを使用している場合、
例えばトップページはsrc/app/page.tsxに記述します。
src
└── app
├── layout.tsx
├── page.tsx
├── globals.css
└── blog
└── page.tsx
page.tsxには、そのURLで表示する画面を書きます。
export default function Home() {
return (
<main>
<h1>はじめてのNext.js</h1>
<p>TSXを使ってトップページを作っています。</p>
</main>
);
}
このHomeという関数は、Reactコンポーネントです。
関数の中でreturnしたTSXが、ブラウザーに表示される画面になります。
page.tsxに画面を記述
Reactの画面として組み立てる
最終的にはHTMLとして表示される
私が最初に混乱したのは、 「TSXがそのままブラウザーに表示される」と思っていたからでした。
実際には、Next.jsやReactがTSXを処理し、 最終的にブラウザーが理解できるHTMLなどへ変換してくれます。
コンポーネントに分けると管理しやすい
Next.jsでは、ヘッダー、ボタン、記事カードなどを 小さなコンポーネントに分けて作れます。
例えば、記事カードを次のようなTSXファイルとして作ります。
type ArticleCardProps = {
title: string;
description: string;
};
export default function ArticleCard({
title,
description,
}: ArticleCardProps) {
return (
<article className="article-card">
<h2>{title}</h2>
<p>{description}</p>
</article>
);
}
ページ側では、作成したコンポーネントを読み込んで使います。
import ArticleCard from "@/components/ArticleCard";
export default function Home() {
return (
<main>
<ArticleCard
title="HTMLとTSXの違い"
description="初心者向けにやさしく解説します。"
/>
</main>
);
}
titleやdescriptionのように、
コンポーネントへ渡す値をpropsと呼びます。
TypeScriptでは、どのようなpropsを受け取るのかを型として書けるため、 間違った値を渡したときにエディターが教えてくれます。
microCMSのデータをTSXで表示する
Next.jsとmicroCMSを組み合わせる場合、 microCMSから取得した記事タイトルや本文をTSX内で表示します。
ここでは仕組みを理解するために、簡単な形で見てみます。
type Article = {
id: string;
title: string;
description: string;
};
export default async function BlogPage() {
const articles: Article[] = await getArticles();
return (
<main>
<h1>ブログ記事一覧</h1>
{articles.map((article) => (
<article key={article.id}>
<h2>{article.title}</h2>
<p>{article.description}</p>
</article>
))}
</main>
);
}
microCMSから取得したデータがarticlesに入り、
map()で記事を一件ずつ表示しています。
HTMLだけを見ると同じ記事カードが並んでいるように見えますが、 実際にはmicroCMSに登録した内容から自動で作られています。
記事を登録・更新する
取得したデータを画面に組み込む
記事ページとして表示する
microCMSから届くデータは、記事ごとに内容や件数が変わります。 TSXなら、取得したデータに合わせて見出しや本文、一覧を動的に組み立てられます。
最初から全部理解しなくても大丈夫
TSXを初めて見たときは、 HTML、JavaScript、TypeScript、Reactの書き方が一度に出てきたように感じます。
私自身も、最初はどこまでがHTMLで、 どこからがTypeScriptなのか分からなくなることがありました。
けれど、最初からすべてを理解しようとしなくても大丈夫です。 まずは次の順番で覚えると、少しずつ整理しやすくなります。
-
1
HTMLのタグ部分を見る
まずは
h1、p、sectionなど、 見慣れたタグを確認します。 -
2
classNameと閉じタグに慣れるHTMLとの細かな違いを、少しずつ覚えていきます。
-
3
波括弧の中に変数を入れてみる
文字列や数字を変数にして、画面へ表示してみます。
-
4
配列を
map()で表示する記事一覧やカード一覧の作成に挑戦します。
-
5
microCMSのデータに置き換える
固定のデータを表示できたら、APIから取得したデータへ進みます。
初心者がよく出会うエラー
TSXを書き始めたばかりの頃に出会いやすいエラーをまとめました。
複数のタグを返す場合は、divやフラグメントで囲みます。
imgやinputも、
TSXでは/>で閉じます。
classと書いている
CSSクラスの指定にはclassNameを使います。
TSXでは括弧が増えやすいため、開始と終了をセットで確認します。
map()内の要素にkeyがない
一覧を表示するときは、
一番外側の要素にkeyを指定します。
エラーが出ると難しく感じてしまいますが、 エディターが間違っている場所を教えてくれることも多いです。
エラーメッセージの行番号を確認し、 その少し上からタグや括弧が閉じられているかを見ると、 原因を見つけやすくなります。
まとめ:TSXはHTMLに処理を加えられる書き方
HTMLとTSXは見た目がよく似ていますが、 同じものではありません。
Webページの見出しや文章、画像などの構造を作るための言語。
HTMLのようなタグと、TypeScriptのデータや処理を組み合わせて画面を作る記法。
Next.jsでは、ページやコンポーネントをTSXで作成します。 TSXを使うことで、変数の値を表示したり、条件によって内容を変えたり、 microCMSから取得した記事を一覧表示したりできます。
今回覚えておきたいこと
- TSXはHTMLに似ているけれど、TypeScriptの中に書く記法
classではなくclassNameを使う- タグは必ず閉じる
- 変数や処理は
{ }の中に書く - 複数の要素は一つの親要素かフラグメントで囲む
- 配列やmicroCMSのデータから画面を作れる
TSXは、HTMLだけを書いていたときよりも覚えることが多く感じます。 それでも、HTMLの知識はそのまま土台として役立ちます。
まずは小さなページを作り、 文字を表示する、変数を入れる、一覧を作るという順番で試していけば、 少しずつNext.jsらしい書き方に慣れていけそうです。