<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ディレクトリ構成 – AichiLog</title>
	<atom:link href="https://aichi.blog/tag/%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E6%A7%8B%E6%88%90/feed/" rel="self" type="application/rss+xml" />
	<link>https://aichi.blog</link>
	<description>学びて富み　富みて学ぶ</description>
	<lastBuildDate>Thu, 06 Feb 2025 15:29:37 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://aichi.blog/wp-content/uploads/2021/12/cropped-915AB649-D1E9-4810-9658-CB8CE1B605FD.JPEG-2-32x32.jpeg</url>
	<title>ディレクトリ構成 – AichiLog</title>
	<link>https://aichi.blog</link>
	<width>32</width>
	<height>32</height>
</image> 
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/>
<atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/>
<atom:link rel="hub" href="https://websubhub.com/hub"/>
<atom:link rel="self" href="https://aichi.blog/tag/%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E6%A7%8B%E6%88%90/feed/"/>
	<item>
		<title>Next.jsにおけるディレクトリ構成: デコロケーション vs コロケーション</title>
		<link>https://aichi.blog/nextjs-directory-structure-decolocation-vs-colocation/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=nextjs-directory-structure-decolocation-vs-colocation</link>
		
		<dc:creator><![CDATA[愛知郎]]></dc:creator>
		<pubDate>Mon, 23 Oct 2023 03:19:52 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[next.js]]></category>
		<category><![CDATA[ディレクトリ構成]]></category>
		<category><![CDATA[文法]]></category>
		<category><![CDATA[環境構築]]></category>
		<guid isPermaLink="false">https://aichi.blog/?p=3336</guid>

					<description><![CDATA[<p>Next.jsプロジェクトでのディレクトリ構成には大きく分けて「デコロケーション」と「コロケーション」の2つのアプローチがあります。 それぞれにはメリットとデメリットがあり、プロジェクトの規模やチームの作業スタイルによっ [&#8230;]</p>
<p>The post <a href="https://aichi.blog/nextjs-directory-structure-decolocation-vs-colocation/">Next.jsにおけるディレクトリ構成: デコロケーション vs コロケーション</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Next.jsプロジェクトでのディレクトリ構成には大きく分けて「デコロケーション」と「コロケーション」の2つのアプローチがあります。</p>



<p>それぞれにはメリットとデメリットがあり、プロジェクトの規模やチームの作業スタイルによって最適な選択が変わります。</p>



<p>今回は、これらの違いと使いどころをわかりやすく解説します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">デコロケーション（Decolocation）</a><ol><li><a href="#toc2" tabindex="0">概要と特徴</a></li><li><a href="#toc3" tabindex="0">具体的なディレクトリ構成</a></li><li><a href="#toc4" tabindex="0">メリットとデメリット</a></li></ol></li><li><a href="#toc5" tabindex="0">コロケーション</a><ol><li><a href="#toc6" tabindex="0">概要と特徴</a></li><li><a href="#toc7" tabindex="0">具体的なディレクトリ構成</a></li><li><a href="#toc8" tabindex="0">メリットとデメリット</a></li></ol></li><li><a href="#toc9" tabindex="0">結論: どちらを選ぶべきか？</a></li><li><a href="#toc10" tabindex="0">おまけ：デコロケーション、コロケーションの具体的なディレクトリ構成</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">デコロケーション（Decolocation）</span></h2>



<h3 class="wp-block-heading"><span id="toc2">概要と特徴</span></h3>



<p>デコロケーションでは、関連するリソース（コンポーネント、スタイル、テスト、APIなど）を別々のディレクトリに配置します。</p>



<p>これは、特に小規模なプロジェクトや、特定の種類のファイルを一箇所で一元管理したい場合に有用です。</p>



<h3 class="wp-block-heading"><span id="toc3">具体的なディレクトリ構成</span></h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="- src/
  - components/
  - pages/
  - styles/
  - tests/
  - api/
- docs/" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">- src/</span></span>
<span class="line"><span style="color: #D4D4D4">  - components/</span></span>
<span class="line"><span style="color: #D4D4D4">  - pages/</span></span>
<span class="line"><span style="color: #D4D4D4">  - styles/</span></span>
<span class="line"><span style="color: #D4D4D4">  - tests/</span></span>
<span class="line"><span style="color: #D4D4D4">  - api/</span></span>
<span class="line"><span style="color: #D4D4D4">- docs/</span></span></code></pre></div>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="// デコロケーション（機能別にディレクトリを配置）

src/
├─ features/
│   ├─ FeatureA.tsx           # 機能A
│   ├─ FeatureB.tsx           # 機能B
│   └─ SubComponent.tsx       # サブコンポーネント
│
├─ components/                # 共通コンポーネント
│   ├─ SharedComponent.tsx    # 共有コンポーネント
│   └─ ...
│
├─ styles/                    # スタイルファイル
│   ├─ FeatureA.styles.ts
│   ├─ SubComponent.styles.ts
│   ├─ SharedComponent.styles.ts
│   └─ ...
│
└─ tests/                     # テストファイル
    ├─ FeatureA.test.ts
    ├─ SubComponent.test.ts
    ├─ SharedComponent.test.ts
    └─ ..." style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// デコロケーション（機能別にディレクトリを配置）</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">src/</span></span>
<span class="line"><span style="color: #D4D4D4">├─ features/</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ </span><span style="color: #4EC9B0">FeatureA</span><span style="color: #D4D4D4">.tsx           # 機能</span><span style="color: #4EC9B0">A</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ </span><span style="color: #4EC9B0">FeatureB</span><span style="color: #D4D4D4">.tsx           # 機能</span><span style="color: #4EC9B0">B</span></span>
<span class="line"><span style="color: #D4D4D4">│   └─ </span><span style="color: #4EC9B0">SubComponent</span><span style="color: #D4D4D4">.tsx       # サブコンポーネント</span></span>
<span class="line"><span style="color: #D4D4D4">│</span></span>
<span class="line"><span style="color: #D4D4D4">├─ components/                # 共通コンポーネント</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ </span><span style="color: #4EC9B0">SharedComponent</span><span style="color: #D4D4D4">.tsx    # 共有コンポーネント</span></span>
<span class="line"><span style="color: #D4D4D4">│   └─ ...</span></span>
<span class="line"><span style="color: #D4D4D4">│</span></span>
<span class="line"><span style="color: #D4D4D4">├─ styles/                    # スタイルファイル</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ </span><span style="color: #4EC9B0">FeatureA</span><span style="color: #D4D4D4">.styles.ts</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ </span><span style="color: #4EC9B0">SubComponent</span><span style="color: #D4D4D4">.styles.ts</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ </span><span style="color: #4EC9B0">SharedComponent</span><span style="color: #D4D4D4">.styles.ts</span></span>
<span class="line"><span style="color: #D4D4D4">│   └─ ...</span></span>
<span class="line"><span style="color: #D4D4D4">│</span></span>
<span class="line"><span style="color: #D4D4D4">└─ tests/                     # テストファイル</span></span>
<span class="line"><span style="color: #D4D4D4">    ├─ </span><span style="color: #4EC9B0">FeatureA</span><span style="color: #D4D4D4">.test.ts</span></span>
<span class="line"><span style="color: #D4D4D4">    ├─ </span><span style="color: #4EC9B0">SubComponent</span><span style="color: #D4D4D4">.test.ts</span></span>
<span class="line"><span style="color: #D4D4D4">    ├─ </span><span style="color: #4EC9B0">SharedComponent</span><span style="color: #D4D4D4">.test.ts</span></span>
<span class="line"><span style="color: #D4D4D4">    └─ ...</span></span></code></pre></div>



<h3 class="wp-block-heading"><span id="toc4">メリットとデメリット</span></h3>



<h4 class="wp-block-heading">メリット</h4>



<ul class="wp-block-list">
<li><strong>一元管理</strong>: 同じ種類のファイルが一箇所にまとまっているため、一覧性が高く管理が容易です。</li>



<li><strong>小規模プロジェクト向け</strong>: プロジェクトが小規模であれば、この方法で十分に管理が行えます。</li>
</ul>



<h4 class="wp-block-heading">デメリット</h4>



<ul class="wp-block-list">
<li><strong>関連性が低い</strong>: 関連するファイルが物理的に離れているため、開発時に多くのディレクトリを行き来する必要があります。</li>



<li><strong>スケーラビリティの問題</strong>: プロジェクトが大きくなると、管理が煩雑になる可能性があります。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc5">コロケーション</span></h2>



<h3 class="wp-block-heading"><span id="toc6">概要と特徴</span></h3>



<p>コロケーションでは、関連するリソースを一箇所にまとめます。これにより、プロジェクトの可読性と保守性が向上します。特に大規模なプロジェクトや複数人での開発において有用です。</p>



<h3 class="wp-block-heading"><span id="toc7">具体的なディレクトリ構成</span></h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="- src/
  - pages/
    - Home/
  - components/
    - Button/
  - api/
    - User/" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">- src/</span></span>
<span class="line"><span style="color: #D4D4D4">  - pages/</span></span>
<span class="line"><span style="color: #D4D4D4">    - </span><span style="color: #4EC9B0">Home</span><span style="color: #D4D4D4">/</span></span>
<span class="line"><span style="color: #D4D4D4">  - components/</span></span>
<span class="line"><span style="color: #D4D4D4">    - </span><span style="color: #4EC9B0">Button</span><span style="color: #D4D4D4">/</span></span>
<span class="line"><span style="color: #D4D4D4">  - api/</span></span>
<span class="line"><span style="color: #D4D4D4">    - </span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4">/</span></span></code></pre></div>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="// コロケーション（関連するファイルを近くに配置）

src/
├─ features/
│   ├─ FeatureA.tsx           # 機能A
│   ├─ FeatureB.tsx           # 機能B
│   └─ SubComponent.tsx       # サブコンポーネント
│
├─ components/                # 共通コンポーネント
│   ├─ SharedComponent.tsx    # 共有コンポーネント
│   └─ ...
│
├─ styles/                    # スタイルファイル
│   ├─ FeatureA.styles.ts
│   ├─ SubComponent.styles.ts
│   ├─ SharedComponent.styles.ts
│   └─ ...
│
└─ tests/                     # テストファイル
    ├─ FeatureA.test.ts
    ├─ SubComponent.test.ts
    ├─ SharedComponent.test.ts
    └─ ...
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// コロケーション（関連するファイルを近くに配置）</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">src/</span></span>
<span class="line"><span style="color: #D4D4D4">├─ features/</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ </span><span style="color: #4EC9B0">FeatureA</span><span style="color: #D4D4D4">.tsx           # 機能</span><span style="color: #4EC9B0">A</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ </span><span style="color: #4EC9B0">FeatureB</span><span style="color: #D4D4D4">.tsx           # 機能</span><span style="color: #4EC9B0">B</span></span>
<span class="line"><span style="color: #D4D4D4">│   └─ </span><span style="color: #4EC9B0">SubComponent</span><span style="color: #D4D4D4">.tsx       # サブコンポーネント</span></span>
<span class="line"><span style="color: #D4D4D4">│</span></span>
<span class="line"><span style="color: #D4D4D4">├─ components/                # 共通コンポーネント</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ </span><span style="color: #4EC9B0">SharedComponent</span><span style="color: #D4D4D4">.tsx    # 共有コンポーネント</span></span>
<span class="line"><span style="color: #D4D4D4">│   └─ ...</span></span>
<span class="line"><span style="color: #D4D4D4">│</span></span>
<span class="line"><span style="color: #D4D4D4">├─ styles/                    # スタイルファイル</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ </span><span style="color: #4EC9B0">FeatureA</span><span style="color: #D4D4D4">.styles.ts</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ </span><span style="color: #4EC9B0">SubComponent</span><span style="color: #D4D4D4">.styles.ts</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ </span><span style="color: #4EC9B0">SharedComponent</span><span style="color: #D4D4D4">.styles.ts</span></span>
<span class="line"><span style="color: #D4D4D4">│   └─ ...</span></span>
<span class="line"><span style="color: #D4D4D4">│</span></span>
<span class="line"><span style="color: #D4D4D4">└─ tests/                     # テストファイル</span></span>
<span class="line"><span style="color: #D4D4D4">    ├─ </span><span style="color: #4EC9B0">FeatureA</span><span style="color: #D4D4D4">.test.ts</span></span>
<span class="line"><span style="color: #D4D4D4">    ├─ </span><span style="color: #4EC9B0">SubComponent</span><span style="color: #D4D4D4">.test.ts</span></span>
<span class="line"><span style="color: #D4D4D4">    ├─ </span><span style="color: #4EC9B0">SharedComponent</span><span style="color: #D4D4D4">.test.ts</span></span>
<span class="line"><span style="color: #D4D4D4">    └─ ...</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading"><span id="toc8">メリットとデメリット</span></h3>



<h4 class="wp-block-heading">メリット</h4>



<ul class="wp-block-list">
<li><strong>可読性</strong>: 関連するファイルが近くにあるため、コードの流れが理解しやすい。</li>



<li><strong>保守性</strong>: 一箇所にまとまっているため、変更やリファクタリングが容易です。</li>



<li><strong>開発速度</strong>: ファイルの行き来が減少し、開発がスムーズに行えます。</li>
</ul>



<h4 class="wp-block-heading">デメリット</h4>



<ul class="wp-block-list">
<li><strong>複雑性</strong>: 大規模なプロジェクトで多くの関連ファイルが一箇所に集まると、そのディレクトリ自体が複雑になる可能性があります。</li>



<li><strong>ファイル探索</strong>: 関連ファイルが多い場合、特定のファイルを見つけるのが少し難しくなるかもしれません。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc9">結論: どちらを選ぶべきか？</span></h2>



<ul class="wp-block-list">
<li><strong>小規模プロジェクト</strong>: デコロケーションが適しています。管理がシンプルで、必要なリソースがすぐに見つかります。</li>



<li><strong>大規模プロジェクトや複数人での開発</strong>: コロケーションが有用です。可読性と保守性が高く、開発効率も向上します。</li>
</ul>



<p>プロジェクトの規模、チームの作業スタイル、将来のスケーラビリティなどを考慮して、最適なディレクトリ構成を選びましょう。</p>



<h2 class="wp-block-heading"><span id="toc10">おまけ：デコロケーション、コロケーションの具体的なディレクトリ構成</span></h2>



<p>最後に、Todoアプリを作成する場合のディレクトリ構成を、デコロケーション、コロケーションをもちいて作成します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="// デコロケーション

src/
├─ pages/                         # ページコンポーネント
│   ├─ HomePage.tsx               # ホームページ
│   ├─ TodoListPage.tsx           # Todoリストページ
│   └─ AboutPage.tsx              # アバウトページ
│
├─ components/                    # 共通コンポーネント
│   ├─ Navbar/                    # ナビゲーションバー
│   │   ├─ index.tsx
│   │   ├─ index.module.css
│   │   └─ ...
│   ├─ TodoItem/                  # Todo項目コンポーネント
│   │   ├─ index.tsx
│   │   ├─ index.module.css
│   │   └─ ...
│   └─ Button/                    # ボタンコンポーネント
│       ├─ index.tsx
│       ├─ index.module.css
│       └─ ...
│
├─ styles/                        # スタイルファイル
│   ├─ common.module.css          # 共通スタイル
│   └─ ...
│
└─ types/                         # 型定義ファイル
    ├─ commonTypes.ts             # 共通型定義
    └─ ...
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// デコロケーション</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">src/</span></span>
<span class="line"><span style="color: #D4D4D4">├─ pages/                         # ページコンポーネント</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ </span><span style="color: #4EC9B0">HomePage</span><span style="color: #D4D4D4">.tsx               # ホームページ</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ </span><span style="color: #4EC9B0">TodoListPage</span><span style="color: #D4D4D4">.tsx           # Todoリストページ</span></span>
<span class="line"><span style="color: #D4D4D4">│   └─ </span><span style="color: #4EC9B0">AboutPage</span><span style="color: #D4D4D4">.tsx              # アバウトページ</span></span>
<span class="line"><span style="color: #D4D4D4">│</span></span>
<span class="line"><span style="color: #D4D4D4">├─ components/                    # 共通コンポーネント</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ </span><span style="color: #4EC9B0">Navbar</span><span style="color: #D4D4D4">/                    # ナビゲーションバー</span></span>
<span class="line"><span style="color: #D4D4D4">│   │   ├─ index.tsx</span></span>
<span class="line"><span style="color: #D4D4D4">│   │   ├─ index.module.css</span></span>
<span class="line"><span style="color: #D4D4D4">│   │   └─ ...</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ </span><span style="color: #4EC9B0">TodoItem</span><span style="color: #D4D4D4">/                  # Todo項目コンポーネント</span></span>
<span class="line"><span style="color: #D4D4D4">│   │   ├─ index.tsx</span></span>
<span class="line"><span style="color: #D4D4D4">│   │   ├─ index.module.css</span></span>
<span class="line"><span style="color: #D4D4D4">│   │   └─ ...</span></span>
<span class="line"><span style="color: #D4D4D4">│   └─ </span><span style="color: #4EC9B0">Button</span><span style="color: #D4D4D4">/                    # ボタンコンポーネント</span></span>
<span class="line"><span style="color: #D4D4D4">│       ├─ index.tsx</span></span>
<span class="line"><span style="color: #D4D4D4">│       ├─ index.module.css</span></span>
<span class="line"><span style="color: #D4D4D4">│       └─ ...</span></span>
<span class="line"><span style="color: #D4D4D4">│</span></span>
<span class="line"><span style="color: #D4D4D4">├─ styles/                        # スタイルファイル</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ common.module.css          # 共通スタイル</span></span>
<span class="line"><span style="color: #D4D4D4">│   └─ ...</span></span>
<span class="line"><span style="color: #D4D4D4">│</span></span>
<span class="line"><span style="color: #D4D4D4">└─ types/                         # 型定義ファイル</span></span>
<span class="line"><span style="color: #D4D4D4">    ├─ commonTypes.ts             # 共通型定義</span></span>
<span class="line"><span style="color: #D4D4D4">    └─ ...</span></span>
<span class="line"></span></code></pre></div>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="// コロケーション

app/
├─ (root)/                   # ドメインルート用ディレクトリ
│   ├─ page.tsx             # ドメインルートのページ
│   ├─ _components/          # ドメインルート専用のコンポーネント
│   │   └─ Navbar/           # ナビゲーションバー用コンポーネント
│   │       ├─ index.tsx
│   │       ├─ index.module.css
│   │       └─ ...
│   └─ _types/               # ドメインルート専用の型定義
│       └─ types.ts
│
├─ TodoList/                 # Todoリストページ用ディレクトリ
│   ├─ page.tsx             # Todoリストのページ
│   ├─ _components/          # Todoリスト専用のコンポーネント
│   │   ├─ TodoItem/         # 各Todo項目用コンポーネント
│   │   │   ├─ index.tsx
│   │   │   ├─ index.module.css
│   │   │   └─ ...
│   │   └─ ...
│   └─ _types/               # Todoリスト専用の型定義
│       └─ types.ts
│
├─ About/                    # アバウトページ用ディレクトリ
│   └─ page.tsx             # アバウトページ
│
components/                   # 共通コンポーネント用ディレクトリ
├─ Button/                    # 汎用ボタンコンポーネント
│   ├─ page.tsx
│   ├─ index.module.css
│   └─ ...
│
types/                        # 全体的な型定義用ディレクトリ
└─ globalTypes.ts             # アプリ全体で使用する型定義
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// コロケーション</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">app/</span></span>
<span class="line"><span style="color: #D4D4D4">├─ (root)/                   # ドメインルート用ディレクトリ</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ page.tsx             # ドメインルートのページ</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ _components/          # ドメインルート専用のコンポーネント</span></span>
<span class="line"><span style="color: #D4D4D4">│   │   └─ </span><span style="color: #4EC9B0">Navbar</span><span style="color: #D4D4D4">/           # ナビゲーションバー用コンポーネント</span></span>
<span class="line"><span style="color: #D4D4D4">│   │       ├─ index.tsx</span></span>
<span class="line"><span style="color: #D4D4D4">│   │       ├─ index.module.css</span></span>
<span class="line"><span style="color: #D4D4D4">│   │       └─ ...</span></span>
<span class="line"><span style="color: #D4D4D4">│   └─ _types/               # ドメインルート専用の型定義</span></span>
<span class="line"><span style="color: #D4D4D4">│       └─ types.ts</span></span>
<span class="line"><span style="color: #D4D4D4">│</span></span>
<span class="line"><span style="color: #D4D4D4">├─ </span><span style="color: #4EC9B0">TodoList</span><span style="color: #D4D4D4">/                 # Todoリストページ用ディレクトリ</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ page.tsx             # Todoリストのページ</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ _components/          # Todoリスト専用のコンポーネント</span></span>
<span class="line"><span style="color: #D4D4D4">│   │   ├─ </span><span style="color: #4EC9B0">TodoItem</span><span style="color: #D4D4D4">/         # 各Todo項目用コンポーネント</span></span>
<span class="line"><span style="color: #D4D4D4">│   │   │   ├─ index.tsx</span></span>
<span class="line"><span style="color: #D4D4D4">│   │   │   ├─ index.module.css</span></span>
<span class="line"><span style="color: #D4D4D4">│   │   │   └─ ...</span></span>
<span class="line"><span style="color: #D4D4D4">│   │   └─ ...</span></span>
<span class="line"><span style="color: #D4D4D4">│   └─ _types/               # Todoリスト専用の型定義</span></span>
<span class="line"><span style="color: #D4D4D4">│       └─ types.ts</span></span>
<span class="line"><span style="color: #D4D4D4">│</span></span>
<span class="line"><span style="color: #D4D4D4">├─ </span><span style="color: #4EC9B0">About</span><span style="color: #D4D4D4">/                    # アバウトページ用ディレクトリ</span></span>
<span class="line"><span style="color: #D4D4D4">│   └─ page.tsx             # アバウトページ</span></span>
<span class="line"><span style="color: #D4D4D4">│</span></span>
<span class="line"><span style="color: #D4D4D4">components/                   # 共通コンポーネント用ディレクトリ</span></span>
<span class="line"><span style="color: #D4D4D4">├─ </span><span style="color: #4EC9B0">Button</span><span style="color: #D4D4D4">/                    # 汎用ボタンコンポーネント</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ page.tsx</span></span>
<span class="line"><span style="color: #D4D4D4">│   ├─ index.module.css</span></span>
<span class="line"><span style="color: #D4D4D4">│   └─ ...</span></span>
<span class="line"><span style="color: #D4D4D4">│</span></span>
<span class="line"><span style="color: #D4D4D4">types/                        # 全体的な型定義用ディレクトリ</span></span>
<span class="line"><span style="color: #D4D4D4">└─ globalTypes.ts             # アプリ全体で使用する型定義</span></span>
<span class="line"></span></code></pre></div>



<p></p><p>The post <a href="https://aichi.blog/nextjs-directory-structure-decolocation-vs-colocation/">Next.jsにおけるディレクトリ構成: デコロケーション vs コロケーション</a> first appeared on <a href="https://aichi.blog">AichiLog</a>.</p>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
