TL;DR
モダンなフロントエンド開発におけるツール・サービス・フレームワーク・基盤技術について整理してみました。少しゴチャついてますが、独断で私が好きなものや興味あるものを羅列しているだけなので、全てを学ぶ必要はありません。「こんなツールがあるんだ」という感じで見ていただければと思います。面白いフレームワークを見つけたらこのページに追加していきます。
項目 | 内容 |
---|---|
対象者 | フロントエンド開発に興味がある方 |
購読時間 | 60 分 ~ 120 分 |
必要なツール | 特になし |
Front-end Framework
Svelte
Svelte は、フロントエンドフレームワークですが、他のフレームワークとは異なり、ビルド時にコンポーネントを効率的な命令セットにコンパイルします。これによって、ランタイムのパフォーマンスが大幅に向上します。
// Svelteコンポーネントの例
<script lang="ts">
let count = 0;
function handleClick() {
count += 1;
}
</script>
<button on:click={handleClick}>
Clicked {count} {count === 1 ? 'time' : 'times'}
</button>
WebIDE
AI サポート付きのマルチプラットフォーム向け WebIDE。ウェイトリストに登録する必要があります。Google Cloud 上に構築されるブラウザベース。Firebase でウェブに公開。Next.js のようなフルスタック フレームワークにも最適。
Project IDX は、フルスタックのアプリケーション開発のための完全なウェブベースのワークスペースを提供する新しいプロジェクトです。Google Cloud のセキュリティとスケーラビリティに裏打ちされ、ブラウザを開いてから数秒でアプリケーション開発に取り掛かることができます。また、Codey という AI モデルを用いてコード生成やコード補完などを行い、開発を効率化します。
バリデーションライブラリ
Zod
Zod は、TypeScript ファーストのスキーマ宣言およびバリデーションライブラリです。Zod は、開発者にとってできるだけ使いやすいように設計されています。目標は、重複する型宣言を排除することです。Zod を使用すると、バリデータを一度宣言するだけで、Zod が自動的に静的な TypeScript 型を推論します。シンプルな型を複雑なデータ構造に組み合わせるのは簡単です。
特徴
- 依存関係がない
- Node.js とすべての現代のブラウザで動作します
- サイズが小さい:8kb(minified + zipped)
- 不変:メソッド(例えば、.optional())は新しいインスタンスを返します
- 簡潔でチェーン可能なインターフェース
- 関数型のアプローチ:パースする、バリデートしない
- 純粋な JavaScript でも動作します
import { z } from "zod";
const User = z.object({
username: z.string(),
});
User.parse({ username: "Ludwig" });
type User = z.infer<typeof User>;
// { username: string }
RPC フレームワーク
API に静的な型をつけることができます。
tRPC
tRPC は、エンドツーエンドの型安全な API を簡単に作成できるツールです。TypeScript の推論をフルに活用して、フルスタックアプリケーションの生産性を向上させます。サーバーサイドで変更を行った場合、ファイルを保存する前にクライアントでのエラーを TypeScript が警告してくれます。また、tRPC はビルドやコンパイルのステップがなく、コード生成やランタイムの膨張、ビルドステップが不要です。すべての JavaScript フレームワークとランタイムと互換性があり、既存のプロジェクトに追加するのも簡単です。
import { createTRPCProxyClient, httpBatchLink } from "@trpc/client";
import { AppRouter } from "./server";
const trpc = createTRPCProxyClient<AppRouter>({
links: [
httpBatchLink({
url: "http://localhost:3000",
}),
],
});
async function main() {
const res = await trpc.greeting.query({ name: "John" });
console.log(res); // `Hello John`
}
main();
Linter, Formatter
ESLint
ESLint は、JavaScript と TypeScript のためのリンティングツールで、コードの品質と一貫性を保つために使用されます。カスタムルールを設定して、特定のコーディングスタイルやパターンを強制することができます。
// ファイル名: .eslintrc.json
{
"extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint"],
"env": {
"browser": true,
"node": true
}
}
Prettier
Prettier は、JavaScript、TypeScript、CSS などのコードフォーマッタで、コードの書式を一貫して美しく保つために使用されます。Prettier は、コードの書式を自動的に修正し、開発者がコードの書式について考える必要を減らします。
// ファイル名: .prettierrc.json
{
"semi": true,
"singleQuote": true,
"printWidth": 80,
"tabWidth": 2
}
ビルドツール
TurboPack
TurboPack は、JavaScript と TypeScript に最適化されたインクリメンタルバンドラで、Next.js に組み込まれています。ローカル開発を高速化するために、Next.js の pages ディレクトリと app ディレクトリの両方で TurboPack を使用できます。TurboPack を有効にするには、Next.js の開発サーバーを起動する際に --turbo
フラグを使用します。現在、TurboPack は next dev
のみをサポートしており、 next build
はサポートしていません。
{
"scripts": {
"dev": "next dev --turbo",
"build": "next build",
"start": "next start",
"lint": "next lint"
}
}
Vite
Vite は、高速な開発サーバーとビルドツールを提供するフレームワークです。Vue.js の作者である Evan You 氏 によって開発され、Vue.js だけでなく React や Preact、Lit など、様々なフレームワークに対応しています。TypeScript、JSX、CSS などがすぐに使えるようにサポートされています。
npm create vite@latest
Rome
Rome は JavaScript、TypeScript、および Web 向けの統合開発ツールです。フォーマッターとリンターを一体化したもので、開発スタックを統一することで、複数のツールの機能を組み合わせて使用することができます。設定ファイルは 1 つだけで、パフォーマンスは高く、どんなスタックでも動作します。
Rome は、Rust と rust-analyzer に触発された革新的なアーキテクチャで構築されており、沢山のことを高速に行うことができます。開始するためにはゼロの設定が必要で、必要なときには広範なオプションが利用可能です。どんなサイズのコードベースでも扱うことができ、製品の成長に焦点を当てることができます。
# Romeのインストール
$ npm install rome
# チェックの実行
$ npx rome check .
# フォーマットの実行
$ npx rome format .
パッケージマネージャー
npm
npm(Node Package Manager)は、JavaScript のパッケージマネージャで、Node.js のデフォルトのパッケージマネージャとして広く使用されています。npm を使用すると、パッケージのインストール、更新、削除などのタスクを簡単に行うことができます。
# パッケージのインストール
npm install <package-name>
# パッケージの更新
npm update <package-name>
# パッケージの削除
npm uninstall <package-name>
yarn
yarn は、Facebook によって開発された JavaScript のパッケージマネージャで、npm と互換性があります。yarn は、パフォーマンスの最適化とセキュリティの強化に重点を置いています。
# パッケージのインストール
yarn add <package-name>
# パッケージの更新
yarn upgrade <package-name>
# パッケージの削除
yarn remove <package-name>
JavaScript ランタイム
Bun
Bun は、JavaScript と TypeScript のプロジェクトを開発、テスト、実行、バンドルするためのオールインワンの JavaScript ランタイムとツールキットです。Bun は、速度を重視した設計で、バンドラ、テストランナー、Node.js 互換のパッケージマネージャーを備えています。
また、Bun は Node.js の代替品として設計されており、fs、path、Buffer などの Node.js と Web API をネイティブに実装しています。
# Bunのインストール
curl -fsSL https://bun.sh/install | bash
# Bunでのコードの実行
bun index.tsx
Deno
Deno は、JavaScript と TypeScript のためのシンプルでモダンなランタイムです。V8 を使用し、Rust で構築されています。Deno は、開発者にとって最も簡単で、最も安全な JavaScript ランタイムを目指しています。
特徴
- インストールせずに依存関係を回避:セットアップをスキップしてすぐにコードに飛び込むことができます。
- Web 標準 API:サーバー上で動作するブラウザ API を使用した、Web に似たランタイム。
- TypeScript のアウトオブザボックスサポート:依存関係を更新するとすぐに壊れるようなものを設定する時間を費やす必要がありません。
- 優れたオールインワンツール:組み込みのリンター、コードフォーマッター、自己完結型の実行可能ファイルをビルドする機能、テストランナー、IDE 統合などがあります。
- デプロイが簡単:一行のコードで Deno Deploy にローンチし、サーバーの設定をゼロにするか、選択した他のプラットフォームでホストできます。
Testing
Vitest
Vitest は、Vite によって動力を得ている超高速なユニットテストフレームワークです。Vite のネイティブなユニットテストフレームワークとして設計されており、その速度は驚異的です。Jest との互換性があります。Expect、スナップショット、カバレッジなど、Jest からの移行が容易です。
// Example of a test with Vitest
import { test } from "vitest";
test("basic", () => {
// Your test code here
});
※ In-source testing は、ソースコード内でテストを実行する方法を提供します。これは、Rust のモジュールテストに似た概念で、実装と並行してテストを行うことができます。特に、Vitest というツールはこの方法をサポートしており、JavaScript のテストツールキットとして設計されています。Vitest を使用すると、テストの設定、作成、実行が容易になります。
Playwright
Playwright は、モダンな Web アプリケーションのための信頼性の高いエンドツーエンドテストを可能にします。全てのモダンなレンダリングエンジン、つまり Chromium、WebKit、Firefox をサポートしています。また、Windows、Linux、macOS でのテストが可能で、ローカルでも CI でも、ヘッドレスでもヘッドありでも実行できます。さらに、Playwright の API は TypeScript、JavaScript、Python、.NET、Java で使用できます。
npm init playwright@latest
Jest
Jest は、Facebook が開発した JavaScript のテストフレームワークで、React や Node.js のアプリケーションのテストに広く使用されています。Jest は、モック機能、スナップショットテスト、並列テスト実行などの機能を提供します。
// ファイル名: SimpleComponent.test.tsx
import React from "react";
import { render } from "@testing-library/react";
import SimpleComponent from "./SimpleComponent";
test("renders learn react link", () => {
const { getByText } = render(<SimpleComponent message="Test message" />);
const linkElement = getByText(/Test message/i);
expect(linkElement).toBeInTheDocument();
});
React Testing Library
React Testing Library は、React コンポーネントのテストを行うためのライブラリです。React Testing Library は、ユーザーの視点からテストを行うことを重視しており、DOM に対するクエリやイベントの発火などの機能を提供します。
// ファイル名: SimpleComponent.test.tsx
import React from "react";
import { render, screen } from "@testing-library/react";
import SimpleComponent from "./SimpleComponent";
test("renders learn react link", () => {
render(<SimpleComponent message="Test message" />);
const linkElement = screen.getByText(/Test message/i);
expect(linkElement).toBeInTheDocument();
});
CSS-in-JS
Emotion
Emotion は、JavaScript で CSS を記述するためのライブラリで、React コンポーネント内でスタイルを直接管理することができます。Emotion は、動的なスタイル、サーバーサイドレンダリング、テーマのサポートなどの機能を提供します。
// ファイル名: StyledComponent.tsx
/** @jsxImportSource @emotion/react */
import { css } from "@emotion/react";
import React from "react";
type Props = {
color: string;
};
const StyledComponent = ({ color }: Props) => {
return (
<div
css={css`
color: ${color};
`}
>
This is a styled component.
</div>
);
};
export default StyledComponent;
Styled Components
Styled Components は、React コンポーネント内でスタイルを管理することができます。Styled Components は、動的なスタイル、テーマのサポート、サーバーサイドレンダリングなどの機能を提供します。
// ファイル名: StyledComponent.tsx
import styled from "styled-components";
import React from "react";
type Props = {
color: string;
};
const StyledDiv = styled.div<Props>`
color: ${(props) => props.color};
`;
const StyledComponent = ({ color }: Props) => {
return <StyledDiv color={color}>This is a styled component.</StyledDiv>;
};
export default StyledComponent;
Mobile & Desktop
Tauri
Electron 代替です。Tauri は、すべての主要なデスクトッププラットフォーム向けに小さく、驚異的に高速なバイナリを構築するためのフレームワークです。開発者は、ユーザーインターフェースの構築に HTML、JS、CSS にコンパイルする任意のフロントエンドフレームワークを統合できます。既存のフロントエンドフレームワークとの互換性あり。Rust による構築。
npm create tauri-app@latest
Capacitor
ネイティブアプリ変換 Capacitor。Web アプリを iOS、Android、ウェブを横断して同じコードで一つのアプリにすることができる。TypeScript を最初からサポートしていて、設定や依存関係の管理を最小限に抑えることができる。
Figma to Code
Figma for VS Code
Figma for VS Code は、デザインと開発の間のギャップを埋めるためのツールです。この拡張機能を使用すると、VS Code 内から直接 Figma のデザインファイルにアクセスし、コードに必要なデザイン要素を簡単に取得することができます。
コンパイラ
TypeScript
TypeScript は、JavaScript のスーパーセットで、静的型付けとクラスベースのオブジェクト指向を提供します。これにより、大規模なコードベースの管理やバグの早期発見が容易になります。
// ファイル名: SimpleComponent.tsx
import React from "react";
type Props = {
message: string;
};
const SimpleComponent = ({ message }: Props) => {
return <div>{message}</div>;
};
export default SimpleComponent;
Rendering Framework
Nextra
Nextra は、Next.js と MDX を使用して素早くウェブサイトを作成するためのシンプルな静的サイト生成フレームワークです。Next.js の全ての機能を活用しながら、MDX を使用してマークダウン内で React コンポーネントを使用することができます。
Markdown のリンクと画像を自動的に Next.js の Link と Image に変換します。これにより、遅いナビゲーションやレイアウトシフトが発生しません。Shiki によってパワーを供給された、パフォーマンスと信頼性の高いビルド時のシンタックスハイライトソリューションを提供します。Next.js のファイルシステムルーティングを利用して、ページを直感的に整理できます。
import { useData } from 'nextra/data'
export const getStaticProps = ({ params }) => {
return fetch(`https://api.github.com/repos/shuding/nextra`)
.then(res => res.json())
.then(repo => ({
props: {
ssg: {
stars: repo.stargazers_count
}
},
revalidate: 60
}))
}
export const Stars = () => {
const { stars } = useData()
return <strong>{stars}</strong>
}
Nextra has <Stars /> stars on GitHub!
Astro
MPA 思想である Astro は、複数の UI コンポーネントライブラリ(React、Vue、Svelte など)と組み合わせて使用することができます。HTML、CSS、JavaScript のベストプラクティスを維持しながら、Web サイトのパフォーマンスを最適化します。
Astro の最大の利点の一つは、JavaScript の送信量を大幅に削減できることです。Astro は、ページに必要な JavaScript だけをロードします。これにより、ページのパフォーマンスが向上し、特にモバイルデバイスでの体験が改善します。
// ファイル名: src/pages/index.astro
---
import SimpleComponent from '../components/SimpleComponent.astro';
---
<h1>Welcome to My Website!</h1>
<SimpleComponent message="This is a simple message." />
※ また、Astro は完全に静的な HTML を出力するため、サーバーサイドレンダリング(SSR)や JavaScript のバンドルが不要な場合には、Astro が生成した HTML をそのまま納品(少し編集が必要なこともある)することも可能です。これは、SEO 対策や初期ロード時間の短縮にも役立ちます。
Gatsby
Gatsby は、React ベースの静的サイトジェネレータで、パフォーマンスと開発体験に重点を置いています。Gatsby は、GraphQL をデータ取得のためのインターフェースとして使用します。
// ファイル名: src/pages/index.tsx
import React from "react";
import SimpleComponent from "../components/SimpleComponent";
const HomePage = () => {
return (
<div>
<h1>Welcome to My Website!</h1>
<SimpleComponent message="This is a simple message." />
</div>
);
};
export default HomePage;
Next.js
Next.js は、React のフレームワークで、サーバーサイドレンダリング(SSR)や静的サイト生成(SSG)、API ルートなど、モダンなウェブ開発のための機能を提供します。
// ファイル名: pages/index.tsx
import React from "react";
import SimpleComponent from "../components/SimpleComponent";
const HomePage = () => {
return (
<div>
<h1>Welcome to My Website!</h1>
<SimpleComponent message="This is a simple message." />
</div>
);
};
export default HomePage;
3D レンダリングライブラリ
Three.js
Three.js は、WebGL を使った 3D コンテンツ作成を簡単にするための JavaScript ライブラリです。Three.js を使えば、3D グラフィックスをブラウザ上で描画することが可能になり、ユーザーに魅力的な視覚体験を提供することができます。
Three.js は、3D オブジェクトの作成、光源の設定、カメラの制御、マテリアルとテクスチャの設定など、3D シーンを作成するための多くの機能を提供しています。また、GLSL(OpenGL Shading Language)を使ってカスタムシェーダーを作成することも可能です。
// Three.jsの基本的な使用例
import * as THREE from "three";
// シーンの作成
const scene = new THREE.Scene();
// カメラの作成
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
);
camera.position.z = 5;
// レンダラーの作成
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// ジオメトリの作成
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
// アニメーションループ
function animate() {
requestAnimationFrame(animate);
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render(scene, camera);
}
animate();
UI デザイン CSS
CSS Modules
CSS Modules は、CSS をモジュールとして扱うためのツールです。CSS Modules を使用すると、CSS のクラス名がローカルスコープになり、他の CSS クラス名との衝突を防ぐことができます。
// ファイル名: ComponentWithCssModule.tsx
import React from "react";
import styles from "./ComponentWithCssModule.module.css";
const ComponentWithCssModule = () => {
return (
<div className={styles.container}>This is a component with CSS Module.</div>
);
};
export default ComponentWithCssModule;
Tailwind CSS
Tailwind CSS は、ユーティリティファーストの CSS フレームワークで、HTML のマークアップ内に直接スタイルを適用することができます。Tailwind CSS は、レスポンシブデザイン、ダークモード、カスタムテーマなどの機能を提供します。
<!-- ファイル名: ComponentWithTailwind.html -->
<div
class="p-6 max-w-sm mx-auto bg-white rounded-xl shadow-md flex items-center space-x-4"
>
<div class="flex-shrink-0">
<img class="h-12 w-12" src="/img/logo.svg" alt="ChitChat Logo" />
</div>
<div>
<div class="text-xl font-medium text-black">ChitChat</div>
<p class="text-gray-500">You have a new message!</p>
</div>
</div>
ヘッドレス UI
Radix
Radix は、React で高品質でアクセシブルなデザインシステムやウェブアプリを構築するためのオープンソースのコンポーネントライブラリです。スタイルが適用されていないコンポーネントを提供しており、開発者は自分の好みの CSS 技術を使用してスタイルを追加できます。また、各コンポーネントは独立してバージョン管理されているため、新しいコンポーネントを既存のコードと並行して追加することが可能です。
import * as React from "react";
import { Tooltip } from "@radix-ui/react-tooltip";
import { styled } from "@emotion/react";
// Add styles with your preferred CSS technology
const StyledTooltipContent = styled(Tooltip.Content, {
backgroundColor: "black",
color: "white",
borderRadius: "3px",
padding: "5px",
});
type Props = {
children: React.ReactNode;
label: string;
};
const TooltipComponent = ({ children, label }: Props) => {
return (
<Tooltip>
<Tooltip.Trigger>{children}</Tooltip.Trigger>
<StyledTooltipContent sideOffset={5}>{label}</StyledTooltipContent>
</Tooltip>
);
};
export default TooltipComponent;
Headless UI
Headless UI は、完全にスタイルが適用されていない、完全にアクセシブルな UI コンポーネントを提供するライブラリです。これは、Tailwind CSS と美しく統合するように設計されています。
import { Disclosure } from "@headlessui/react";
function Example() {
return (
<Disclosure>
{({ open }) => (
<>
<Disclosure.Button>Open Panel</Disclosure.Button>
<Disclosure.Panel>
{open ? "Panel is open" : "Panel is closed"}
</Disclosure.Panel>
</>
)}
</Disclosure>
);
}
コンポーネントライブラリ
Chakra UI
Chakra UI は、React のためのシンプルでモジュラーなコンポーネントライブラリです。Chakra UI は、アクセシビリティに重点を置いていて、スタイルのカスタマイズが容易。テーマのサポートも提供しています。
// ファイル名: ChakraComponent.tsx
import { Box, Button } from "@chakra-ui/react";
import React from "react";
const ChakraComponent = () => {
return (
<Box padding="4" bg="gray.100">
<Button colorScheme="teal">Chakra Button</Button>
</Box>
);
};
export default ChakraComponent;
Ant Design
Ant Design は、React のためのエンタープライズ級の UI デザイン言語とフレームワークです。Ant Design は、多数の高品質な React コンポーネントを提供し、デザインの一貫性と効率性を向上させます。
// ファイル名: AntComponent.tsx
import { Button } from "antd";
import React from "react";
const AntComponent = () => {
return <Button type="primary">Ant Button</Button>;
};
export default AntComponent;
コンポーネント駆動開発(CDD)
コンポーネントを組み合わせて、大きな機能を実装していく開発手法です。
Atomic Design
Atomic Design は、UI を再利用可能なコンポーネントに分割するための設計方法論です。Atomic Design は、UI を 5 つの階層(Atoms, Molecules, Organisms, Templates, Pages)に分割します。
// ファイル名: AtomicComponent.tsx
import React from "react";
// Atoms
const Label = ({ text }: { text: string }) => <label>{text}</label>;
const Input = ({
value,
onChange,
}: {
value: string;
onChange: (value: string) => void;
}) => <input value={value} onChange={(e) => onChange(e.target.value)} />;
// Molecules
const LabeledInput = ({
labelText,
inputValue,
onInputChange,
}: {
labelText: string;
inputValue: string;
onInputChange: (value: string) => void;
}) => (
<div>
<Label text={labelText} />
<Input value={inputValue} onChange={onInputChange} />
</div>
);
// Organisms, Templates, Pages are composed of Molecules and Atoms
Ladle
Ladle は React のストーリーを迅速に開発・テストするためのツールです。既存のツールとの互換性があり、リンク、テーマ、右から左へのテキスト、ソースコード、アクセシビリティ(axe)、TypeScript、Flow などをすぐにサポートします。Vite によって動かされ、esbuild を使用し、ES モジュールとコード分割を採用しており、HMR/Fast Refresh が各ストーリーで利用可能です。
npm install ladle --save-dev
ladle
Storybook
Storybook は、UI コンポーネントを開発するためのオープンソースツールです。Storybook は、コンポーネントの状態を視覚的に探索でき、再利用可能なコンポーネントのライブラリを作成するのに役立ちます。
// ファイル名: Button.stories.tsx
import React from "react";
import { Story, Meta } from "@storybook/react/types-6-0";
import Button, { ButtonProps } from "./Button";
export default {
title: "Example/Button",
component: Button,
} as Meta;
const Template: Story<ButtonProps> = (args) => <Button {...args} />;
export const Primary = Template.bind({});
Primary.args = {
primary: true,
label: "Button",
};
デプロイ
Vercel
Vercel は、フロントエンドの Web アプリケーションをデプロイするためのプラットフォームです。Vercel は、特に Next.js との統合が深く、プロジェクトを GitHub、GitLab、Bitbucket と連携して、コードの変更を自動的にデプロイすることができます。
# Vercel CLIをインストール
npm i -g vercel
# プロジェクトのディレクトリに移動
cd my-project
# デプロイ
vercel
Amazon S3
Amazon S3 は、インターネット上でデータを保存するためのオブジェクトストレージサービスです。静的な Web サイトのホスティングや、大量のデータを保存するためのバックアップとして使用されます。
# AWS CLIをインストール
pip install awscli
# AWSの認証情報を設定
aws configure
# バケットにファイルをアップロード
aws s3 cp index.html s3://my-bucket
ORM
Prisma
Prisma は、Node.js と TypeScript のためのオープンソースのデータベース ORM です。Prisma を使用すると、データベースのスキーマを定義し、そのスキーマに基づいてデータベースとのやり取りを行うことができます。
// ファイル名: PrismaExample.ts
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
async function main() {
const allUsers = await prisma.user.findMany();
console.log(allUsers);
}
main()
.catch((e) => {
throw e;
})
.finally(async () => {
await prisma.$disconnect();
});
データベース
PlanetScale
PlanetScale は、MySQL 互換のリレーショナルデータベースサービスで、Vitess 技術をベースにしています。PlanetScale は、データベースのスケーリングと管理を容易にするための機能を提供します。
# PlanetScale CLIをインストール
curl -L https://github.com/planetscale/cli/releases/latest/download/pscale-cli-darwin-amd64 -o /usr/local/bin/pscale
chmod +x /usr/local/bin/pscale
# PlanetScaleにログイン
pscale auth login
# データベースに接続
pscale connect my-database main
バックエンドサービス(認証あり)
Supabase
Postgres ベースの RDB、認証、即時 API、エッジ関数、リアルタイムのサブスクリプション、ストレージ、ベクターエンベッディングを使用してプロジェクトを開始することができます。オープンソースの Firebase の代替品として注目を集めています。料金は、Free 版、Pro 版(月額$25)、チーム版(月額$599)。
import { createClient } from "@supabase/supabase-js";
// Initialize
const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL!;
const supabaseKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!;
const supabase = createClient(supabaseUrl, supabaseKey);
// Create a new user
const { user, error } = await supabase.auth.signUpWithPassword({
email: "example@email.com",
password: "example-password",
});
認証
Auth.js
Auth.js は、Web 向けの認証ライブラリです。69 以上の人気のあるサービス(Google、Facebook、Auth0、Apple など)に対する組み込みのサポートがあり、任意の OAuth 2 または OpenID Connect プロバイダーと一緒に使用することができます。
また、組み込みのメール/パスワードレス/マジックリンクを使用したり、任意のユーザー名/パスワードストアと一緒に使用したりすることも可能です。
// Next.jsでのAuth.jsの使用例
// /pages/api/auth/[...nextauth].ts
import NextAuth from "next-auth";
import GitHub from "next-auth/providers/github";
import Facebook from "next-auth/providers/facebook";
import Google from "next-auth/providers/google";
export default NextAuth({
providers: [
GitHub({
clientId: process.env.GITHUB_ID,
clientSecret: process.env.GITHUB_SECRET,
}),
Facebook({
clientId: process.env.FACEBOOK_ID,
clientSecret: process.env.FACEBOOK_SECRET,
}),
Google({
clientId: process.env.GOOGLE_ID,
clientSecret: process.env.GOOGLE_SECRET,
}),
],
});
Auth0
Auth0 は、アプリケーションの認証と認可を管理するためのフレキシブルなソリューションです。Auth0 は、多数の認証プロバイダーをサポートし、ユーザー管理、ログインページのカスタマイズ、セキュリティ機能などを提供します。
// ファイル名: Auth0Component.tsx
import React from "react";
import { useAuth0 } from "@auth0/auth0-react";
const Auth0Component = () => {
const { loginWithRedirect, logout, user, isAuthenticated } = useAuth0();
return (
<div>
{!isAuthenticated && (
<button onClick={() => loginWithRedirect()}>Log In</button>
)}
{isAuthenticated && <button onClick={() => logout()}>Log Out</button>}
{isAuthenticated && <p>Welcome, {user.name}</p>}
</div>
);
};
export default Auth0Component;
Form ライブラリ
React Hook Form
React Hook Form は、React のフォームを簡単に扱うためのライブラリです。React Hook Form は、パフォーマンスを最適化し、再レンダリングを最小限に抑えることができます。
// ファイル名: HookFormComponent.tsx
import React from "react";
import { useForm } from "react-hook-form";
type FormData = {
firstName: string;
lastName: string;
};
const HookFormComponent = () => {
const { register, handleSubmit } = useForm<FormData>();
const onSubmit = (data: FormData) => console.log(data);
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register("firstName")} placeholder="First name" />
<input {...register("lastName")} placeholder="Last name" />
<button type="submit">Submit</button>
</form>
);
};
export default HookFormComponent;
メール送信 API
Resend
Resend は、開発者が大量のメールを一斉に送信するための API を提供するサービスです。例えば、ユーザーへの通知メールやマーケティングメール、パスワードリセットメールなど、アプリケーションから自動的に送信するメールを管理する際に使用します。
また、React を使用して美しいメールテンプレートを作成することも可能です。API を提供しているので、Next.js のサーバーサイドロジックから直接呼び出すことができます。
// app/api/send/route.ts
import { EmailTemplate } from "../../../components/EmailTemplate";
import { NextResponse } from "next/server";
import { Resend } from "resend";
const resend = new Resend(process.env.RESEND_API_KEY);
export async function POST() {
try {
const data = await resend.emails.send({
from: "Acme <onboarding@resend.dev>",
to: ["delivered@resend.dev"],
subject: "Hello world",
react: EmailTemplate({ firstName: "John" }),
});
return NextResponse.json(data);
} catch (error) {
return NextResponse.json({ error });
}
}
バージョン管理
GitHub
GitHub は、ソフトウェア開発プロジェクトをホストするためのプラットフォームです。GitHub は、Git のバージョン管理機能に加えて、コードレビュー、プロジェクト管理、連携アプリケーションの統合など、開発チームが効率的に作業を進めるための機能を提供します。
# リモートリポジトリを追加
git remote add origin https://github.com/user/repo.git
# ローカルの変更をリモートリポジトリにプッシュ
git push -u origin master
CI/CD
GitHub Actions
GitHub Actions は、ソフトウェアワークフローの自動化を支援するためのツールです。GitHub Actions を使用すると、プロジェクトのビルド、テスト、デプロイなどのタスクを自動化し、ワークフローを効率化することができます。
# ファイル名: .github/workflows/main.yml
name: CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Run a one-line script
run: echo Hello, world!
CircleCI
CircleCI は、ソフトウェアのビルド、テスト、デプロイを自動化するための CI/CD プラットフォームです。CircleCI は、高速なフィードバックと効率的なデリバリーを可能にするための機能を提供します。
# ファイル名: .circleci/config.yml
version: 2.1
jobs:
build:
docker:
- image: circleci/node:10
steps:
- checkout
- run: echo "Hello, CircleCI!"
API 設計
GraphQL
GraphQL は、API のクエリ言語とランタイムで、既存のデータを効率的に提供することを可能にします。GraphQL を使用すると、クライアントは必要なデータの種類を指定し、サーバーは正確にそのデータを返すことができます。
// ファイル名: graphqlServer.ts
import { ApolloServer, gql } from "apollo-server";
const typeDefs = gql`
type Query {
hello: String
}
`;
const resolvers = {
Query: {
hello: () => "Hello, world!",
},
};
const server = new ApolloServer({ typeDefs, resolvers });
server.listen().then(({ url }) => {
console.log(`🚀 Server ready at ${url}`);
});
REST API
REST API は、ウェブサービス間の通信を可能にする設計パラダイムです。REST API は、HTTP メソッド(GET、POST、PUT、DELETE など)を使用してリソースを操作します。
// ファイル名: restServer.js
const express = require("express");
const app = express();
const port = 3000;
app.get("/", (req, res) => {
res.send("Hello, world!");
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
GraphQL API ハブ
Apollo GraphQL
Apollo GraphQL は、GraphQL API を構築し、管理するための全体的なソリューションを提供します。Apollo は、クライアントサイドとサーバーサイドの両方で動作し、データの取得と管理を効率化します。
// ファイル名: ApolloClientComponent.tsx
import React from "react";
import {
ApolloProvider,
ApolloClient,
InMemoryCache,
gql,
useQuery,
} from "@apollo/client";
const client = new ApolloClient({
uri: "https://48p1r2roz4.sse.codesandbox.io",
cache: new InMemoryCache(),
});
const GET_DOGS = gql`
query GetDogs {
dogs {
id
breed
}
}
`;
const Dogs = () => {
const { loading, error, data } = useQuery(GET_DOGS);
if (loading) return "Loading...";
if (error) return `Error! ${error.message}`;
return (
<div>
{data.dogs.map((dog) => (
<div key={dog.id}>
<p>{dog.breed}</p>
</div>
))}
</div>
);
};
const ApolloClientComponent = () => (
<ApolloProvider client={client}>
<Dogs />
</ApolloProvider>
);
export default ApolloClientComponent;
API 呼び出し
Axios
Axios は、ブラウザと Node.js のための Promise ベースの HTTP クライアントです。Axios を使用すると、簡単に HTTP リクエストを作成し、レスポンスを処理することができます。
// ファイル名: axiosExample.tsx
import React, { useEffect, useState } from "react";
import axios from "axios";
const AxiosExample = () => {
const [data, setData] = useState(null);
useEffect(() => {
const fetchData = async () => {
const result = await axios("https://api.example.com/data");
setData(result.data);
};
fetchData();
}, []);
return <div>{data ? data : "Loading..."}</div>;
};
export default AxiosExample;
Apollo Client
Apollo Client は、GraphQL API との通信を簡単にするためのライブラリです。Apollo Client を使用すると、データの取得、キャッシュ、更新などを効率的に行うことができます。
// ファイル名: ApolloClientExample.tsx
import React from "react";
import {
ApolloProvider,
ApolloClient,
InMemoryCache,
gql,
useQuery,
} from "@apollo/client";
const client = new ApolloClient({
uri: "https:XXXX",
cache: new InMemoryCache(),
});
const GET_DOGS = gql`
query GetDogs {
dogs {
id
breed
}
}
`;
const Dogs = () => {
const { loading, error, data } = useQuery(GET_DOGS);
if (loading) return "Loading...";
if (error) return `Error! ${error.message}`;
return (
<div>
{data.dogs.map((dog) => (
<div key={dog.id}>
<p>{dog.breed}</p>
</div>
))}
</div>
);
};
const ApolloClientExample = () => (
<ApolloProvider client={client}>
<Dogs />
</ApolloProvider>
);
export default ApolloClientExample;