心を耕す:Next.jsとMDXで心の健康デジタルガーデンを作る方法
Next.jsとMDXを使って、精神的な健康のためのメモを保存・検索できる個人的なデジタルガーデンを作る方法を学びましょう。振り返りと成長のための空間を作るステップバイステップのチュートリアルです。
このページの内容
私たちのスピードが速い世界の中で、静かに内省するための空間を見つけることは、かつてないほど重要です。「デジタル庭園」は個人的な知識管理へのユニークなアプローチです—時系列のブログよりも、あなたの考え、学習、内省を育む、生きた進化する空間です。伝統的なブログとは異なり、デジタル庭園は進行中の永遠の作品であり、関連するアイデアが時間とともに成長することを可能にします。
このチュートリアルでは、Next.jsとMDXを使用して、精神的な健康のためのメモ専用のデジタル庭園を構築します。あなたの旅を記録し、考えをつなげ、自分自身へのより深い理解を育む、プライベートで穏やかなオンライン空間を作成します。
前提条件:
- ReactとJavaScriptの基本的な理解。
- マシンにインストールされたNode.jsとnpm(またはyarn)。
- VS Codeなどのコードエディタ。
問題の理解:伝統的なメモ取りを超えて
標準的なメモ取りアプリケーションは硬直的で線形になることがあります。精神的な健康にとって、私たちの考えはしばしば相互に関連しており、タイムラインにすっきりと収まらないことが多いです。非線形の接続と個人的な成長を重視するデジタル庭園のアプローチは、このような個人的な情報を管理するためのより直感的な方法を提供します。
Next.jsを使用することで、庭園を構築するための強力で高速なフレームワークが得られます。MDX(JSX付きMarkdown)はここ最近のゲームチェンジャーであり、より豊かでダイナミックな体験のためにインタラクティブなReactコンポーネントをメモに直接埋め込むことを可能にします。
前提条件:あなたのデジタル温室を設定する
まず、プロジェクトを設定しましょう。ターミナルを開き、次を実行してください:
npx create-next-app@latest mental-health-garden
このプロジェクトにはTypeScriptとTailwind CSSを選択して、プロンプトに従ってください。
インストールが完了したら、新しいプロジェクトディレクトリに移動してください:
cd mental-health-garden
次に、MDXで作業するために必要なパッケージをインストールします:
npm install @next/mdx @mdx-js/loader @mdx-js/react gray-matter
次に、Next.jsがMDXファイルを認識するように設定します。プロジェクトのルートにnext.config.mjsファイルを作成し、次を追加してください:
// next.config.mjs
import createMDX from '@next/mdx'
/** @type {import('next').NextConfig} */
const nextConfig = {
pageExtensions: ['js', 'jsx', 'md', 'mdx', 'ts', 'tsx'],
}
const withMDX = createMDX({
// 必要に応じてここにマークダウンプラグインを追加
})
export default withMDX(nextConfig)
これにより、Next.jsは.mdxファイルをページとして扱うようになります。
ステップ1:最初の種を植える(MDXメモの作成)
何をしているのか
精神的な健康メモをMDXファイルとして保存するディレクトリを作成します。各ファイルには、コンテンツと「フロントマター」(タイトル、日付、タグなどのメタデータ)が含まれます。
実装
- プロジェクトのルートに
notesディレクトリを作成してください。 notesディレクトリ内に、最初のメモを作成してください。例えば:first-reflection.mdx。first-reflection.mdxに次のコンテンツを追加してください:
---
title: '私の最初の内省'
date: '2025-12-18'
tags: ['マインドフルネス', '始まり']
---
# 旅を受け入れる
これは私のデジタル庭園での最初のエントリーです。これは私の考えを植えて、成長を見守るための空間です。
今日、私は**マインドフルネス**という概念に焦点を当てています。それは判断なしで瞬間に存在することについてです。
マインドフルネスであると気づいたとき、不安が軽減傾向があります。それは強力なツールです。
仕組み
---間のセクションはフロントマターです。gray-matterというライブラリを使用してこのデータを解析します。ファイルの残りの部分は、JSXコンポーネントの可能性を備えた標準的なMarkdownです。
ステップ2:メモを表示する
何をしているのか
MDXメモをレンダリングするためにNext.jsで動的ルートを作成します。これは、notesディレクトリに追加するファイルがすべて自動的にデジタル庭園内のページになることを意味します。
実装
appディレクトリに新しいフォルダ構造を作成してください:notes/[slug]。notes/[slug]内にpage.tsxファイルを作成してください。これは各メモを表示するためのテンプレートになります。
// app/notes/[slug]/page.tsx
import fs from 'fs';
import path from 'path';
import matter from 'gray-matter';
import { MDXRemote } from 'next-mdx-remote/rsc';
import { notFound } from 'next/navigation';
const notesDirectory = path.join(process.cwd(), 'notes');
export async function generateStaticParams() {
const files = fs.readdirSync(notesDirectory);
return files.map((filename) => ({
slug: filename.replace('.mdx', ''),
}));
}
export default async function NotePage({ params }: { params: { slug: string } }) {
const { slug } = params;
const filePath = path.join(notesDirectory, `${slug}.mdx`);
if (!fs.existsSync(filePath)) {
return notFound();
}
const source = fs.readFileSync(filePath, 'utf8');
const { content, data } = matter(source);
return (
<article className="prose lg:prose-xl mx-auto p-4">
<h1>{data.title}</h1>
<p className="text-sm text-gray-500">
{new Date(data.date).toLocaleDateString()}
</p>
<div className="mt-4">
<MDXRemote source={content} />
</div>
</article>
);
}
仕組み
generateStaticParamsは、Next.jsにメモごとにページをプリレンダリングするよう指示します。NotePageコンポーネントは対応する.mdxファイルを読み取り、gray-matterを使用してフロントマターとコンテンツを解析し、MDXRemoteを使用してコンテンツをレンダリングします。
ステップ3:カスタムコンポーネントでマインドフルなUIを作成する
何をしているのか
精神的な健康庭園は穏やかで個人的であるべきです。Tailwind CSSを使用して、クリーンでミニマリストなデザインを作成し、主要な洞察を強調表示するためにMDXファイルに埋め込むカスタムReactコンポーネントを構築します。
実装
- スタイリング:あなたの
app/globals.cssで、落ち着いたカラーパレットとタイポグラフィを定義できます。 - カスタムコンポーネント:プロジェクトルートの
componentsディレクトリを作成してください。その中にInsight.tsxというファイルを作成してください:
// components/Insight.tsx
import React from 'react';
const Insight = ({ children }: { children: React.ReactNode }) => {
return (
<div className="bg-blue-100 border-l-4 border-blue-500 text-blue-700 p-4 my-4 rounded">
<p className="font-bold">洞察 ✨</p>
{children}
</div>
);
};
export default Insight;
- このコンポーネントをMDXファイルで使用するには、プロジェクトのルートに
mdx-components.tsxファイルを作成してください:
// mdx-components.tsx
import type { MDXComponents } from 'mdx/types';
import Insight from './components/Insight';
export function useMDXComponents(components: MDXComponents): MDXComponents {
return {
Insight,
...components,
};
}
注:このファイルは、App RouterでMDXコンポーネントを利用可能にするために重要です。
- 今、
Insightコンポーネントを.mdxファイルで使用できます:
---
title: 'マインドフルな瞬間'
date: '2025-12-19'
tags: ['マインドフルネス', '不安']
---
# 混沌の中で静けさを見つける
<Insight>
圧倒されたと感じたとき、たった5回の深呼吸を取るだけで大きな違いを生むことができます。
</Insight>
ステップ4:考えを相互にリンクさせる
何をしているのか
デジタル庭園の主な機能は、関連するアイデアを接続する能力です。Next.jsのLinkコンポーネントを使用して、メモ内にこれらの接続を作成します。
実装
mdx-components.tsxファイルを更新して、内部リンクにはNext.jsのLinkコンポーネントでデフォルトのaタグをオーバーライドしてください。
// mdx-components.tsx
import type { MDXComponents } from 'mdx/types';
import Insight from './components/Insight';
import Link from 'next/link';
import { useMemo } from 'react';
export function useMDXComponents(components: MDXComponents): MDXComponents {
return {
Insight,
a: (props) => {
const href = props.href as string;
if (href.startsWith('/')) {
return <Link href={href} {...props} />;
}
return <a {...props} />;
},
...components,
};
}
- 今、标准的なMarkdown構文を使用してメモ間をリンクできます:
この考えは[[first-reflection]]に戻ってつながっています。
[first-reflection]: /notes/first-reflection
ステップ5:シンプルな検索の実装
何をしているのか
庭園が成長するにつれてナビゲート可能にするために、シンプルな検索機能を追加します。検索クエリに一致するメモを返すAPIルートを作成します。
実装
app/api/search/route.tsにAPIルートを作成してください:
// app/api/search/route.ts
import { NextResponse } from 'next/server';
import fs from 'fs';
import path from 'path';
import matter from 'gray-matter';
const notesDirectory = path.join(process.cwd(), 'notes');
export async function GET(request: Request) {
const { searchParams } = new URL(request.url);
const query = searchParams.get('q');
if (!query) {
return NextResponse.json({ error: 'クエリパラメータが必要です' }, { status: 400 });
}
const files = fs.readdirSync(notesDirectory);
const results = files
.map((filename) => {
const filePath = path.join(notesDirectory, filename);
const fileContents = fs.readFileSync(filePath, 'utf8');
const { data, content } = matter(fileContents);
if (
data.title.toLowerCase().includes(query.toLowerCase()) ||
content.toLowerCase().includes(query.toLowerCase())
) {
return {
slug: filename.replace('.mdx', ''),
title: data.title,
};
}
return null;
})
.filter(Boolean);
return NextResponse.json(results);
}
- このAPIルートを使用するための
components/Search.tsxに検索コンポーネントを作成してください。
より大きな庭園でより堅牢な検索体験のために、fuse.jsなどのライブラリの使用を検討してください。
結論
あなたは今、精神的な健康の旅のための美しく機能的なデジタル庭園の基礎を構築しました。これは生きたプロジェクトです—あなたの考えを育み、感情を理解し、成長するための空間です。
次のステップ:
- タグシステム:特定のタグを持つすべてのメモを一覧表示するページを作成します。
- ビジュアルグラフ:D3.jsやReact Flowなどのライブラリを探求して、メモがどのように接続されているかのビジュアル表現を作成します。
- パーソナライズ:あなたが本当にあなたのものであると感じさせる空間を作成するために、スタイリングをカスタマイズし続けます。
リソース
クイックリファレンス
| 側面 | 主要情報 |
|---|---|
| トピック | 開発 |
| 関連性 | 患者教育と意識向上 |
| アクション | 医療提供者との相談 |
| 頻度 | ケアチーム推奨的那样 |
| 科学的根拠 | 現在の臨床ガイドラインに基づく |
よくある質問
Q: これが自分に該当するどうかはどうすればわかりますか? A: あなたの個人的な病歴と家族歴について医療提供者と相談し、あなたの個人的なリスク要因を評価し、適切な次のステップを決定してください。
Q: 医師に何質問すべきですか? A: 良い質問には次のようなものがあります:「私の結果はどういう意味ですか?」「私のオプションは何ですか?」「どのようなライフスタイルの変化が役に立ちますか?」「いつフォローアップすべきですか?」
Q: 生活を改善する変化はありますか? A: ほとんどの健康状態は、基本的な対策の恩恵を受けます:バランスの取れた栄養、定期的な運動(週150分以上)、質の良い睡眠(7〜9時間)、ストレス管理、およびたばこの回避。
医療免責事項
この記事は教育目的のみを目的としており、医学的アドバイスを提供ものではありません。あなたの健康、治療、またはケアに関する決定する前に、常に資格のある医療提供者と相談してください。個々の状況は異なり、1人に適切なことが必ずしも別の人に適切なわけではありません。
救急医療の状況にある場合は、直ちに119番(またはあなたの地域の緊急電話番号)に連絡してください。