kyohei's blog

profile picture
Written by Kyohei Tsukuda who lives and works in Tokyo 🇯🇵 , building useful things 🔧.
email / facebook / X / GitHub

TypeScriptでimportを絶対パスの参照にする

January 19, 2022 - Next.js TypeScript

TypeScript で ES Module を import を絶対パスで参照するやり方です。

絶対パスで import 文を書くと以下のようになります。

import { Heading } from '../../../components/common/Typography';
import { UserTypes } from '../../../constants';

import { Heading } from '@/components/common/Typography';
import { UserTypes } from '@/constants';

そもそもなぜ絶対パスなのか?

メリットデメリットをまとめてみました。個人的にはおすすめではありますが、マストではないかもです。

メリット

デメリット


TypeScript での設定の仕方

Next.js(with TypeScript)で設定する場合、tsconfig の compilerOptions に import するルート位置とパスの略称を追加します。

paths には接頭辞となるシンボルを設定しています。今回は @/ を指定してますが、別のシンボルでも構いません。

逆にシンボルがない場合はライブラリや Node.js のモジュールと区別がつかなくなるため、利用できません。(webpack を利用する場合は優先順位があってシンボルなしでもできたような気もしますが・・)

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

TypeScript での設定は以上になります。jest や storybook を利用している場合は以下の追加の設定が必要です。

jest の設定

jest を実行する際にモジュールの@部分を変換します。

// jest.config.ts

export default {
  ...
  moduleNameMapper: {
    ...
    // importの@を解決
    '@/(.*)': '<rootDir>/src/$1'
  },
}

storybook の設定

storybook も同様にパスを解決するように設定します。

参考: https://github.com/storybookjs/storybook/issues/3916#issuecomment-871283551

// .storybook/main.js

const path = require('path');

module.exports = {
  ...
  webpackFinal: async config => {
    // importの@を解決
    config.resolve.alias = {
      ...config.resolve.alias,
      '@': path.resolve(__dirname, '../src')
    };

    return config;
  }
}