【Next.js+TypeScript】import @で階層が深いモジュールのインポートを簡潔に書く方法【Module Path Mapping】

2022-05-15
Main Image

目次

こんにちは。

今回はディレクトリの構造が複雑になったNext.js+TypeScriptのアプリケーションにおいて、モジュールインポートを簡単に書く方法をまとめておきます。

TypeScriptによる解決策なので、Next.jsでなくとも使える方法です。

【結論】tsconfig.jsonを編集する

以下のようにtsconfig.jsの中に書きます。pathsの中身は自分のディレクトリ構造に応じて編集すればOKです。

tsconfig.jsonの書き方

{
  "compilerOptions": {
    ...
    "baseUrl": ".",
    "paths": {
      "@/components/*": ["components/*"],
      "@/lib/*": ["lib/*"],
      ...
    }
  },
  ...
}

importする側の使用例

ルートディレクトリから見てcomponents/hoge.tsからHogeをimportする場合

import { Hoge } from "@/components/hoge"

今までの問題点 : 階層が深いとimport {} from '../../' が長くなってしまう

大規模なアプリを作っていると、関数やコンポーネントはモジュールとして別ファイルに切り離すのが普通です。これはES2015からJavaScriptの仕様に入ったES Modulesと呼ばれる仕組みで容易になりました。ES ModulesはJSから別のJSファイルの読み込みを可能にするexportimport構文によるモジュールの仕組みです。

参考 : MDN Web Docs | JavaScript モジュール

個々の役割を持つモジュールファイルはcomponentslibなど役割に応じて別のディレクトリに置くことで、構造の見通しがよくなり、管理・編集がしやすくなります。

しかし、ディレクトリの階層が深くなっていくにつれ、他のディレクトリからimportしたい場合、以下のようにimportのパスが長くなってしまいます。

import { Hoge } from "../../../../components/hoge"

これだと、新たにモジュールをインポートしたい場合、非常に面倒で読みにくいです。別の階層に同じ名前のディレクトリがある場合は、間違えてインポートしてバグになりかねません。

tsconfigのbaseUrlとpathsでインポートパスを簡潔に書く

そこでTypeScriptのモジュール解決にはPath mappingという機能を使うと、パスを短く簡潔に書くことができるようになります。

tsconfig.jsonのコンパイラオプションに、以下のような書き方で使用します。

{
  "compilerOptions": {
    "baseUrl": ".", // pathsを書く場合は必須
    "paths": {
      "hoge": ["components/model/hoge"] // baseUrlを基点として相対パスで書く
    }
  }
}

参考 : TypeScript | Module Resolution

baseUrl

pathsの基点となる相対パスを書きます。

.はカレントディレクトリで、つまりこの場合tsconfig.jsonが置かれているディレクトリパスを指します。

すべてsrcというディレクトリを基点にしたい場合は、./srcとします。

paths

ここにインポートパスのマッピングを書くことができます。baseUrlを基点とした相対パスで書きます。

"paths": {
  "@/components/*": ["components/*"],
}

*はワイルドカードで、すべてのファイル・ディレクトリを指します。

@などの目印をつけておくことで、importするファイルを読むときに「tsconfigで指定したルートディレクトリからインポートしているんだな」とわかるよう明示できます。

import { Hoge } from "./components/hoge" // 同一ディレクトリを見ている
import { Hoge } from "@/components/hoge" // ルートディレクトリを見ている

(そもそも、こんなにややこしい構成・命名にしないのが、第一だと思います)

まとめ

というわけで今回はディレクトリ階層が深くなってimportパスが長くなってしまった場合の対処法をまとめてみました。

tsconfigの設定のひとつとして、baseUrlpathsを使うことで、インポート側にスマートにパスを書くことができるようになります。

プログラミングTypeScript ―スケールするJavaScriptアプリケーション開発

ads【オススメ】未経験からプログラマーへ転職できる【GEEK JOBキャンプ】
▼ Amazonオススメ商品
ディスプレイライト デスクライト BenQ ScreenBar モニター掛け式
スマートLEDフロアライト 間接照明 Alexa/Google Home対応

Author

Penta

都内で働くITエンジニアもどき。好きなものは音楽・健康・貯金・シンプルでミニマルな暮らし。AWSクラウドやデータサイエンスを勉強中。学んだことや体験談をのんびり書いてます。TypeScript / Next.js / React / Python / AWS / インデックス投資 / 高配当株投資 More profile

Location : Tokyo, JPN

Contact : Twitter@penguinchord

Recommended Posts

Copy Right / Penguin Chord, ペンギンコード (penguinchord.com) 2022 / Twitter@penguinchord